Come creare una matrice di byte da HttpPostedFile


155

Sto usando un componente di immagine che ha un metodo FromBinary. Mi chiedo come posso convertire il mio flusso di input in un array di byte

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

ImageElement image = ImageElement.FromBinary(byteArray);

come stiamo postando il file in un'altra pagina aspx?
shivi,

Questa riga non è file.InputStream.Read (buffer, 0, file.ContentLength); riempire il buffer con byte dal flusso di input? Perché dovremmo usare BinaryReader.ReadBytes (...) come indicato da @Wolfwyrd nella risposta qui sotto? Won't ImageElement.FromBinary (buffer); risolvi il problema?
Srinidhi Shankar,

Risposte:


290

Utilizzare un oggetto BinaryReader per restituire una matrice di byte dal flusso come:

byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}

1
Come menzionato sotto da jeff, b.ReadBytes (file.InputStream.Length); dovrebbe essere byte [] binData = b.ReadBytes (file.ContentLength); come .Length è un lungo mentre ReadBytes prevede un int.
Spongeboy,

Ricorda di chiudere BinaryReader.
Chris Dwyer,

Lavora come un fascino. Grazie per questa semplice soluzione (con i commenti di Jeff, Spongeboy e Chris)!
David,

29
Il lettore binario non deve essere chiuso, perché esiste un utilizzo che sta chiudendo automaticamente il lettore a disposizione
BeardinaSuit

1
Qualche idea sul perché questo non funzionerebbe per un file .docx? stackoverflow.com/questions/19232932/...
wilsjd

25
BinaryReader b = new BinaryReader(file.InputStream);
byte[] binData = b.ReadBytes(file.InputStream.Length);

la riga 2 deve essere sostituita con

byte[] binData = b.ReadBytes(file.ContentLength);

12

Non funzionerà se il file InputStream.Position è impostato alla fine del flusso. Le mie righe aggiuntive:

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

3

nella tua domanda, sia buffer che byteArray sembrano essere byte []. Così:

ImageElement image = ImageElement.FromBinary(buffer);

2

prima di stream.copyto, è necessario reimpostare stream.position su 0; allora funziona benissimo.


2

Per le immagini se si utilizzano pagine Web v2, utilizzare la classe WebImage

var webImage = new System.Web.Helpers.WebImage(Request.Files[0].InputStream);
byte[] imgByteArray = webImage.GetBytes();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.