2011-09-18 123 views
2

我有以下代码:如何判断Image.FromStream完成

var request = (HttpWebRequest)HttpWebRequest.Create(url); 
var response = request.GetResponse(); 
var stream = response.GetResponseStream(); 
if (stream != null) { 
    Image newImage = Image.FromStream(stream, true); 
    pic.Thumb = newImage.ImageToByteArray(); 
} 

会发生什么,如果读超时?或者连接中止下载?

文档说它会抛出一个ArgumentException如果它不是一个有效的格式或为null,但我不知道如果它将抛出该异常,如果图像只是部分下载。

不幸的是,我不能依赖ContentLength头来告诉我文件的大小,因为服务器在于并且给出了比文件实际长度更大的内容长度。所以我希望Image.FromStream能够判断图像是否完整。

任何人都可以提供一些见解吗?

注:ImageToByteArray仅仅是使用内存流转换的Imagebyte[]

更新扩展方法:

据达林,那么ExternalException被抛出当您尝试保存图像。但是,我自己的截断图像文件的测试显示,如果图像不是正确的字节数,FromStream确实会抛出ArgumentException。

回答

4

如果读取超时会发生什么?

在输入if条件之前将抛出异常。

或者连接被中止?

在输入if条件之前将抛出异常。

但我不知道如果它会抛出该例外,如果图像只是部分下载。

图像无法部分下载。 GetResponseStream是一种阻塞方法,意思是说你得到了一切,或者是一个异常(或者你的情况当然你也可以得到一个异常,如果你获取的不是图像,而是一些HTML页面,当你尝试实例化图像GDI +对象)。作为一个方面说明,为避免泄漏,您可能还想将此可用的资源包装到using声明中。

+0

对,这很有道理。如果服务器不发送完整图像会发生什么情况? (假设他们有负载问题,并在他们的后端获取超时,并发送一个部分图像,但否则连接是正常的) –

+0

@Mystere人,我不明白。你的意思是服务器发送一个无效图像的字节数组,就像托管一个损坏图像的远程资源一样?如果是,那么当你试图将这个流加载到Image GDI +对象('Image.FromStream'方法)时,你会得到'ArgumentException'。 –

+0

我的意思是,我不确定Image类是否会将部分图像检测为无效并引发ArgumentException。 –

相关问题