【发布时间】:2015-01-26 22:51:25
【问题描述】:
我有一个接收 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[] 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 最终也为空。
我很难理解为什么我不能将此 InputStream 读入 MemoryStream。 InputStream 似乎很好,除了抛出timeouts are not supported on this stream 的 readTimeout 和 writeTimeout 属性。我做错了什么,为什么我不能将 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在该行永远不会为空。 -
阅读这里如何阅读流:msdn.microsoft.com/en-us/library/…
-
@JoeEnos 我更新了我的问题以反映它是空的,而不是空的。
-
您的代码按原样为我工作。如果您可以在表单中包含 HTML 的相关部分,以及您可能在 SaveImage 方法中遗漏的任何内容,那将很有帮助。
-
@Muflix 一个 Image 对象 - 看看 imageToByteArray 函数的参数。
标签: c# asp.net asp.net-mvc