我有一个将文件提取到字节数组(数据)的函数。
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图像......
为什么这不起作用的任何想法?
注意:我向你保证我有一个有效的理由转换为字节数组然后转换为内存流!!
答案 0 :(得分: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);
}
从流中读取时,这是一个常见的错误。我已经多次看到这个问题了。
编辑:
正如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;
}
答案 1 :(得分:1)
您没有检查postingFile.InputStream的返回值。Read。 不完全保证在第一次调用时填充数组。这将在数据中留下损坏的JPEG(0而不是文件内容)。
答案 2 :(得分:1)
您是否检查过Read()调用的返回值以验证是否实际读取了所有内容?也许Read()只返回流的一部分,要求你循环Read()调用,直到消耗掉所有字节。
答案 3 :(得分:1)
你不能简单地这样做的任何理由:
Image bitmap = Image.FromStream(postedFile.InputStream);
答案 4 :(得分:0)
我在使用更强大的图像库打开的.NET中加载图像时遇到了问题。 .NET可能不支持您拥有的特定jpeg映像。 jpeg文件不仅仅是一种编码类型,还允许使用各种可能的压缩方案。
您可以尝试使用其他支持格式的图像。