1

はい、もう 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 に答える