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);

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);
}

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);

12

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

Stream stream = file.InputStream;
stream.Position = 0;

3

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

ImageElement image = ImageElement.FromBinary(buffer);

2

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


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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.