1

ファイルをバイト配列(データ)に抽出する関数があります。

        int contentLength = postedFile.ContentLength;
        byte[] data = new byte[contentLength];
        postedFile.InputStream.Read(data, 0, contentLength);

後で、このバイト配列を使用して System.Drawing.Image オブジェクトを作成します (データはバイト配列です)。

       MemoryStream ms = new MemoryStream(data);
       Image bitmap = Image.FromStream(ms);

「ArgumentException: パラメータが無効です」という例外が発生します。

元の投稿ファイルには 500k の jpeg 画像が含まれていました...

これが機能しない理由はありますか?

注:バイト配列に変換してからメモリストリームに変換する正当な理由があることを保証します!!

4

5 に答える 5

5

これは、すべてのファイル データをバイト配列に取り込めなかったことが原因である可能性が最も高いです。Read メソッドは、要求したバイト数を返す必要はなく、実際に配列に入れられたバイト数を返します。すべてのデータを取得するまでループする必要があります。

int contentLength = postedFile.ContentLength;
byte[] data = new byte[contentLength];
for (int pos = 0; pos < contentLength; ) {
   pos += postedFile.InputStream.Read(data, pos, contentLength - pos);
}

これは、ストリームから読み取るときによくある間違いです。私はこの問題を何度も見てきました。

編集:
マシューが示唆したように、ストリームの早期終了をチェックすると、コードは次のようになります。

int contentLength = postedFile.ContentLength;
byte[] data = new byte[contentLength];
for (int pos = 0; pos < contentLength; ) {
   int len = postedFile.InputStream.Read(data, pos, contentLength - pos);
   if (len == 0) {
      throw new ApplicationException("Upload aborted.");
   }
   pos += len;
}
于 2009-05-31T16:27:17.140 に答える
1

postedFile.InputStream の戻り値をチェックしていません。読んでください。最初の呼び出しで配列がいっぱいになる保証はまったくありません。これにより、破損した JPEG がデータに残ります (ファイル コンテンツではなく 0)。

于 2009-05-31T16:25:21.837 に答える
1

Read() 呼び出しからの戻り値をチェックして、実際にすべてのコンテンツを読み取っていることを確認しましたか? おそらく、Read() はストリームの一部しか返さないため、すべてのバイトが消費されるまで Read() 呼び出しをループする必要があります。

于 2009-05-31T16:26:22.460 に答える
1

単純にこれを行わない理由:

Image bitmap = Image.FromStream(postedFile.InputStream);
于 2009-05-31T17:47:05.080 に答える
0

より堅牢なイメージ ライブラリで開くことができるイメージを .NET に読み込む際に問題が発生しました。お持ちの特定の jpeg イメージが .NET でサポートされていない可能性があります。jpeg ファイルは 1 種類のエンコーディングだけでなく、さまざまな圧縮スキームが許可されています。

サポートされている形式であることがわかっている別の画像で試すことができます。

于 2009-05-31T16:25:26.067 に答える