Comment créer un tableau d'octets à partir de HttpPostedFile

155

J'utilise un composant d'image qui a une méthode FromBinary. Vous vous demandez comment convertir mon flux d'entrée en un tableau d'octets

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

ImageElement image = ImageElement.FromBinary(byteArray);
glacial
la source
comment publions-nous le fichier dans une autre page .aspx?
shivi
Ne cette ligne file.InputStream.Read (buffer, 0, file.ContentLength); remplir le tampon avec des octets du flux d'entrée? Pourquoi devrions-nous utiliser BinaryReader.ReadBytes (...) comme mentionné par @Wolfwyrd dans la réponse ci-dessous? Ne sera pas ImageElement.FromBinary (tampon); résoudre le problème?
Srinidhi Shankar

Réponses:

290

Utilisez un objet BinaryReader pour renvoyer un tableau d'octets à partir du flux comme:

byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
Wolfwyrd
la source
1
Comme mentionné ci-dessous par jeff, b.ReadBytes (file.InputStream.Length); doit être byte [] binData = b.ReadBytes (file.ContentLength); car .Length est long alors que ReadBytes attend un int.
Spongeboy
N'oubliez pas de fermer le BinaryReader.
Chris Dwyer le
Travaillez comme un charme. Merci pour cette solution simple (avec les commentaires de jeff, Spongeboy et Chris)!
David
29
Le lecteur binaire n'a pas besoin d'être fermé, car il y a une utilisation qui ferme automatiquement le lecteur lors de la mise au rebut
BeardinaSuit
1
Une idée sur pourquoi cela ne fonctionnerait pas pour un fichier .docx? stackoverflow.com/questions/19232932/…
wilsjd
25
BinaryReader b = new BinaryReader(file.InputStream);
byte[] binData = b.ReadBytes(file.InputStream.Length);

la ligne 2 doit être remplacée par

byte[] binData = b.ReadBytes(file.ContentLength);
André Figueiredo
la source
12

Cela ne fonctionnera pas si votre fichier InputStream.Position est défini à la fin du flux. Mes lignes supplémentaires:

Stream stream = file.InputStream;
stream.Position = 0;
Tinamou
la source
3

dans votre question, buffer et byteArray semblent être byte []. Alors:

ImageElement image = ImageElement.FromBinary(buffer);
devio
la source
2

avant stream.copyto, vous devez réinitialiser stream.position à 0; alors ça marche bien.

xpfans
la source
2

Pour les images si vous utilisez des pages Web v2, utilisez la classe WebImage

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