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.