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);
gelado
fonte
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);
}
Wolfwyrd
fonte
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);
Andre Figueiredo
fonte
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;
tinamou
fonte
3

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

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

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

xpfans
fonte
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();
Jodda
fonte