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
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
BinaryReader
classe pour lire une chaîne de caractères dans un tableau d'octets:Vous ne pouvez pas "convertir" à partir d'un type de flux à un autre, vous avez à lire à partir de l'un et de l'écriture à l'autre (c'est ce que
CopyTo
. Avez-vous vraiment besoin d'unMemoryStream
ou était-ce juste un moyen d'obtenir de la sous-octets? Pourquoi ne pas la réponse pour vous?Je ne sais pas pourquoi la réponse ne fonctionne pas pour moi parce que je ne comprends pas tout le chemin MemoryStreams travail. Je suis uniquement intéressé par le sous-jacent d'octets; je veux enregistrer l'image dans une base de données comme
varbinary(max)
.OriginalL'auteur D Stanley
J'ai même code, dans lequel j'ai lu le flux directement en byte[] comme suit:
J'ai ensuite stocker imageBytes dans la base de données comme un
varbinary(MAX)
. Semble bien fonctionner.OriginalL'auteur Eric King
La réponse a fini par être le
memoryStream == null
vérifier, comme JoeEnos suggéré.MemoryStream
est instancié sur la ligne directement au-dessus de cette check - de sorte qu'il ne devrait jamais être nul et doit être vérifiée avecif (memoryStream.Length == 0)
à la place.OriginalL'auteur
Modèle Code
Afficher Le Code
Ce type de Code dans Votre Contrôleur
Espère que cela aidera
HttpPostedFileBase
est déjà un byte[]. Je suis à essayer de comprendre pourquoi je dois prendre de l'étape intermédiaire et convertir lesHttpPostedFileBase
à unImage
avant que je le convertir en unbyte[]
.OriginalL'auteur Prakash Joshi