我有一个采用HttpPostedFileBase(.jpg或.png等)的控制器。
public ActionResult SaveImage(HttpPostedFileBase ImageData)
{
//code
}
ImageData
成为System.Web.HttpPostedFileWrapper
具有以下属性的对象:
ContentLength: 71945
ContentType: "image/png"
FileName: "foo.png"
InputStream: {System.Web.HttpInputStream}
使用ImageData并将其转换为Image,然后将Image转换为byte [],然后转换为base64字符串,我没有任何问题-但我尝试使用以下代码将其直接转换为byte []:
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
在imgData = memoryStream.ToArray();
调用时始终为空,因此imgData
最终也为null。
我很难理解为什么我不能将此InputStream读入MemoryStream。InputStream看起来不错,但readTimeout和writeTimeout属性throwing除外timeouts are not supported on this stream
。我在做什么错,为什么我不能将ImageData转换为byte []?
以防万一,这是我的AJAX电话。contentType
或processData
选项设置为false可能会引起问题吗?
$.ajax({
url: 'SaveImage',
data: formData,
type: "POST",
contentType: false,
processData: false,
beforeSend: function () {
$("#loadingScreenModal").modal('toggle');
},
success: function (data) {
// etc.
}
});
更新:我通过将转换HttpPostedFileBase
为Image
,然后将转换为Image
来解决了该问题byte[]
,但是我仍然对弄清楚为什么必须执行此中间步骤很感兴趣。
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();
}
更新#2:我认为这可能是因为我的代码存在问题是该if (memoryStream == null)
块内的代码从未被调用过。
memoryStream == null
正如JoeEnos的建议,答案最终就是检查。MemoryStream
在此检查正上方的行上实例化了-因此它永远不能为null-并应使用进行检查if (memoryStream.Length == 0)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句