在使用C#编写程序从普通的网页下载图片往往是这样的:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(imageurl));
using (WebResponse response = request.GetResponse())
{
using (Stream resStream = response.GetResponseStream())
{
System.Drawing.Image img;
img = System.Drawing.Image.FromStream(resStream);
img.Save(savePath);
}
}
或者:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(imageurl));
using (WebResponse response = request.GetResponse())
{
using (Stream resStream = response.GetResponseStream())
{
using (FileStream writer = new FileStream(savePath, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] buff = new byte[1024];
int c = 0; //实际读取的字节数
while ((c = resStream.Read(buff, 0, buff.Length)) > 0)
{
writer.Write(buff, 0, c);
}
}
}
}
但是如果对方网站如果有简单校验的话可能需要我们模拟普通用户的操作,以绕过对方的验证,一般是添加Referer和User-Agent
request.Referer = imageurl;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36";
当然也可能对方网站还有其他参数的校验,可以根据浏览器中的header添加到请求中
还有一种情况,如果对方图片采用了gzip压缩http://news.xinhuanet.com/english/photo/2016-08/24/135630565_14720447384671n.jpg),需要我们先解压然后保存文件,否则会导致图片损坏(用第一种方式的话会在
System.Drawing.Image.FromStream(resStream);这个位置抛异常,因为不是一个有效的图片流,第二种方式的话会是一个损坏的图片
)
解压代码为:
Stream resStream = response.GetResponseStream();
if (response.Headers[HttpResponseHeader.ContentEncoding] != null && response.Headers[HttpResponseHeader.ContentEncoding].ToLower().Contains("gzip"))
{
resStream = new GZipStream(resStream, CompressionMode.Decompress);
}