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

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

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

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;

3

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

ImageElement image = ImageElement.FromBinary(buffer);

2

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


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();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.