Frage

I haben eine Funktion, die eine Datei in ein Byte-Array Extrakten (Daten).

        int contentLength = postedFile.ContentLength;
        byte[] data = new byte[contentLength];
        postedFile.InputStream.Read(data, 0, contentLength);

Später Ich benutze diesen Byte-Array ein System.Drawing.Image Objekt zu konstruieren (Wo Daten sind der Byte-Array)

       MemoryStream ms = new MemoryStream(data);
       Image bitmap = Image.FromStream(ms);

Ich erhalte die folgende Ausnahme "Argument: Parameter nicht gültig ist."

Das Original geschrieben Datei enthielt ein 500k-JPEG-Bild ...

Irgendwelche Ideen, warum dies nicht funktioniert?

Hinweis: Ich versichere Ihnen, ich einen wichtigen Grund haben zu einem Byte-Array konvertiert und dann in einen Memorystream !!

War es hilfreich?

Lösung

Das ist sehr wahrscheinlich, weil Sie nicht alle Dateidaten in das Byte-Array erhalten haben. Die Read-Methode haben nicht so viele Bytes zurück, wie Sie verlangen, und es gibt die Anzahl der Bytes, die tatsächlich in dem Feld setzen. Sie müssen Schleife, bis Sie alle Daten bekommen haben:

int contentLength = postedFile.ContentLength;
byte[] data = new byte[contentLength];
for (int pos = 0; pos < contentLength; ) {
   pos += postedFile.InputStream.Read(data, pos, contentLength - pos);
}

Dies ist ein häufiger Fehler, wenn sie von einem Strom zu lesen. Ich habe dieses Problem viele Male gesehen.

Edit:
Mit der Prüfung auf ein baldiges Ende des Stromes, wie Matthew vorgeschlagen, würde der Code:

int contentLength = postedFile.ContentLength;
byte[] data = new byte[contentLength];
for (int pos = 0; pos < contentLength; ) {
   int len = postedFile.InputStream.Read(data, pos, contentLength - pos);
   if (len == 0) {
      throw new ApplicationException("Upload aborted.");
   }
   pos += len;
}

Andere Tipps

Sie sind nicht den Rückgabewert von postedFile.InputStream zu überprüfen. Lesen Sie . Es ist nicht überhaupt garantiert das Array auf dem ersten Aufruf zu füllen. Das wird eine beschädigte JPEG in Daten (0'en statt Dateiinhalt) verlassen.

Haben Sie den Rückgabewert der Read geprüft () aufrufen, zu überprüfen, ob tatsächlich alle Inhalte zu lesen? Vielleicht Read () wird nur ein Teil des Stroms zurückkehrt, die Sie auffordert, eine Schleife, die Read () -Aufruf, bis alle Bytes verbraucht werden.

Gibt es Gründe, warum Sie dies nicht einfach tun:

Image bitmap = Image.FromStream(postedFile.InputStream);

Ich habe Probleme beim Laden Bilder in .NET hat, die durch robustere Bildbibliotheken zu öffnende waren. Es ist möglich, dass das spezifische JPEG-Bild Sie haben nicht von .NET unterstützt wird. JPEG-Dateien sind nicht nur eine Art von Codierung, gibt es eine Vielzahl von möglichen Kompressionsverfahren erlaubt.

Sie können es versuchen, mit einem anderen Bild, das Sie wissen, in einem unterstützten Format ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top