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

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

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

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;

3

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

ImageElement image = ImageElement.FromBinary(buffer);

2

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


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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.