Como criar uma matriz de bytes a partir do HttpPostedFile


155

Estou usando um componente de imagem que possui um método FromBinary. Pensando em como converter meu fluxo de entrada em uma 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);

como estamos postando o arquivo em outra página .aspx?
Shivi

Não esta linha file.InputStream.Read (buffer, 0, file.ContentLength); preencher o buffer com bytes do fluxo de entrada? Por que devemos usar BinaryReader.ReadBytes (...) como mencionado por @Wolfwyrd na resposta abaixo? Não será ImageElement.FromBinary (buffer); corrigir o problema?
Srinidhi Shankar

Respostas:


290

Use um objeto BinaryReader para retornar uma matriz de bytes do fluxo, como:

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

1
Conforme mencionado abaixo por jeff, b.ReadBytes (file.InputStream.Length); deve ser byte [] binData = b.ReadBytes (file.ContentLength); como .Length é longo, enquanto ReadBytes espera um int.
Spongeboy

Lembre-se de fechar o BinaryReader.
Chris Dwyer

Trabalhe como um encanto. Obrigado por esta solução simples (com os comentários de jeff, Spongeboy e Chris)!
David

29
Leitor de binário não tem de ser fechada, porque há uma utilização que é automaticamente fechar o leitor na alienação
BeardinaSuit

1
Alguma idéia de por que isso não funcionaria para um arquivo .docx? stackoverflow.com/questions/19232932/…
wilsjd

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

a linha 2 deve ser substituída por

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

12

Não funcionará se o seu arquivo InputStream.Position estiver definido no final do fluxo. Minhas linhas adicionais:

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

3

na sua pergunta, buffer e byteArray parecem ser byte []. Assim:

ImageElement image = ImageElement.FromBinary(buffer);

2

antes de stream.copyto, você deve redefinir stream.position para 0; então funciona bem.


2

Para imagens, se você estiver usando Páginas da Web v2, use a Classe WebImage

var webImage = new System.Web.Helpers.WebImage(Request.Files[0].InputStream);
byte[] imgByteArray = webImage.GetBytes();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.