web-dev-qa-db-fra.com

Convertir HttpPostedFileBase en octet []

Dans mon application MVC, j'utilise le code suivant pour télécharger un fichier.

MODÈLE

 public HttpPostedFileBase File { get; set; }

VOIR

@Html.TextBoxFor(m => m.File, new { type = "file" })

Tout fonctionne bien .. Mais j'essaie de convertir le résultat en octet [] .Comment puis-je faire cela?

contrôleur [~ # ~] [~ # ~]

 public ActionResult ManagePhotos(ManagePhotos model)
    {
        if (ModelState.IsValid)
        {
            byte[] image = model.File; //Its not working .How can convert this to byte array
        }
     }
113
Null Pointer

Comme Darin le dit, vous pouvez lire à partir du flux d'entrée - mais j'éviterais de compter sur toutes les données disponibles en une seule fois. Si vous utilisez .NET 4, c'est simple:

MemoryStream target = new MemoryStream();
model.File.InputStream.CopyTo(target);
byte[] data = target.ToArray();

Il est assez facile d'écrire l'équivalent de CopyTo dans .NET 3.5 si vous le souhaitez. La partie importante est que vous lisiez à partir de HttpPostedFileBase.InputStream .

Pour des raisons d'efficacité, vous pourriez vérifier si le flux renvoyé est déjà un MemoryStream:

byte[] data;
using (Stream inputStream = model.File.InputStream)
{
    MemoryStream memoryStream = inputStream as MemoryStream;
    if (memoryStream == null)
    {
        memoryStream = new MemoryStream();
        inputStream.CopyTo(memoryStream);
    }
    data = memoryStream.ToArray();
}
242
Jon Skeet

Vous pouvez le lire depuis le flux d'entrée:

public ActionResult ManagePhotos(ManagePhotos model)
{
    if (ModelState.IsValid)
    {
        byte[] image = new byte[model.File.ContentLength];
        model.File.InputStream.Read(image, 0, image.Length); 

        // TODO: Do something with the byte array here
    }
    ...
}

Et si vous souhaitez enregistrer directement le fichier sur le disque, vous pouvez utiliser le fichier model.File.SaveAs méthode. Vous pourriez trouver le blog suivant utile.

26
Darin Dimitrov