1

是的,其中另一个......堆栈跟踪(有意义的部分):

System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+
   at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
   at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement)
   at System.Drawing.Image.FromStream(Stream stream)

尝试打开最终用户上传的图像文件时会发生这种情况。代码大约是这个(精简到基本部分):

HttpPostedFile file = Request.Files[name];
Stream stream = file.InputStream;
byte[] bytes = new byte[file.ContentLength];
stream.Read(bytes, 0, file.ContentLength);
return bytes;

然后用于

MemoryStream stream = new MemoryStream(bytes);
return Image.FromStream(stream);

所以本质上它放弃了尝试从内存流中加载图像。这并不总是发生。事实上,我自己无法重现该问题,但在过去 2 周内,几个不同的用户发生了大约 20 次。我无权访问触发问题的实际文件。

任何关于这里可能发生的事情的线索将不胜感激。

4

2 回答 2

3

stream.Read(bytes, 0, file.ContentLength);并不意味着它会准确读取file.ContentLength字节。读取的字节数可能会更少。您应该检查返回的值。你可能需要一个循环。

Stream.Read 方法

于 2012-04-20T14:32:56.887 回答
0

让你的阅读看起来像这样:

HttpPostedFile file = Request.Files[name]; 
Stream stream = file.InputStream; 
byte[] bytes = new byte[ContentLength];
int bytesRead = stream.Read(bytes, 0, ContentLength);
int offset = bytesRead;
while(bytesRead > 0)
{
     bytesRead = stream.Read(bytes, offset, ContentLength - offset);
     offset += bytesRead;
} 
return bytes; 
于 2012-04-20T14:56:37.710 回答