Cómo crear una matriz de bytes desde HttpPostedFile

155

Estoy usando un componente de imagen que tiene un método FromBinary. Me pregunto cómo convierto mi flujo de entrada en una matriz de bytes

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

ImageElement image = ImageElement.FromBinary(byteArray);
escarchado
fuente
¿Cómo estamos publicando el archivo en otra página .aspx?
shivi
¿No esta línea file.InputStream.Read (buffer, 0, file.ContentLength); llenar el búfer con bytes de la secuencia de entrada? ¿Por qué deberíamos usar BinaryReader.ReadBytes (...) como lo menciona @Wolfwyrd en la respuesta a continuación? No se ImageElement.FromBinary (buffer); ¿arreglar el problema?
Srinidhi Shankar

Respuestas:

290

Use un objeto BinaryReader para devolver una matriz de bytes de la secuencia como:

byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
Wolfwyrd
fuente
1
Como se menciona a continuación por jeff, b.ReadBytes (file.InputStream.Length); debe ser byte [] binData = b.ReadBytes (file.ContentLength); como .Length es largo mientras que ReadBytes espera un int.
Spongeboy
Recuerde cerrar el BinaryReader.
Chris Dwyer
Trabajar como un encanto. ¡Gracias por esta solución simple (con los comentarios de Jeff, Spongeboy y Chris)!
David
29
El lector binario no tiene que estar cerrado, porque hay un uso que cierra automáticamente el lector al desecharlo
BeardinaSuit
1
¿Alguna idea de por qué esto no funcionaría para un archivo .docx? stackoverflow.com/questions/19232932/…
wilsjd
25
BinaryReader b = new BinaryReader(file.InputStream);
byte[] binData = b.ReadBytes(file.InputStream.Length);

la línea 2 debe reemplazarse con

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

No funcionará si su archivo InputStream.Position está configurado al final de la secuencia. Mis líneas adicionales:

Stream stream = file.InputStream;
stream.Position = 0;
tinamou
fuente
3

en su pregunta, tanto el búfer como el byteArray parecen ser byte []. Entonces:

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

antes de stream.copyto, debe restablecer stream.position a 0; entonces funciona bien.

xpfans
fuente
2

Para imágenes si está utilizando las páginas web v2, use la clase WebImage

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