我有一个将文件提取到字节数组(数据)中的函数。

        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图像...

任何想法为什么这不起作用?

注意:我向您保证,有正当的理由要先转换为字节数组,然后再转换为内存流!!

最佳答案

这很可能是因为您没有将所有文件数据都放入字节数组中。 Read方法不必返回所需的字节数,它可以返回实际放置在数组中的字节数。您必须循环直到获得所有数据:

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


从流中读取时,这是一个常见错误。我已经看过很多次这个问题了。

编辑:
正如Matthew所建议的那样,在检查流的尽头时,代码将是:

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;
}

10-04 14:29