Ne peut pas convertir HttpPostedFileBase de Byte[]

J'ai un contrôleur qui prend en HttpPostedFileBase (un .jpg ou .png, etc.).

public ActionResult SaveImage(HttpPostedFileBase ImageData)
{
  //code
}

ImageData devient un System.Web.HttpPostedFileWrapper objet ayant les propriétés suivantes:

ContentLength: 71945
ContentType: "image/png"
FileName: "foo.png"
InputStream: {System.Web.HttpInputStream}

Je n'ai pas de problèmes de prendre les données images et convertir en une Image, puis la conversion de l'Image à un byte [], puis à une chaîne base64 - mais j'ai essayé de le convertir directement dans un byte[] avec le code suivant:

byte[] imgData;

using (Stream inputStream = ImageData.InputStream)
{
    MemoryStream memoryStream = inputStream as MemoryStream;
    if (memoryStream == null)
    {
        memoryStream = new MemoryStream();
        inputStream.CopyTo(memoryStream);
    }

    imgData = memoryStream.ToArray();
}

memoryStream est toujours vide par le temps imgData = memoryStream.ToArray(); est invoqué, afin de imgData finit par être null.

Je vais avoir du mal à comprendre pourquoi je ne peut pas lire cette InputStream dans un MemoryStream. L'InputStream semble semble bien, à l'exception de la readTimeout et writeTimeout propriétés jeter timeouts are not supported on this stream. Ce que je fais mal, et comment se fait que je ne peux pas convertir les données images dans un byte[]?

Juste au cas où, c'est mon appel AJAX. Pourrait-il être un problème avec le contentType ou processData options défini à false?

$.ajax({
    url: 'SaveImage',
    data: formData,
    type: "POST",
    contentType: false,
    processData: false,
    beforeSend: function () {
        $("#loadingScreenModal").modal('toggle');
    },
    success: function (data) {
        //etc.
    }
});

Mise à JOUR: j'ai résolu le problème en convertissant le HttpPostedFileBase à un Image, puis la conversion de l' Image à un byte[], mais je suis toujours intéressé à comprendre pourquoi je dois effectuer cette étape intermédiaire.

Image i = Image.FromStream(ImageData.InputStream, true, true);
byte[] imgData = imageToByteArray(thumb);

public byte[] imageToByteArray(Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
    return ms.ToArray();
}

Mise à JOUR #2: je pense qu'il a probablement raison pour laquelle le problème avec mon code est le code à l'intérieur de la if (memoryStream == null) bloc ne jamais être invoquée.

memoryStream ne sera jamais nulle à cette ligne.
Lisez ici comment pour lire le flux: msdn.microsoft.com/en-us/library/...
J'ai mis à jour ma question pour refléter le fait que c'est vide, pas null.
Votre code est de travailler pour moi. Si vous pouvez inclure les éléments pertinents de votre HTML pour la forme, et tout ce que vous avez peut-être laissé hors de la SaveImage méthode, qui pourrait être utile.
Une Image - objet de prendre un coup d'oeil à la imageToByteArray fonction de l'argument.

OriginalL'auteur alex | 2014-12-08