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