So erstellen Sie ein Byte-Array aus HttpPostedFile

154

Ich verwende eine Bildkomponente mit einer FromBinary-Methode. Ich frage mich, wie ich meinen Eingabestream in ein Byte-Array konvertieren kann

HttpPostedFile file = context.Request.Files[0];
byte[] buffer = new byte[file.ContentLength];
file.InputStream.Read(buffer, 0, file.ContentLength);

ImageElement image = ImageElement.FromBinary(byteArray);
eisig
quelle
Wie veröffentlichen wir die Datei auf einer anderen ASPX-Seite?
Shivi
Nicht diese Zeile file.InputStream.Read (buffer, 0, file.ContentLength); den Puffer mit Bytes aus dem Eingabestream füllen? Warum sollten wir BinaryReader.ReadBytes (...) verwenden, wie von @Wolfwyrd in der Antwort unten erwähnt? Wird nicht ImageElement.FromBinary (Puffer); das Problem lösen?
Srinidhi Shankar

Antworten:

289

Verwenden Sie ein BinaryReader-Objekt, um ein Byte-Array aus dem Stream zurückzugeben:

byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
Wolfwyrd
quelle
1
Wie unten von jeff erwähnt, b.ReadBytes (file.InputStream.Length); sollte byte sein [] binData = b.ReadBytes (file.ContentLength); as .Length ist lang, während ReadBytes ein int erwartet.
SpongeBoy
Denken Sie daran, den BinaryReader zu schließen.
Chris Dwyer
Arbeite wie ein Zauber. Vielen Dank für diese einfache Lösung (mit den Kommentaren von Jeff, Spongeboy und Chris)!
David
29
Der binäre Leser muss nicht geschlossen werden, da es eine Verwendung gibt, die den Leser bei der Entsorgung automatisch schließt
BeardinaSuit
1
Irgendeine Idee, warum dies für eine DOCX-Datei nicht funktionieren würde? stackoverflow.com/questions/19232932/…
wilsjd
25
BinaryReader b = new BinaryReader(file.InputStream);
byte[] binData = b.ReadBytes(file.InputStream.Length);

Zeile 2 sollte durch ersetzt werden

byte[] binData = b.ReadBytes(file.ContentLength);
Andre Figueiredo
quelle
12

Es funktioniert nicht, wenn Ihre Datei InputStream.Position auf das Ende des Streams gesetzt ist. Meine zusätzlichen Zeilen:

Stream stream = file.InputStream;
stream.Position = 0;
Tinamou
quelle
3

In Ihrer Frage scheinen sowohl Buffer als auch ByteArray Byte [] zu sein. So:

ImageElement image = ImageElement.FromBinary(buffer);
devio
quelle
2

Vor stream.copyto müssen Sie stream.position auf 0 zurücksetzen. dann funktioniert es gut.

xpfans
quelle
2

Verwenden Sie für Bilder, wenn Sie Webseiten v2 verwenden, die WebImage-Klasse

var webImage = new System.Web.Helpers.WebImage(Request.Files[0].InputStream);
byte[] imgByteArray = webImage.GetBytes();
Jodda
quelle