Jak utworzyć tablicę bajtów z HttpPostedFile

155

Używam składnika obrazu, który ma metodę FromBinary. Zastanawiasz się, jak przekonwertować strumień wejściowy na tablicę bajtów

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

ImageElement image = ImageElement.FromBinary(byteArray);
mroźny
źródło
w jaki sposób publikujemy plik na innej stronie .aspx?
shivi
Czy ten wiersz nie jest file.InputStream.Read (buffer, 0, file.ContentLength); wypełnić bufor bajtami ze strumienia wejściowego? Dlaczego powinniśmy używać BinaryReader.ReadBytes (...), jak wspomniał @Wolfwyrd w odpowiedzi poniżej? Nie będzie ImageElement.FromBinary (bufor); naprawić problem?
Srinidhi Shankar

Odpowiedzi:

290

Użyj obiektu BinaryReader, aby zwrócić tablicę bajtów ze strumienia, na przykład:

byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
Wolfwyrd
źródło
1
Jak wspomniano poniżej przez jeffa, b.ReadBytes (file.InputStream.Length); powinno być bajtowe [] binData = b.ReadBytes (file.ContentLength); ponieważ .Length jest długa, podczas gdy ReadBytes oczekuje int.
Spongeboy
Pamiętaj, aby zamknąć BinaryReader.
Chris Dwyer
Działa jak urok. Dziękuję za to proste rozwiązanie (z komentarzami jeffa, Spongeboya i Chrisa)!
David
29
Czytnik binarny nie musi być zamykany, ponieważ istnieje zastosowanie, które automatycznie zamyka czytnik do dyspozycji
BeardinaSuit
1
Masz jakiś pomysł, dlaczego to nie zadziała w przypadku pliku .docx? stackoverflow.com/questions/19232932/ ...
wilsjd
25
BinaryReader b = new BinaryReader(file.InputStream);
byte[] binData = b.ReadBytes(file.InputStream.Length);

wiersz 2 należy zastąpić

byte[] binData = b.ReadBytes(file.ContentLength);
Andre Figueiredo
źródło
12

Nie zadziała, jeśli plik InputStream.Position jest ustawiony na koniec strumienia. Moje dodatkowe linie:

Stream stream = file.InputStream;
stream.Position = 0;
tinamou
źródło
3

w twoim pytaniu zarówno bufor, jak i byteArray wydają się być bajtem []. Więc:

ImageElement image = ImageElement.FromBinary(buffer);
devio
źródło
2

przed stream.copyto, musisz zresetować stream.position do 0; to działa dobrze.

xpfans
źródło
2

W przypadku obrazów, jeśli używasz stron internetowych v2, użyj klasy WebImage

var webImage = new System.Web.Helpers.WebImage(Request.Files[0].InputStream);
byte[] imgByteArray = webImage.GetBytes();
Jodda
źródło