1

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

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

后来我用这个字节数组构造了一个System.Drawing.Image对象(其中data是字节数组)

       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 中加载可由更强大的图像库打开的图像时遇到问题。.NET 可能不支持您拥有的特定 jpeg 图像。jpeg 文件不仅是一种编码类型,还允许使用多种可能的压缩方案。

您可以尝试使用另一个您知道其格式受支持的图像。

于 2009-05-31T16:25:26.067 回答