当前位置:编程学习 > asp >>

使用HttpWebRequest下载经过重定向的文件

使用 req.AllowAutoRedirect = true; 可以直接下载到文件,但不能得到文件名,通过使用req.AllowAutoRedirect = false;得到响应的Location,从而可以得到所请求的真实地址,也就可以得到文件名了。下面的代码可以进行下载到真实的文件名。需要注意的是,后面的req.AllowAutoRedirect = true;必须设置为 true,如果设置为false,则不能下载到完整的文件。

C# 代码
string Cookie = String.Empty;
String url = "http://search.patentstar.com.cn/cprs2010/Docdb/GetBns.aspx?PNo=APP201180002436";
String refer = url.Substring(0, url.LastIndexOf("/") + 1);
System.Net.HttpWebRequest req = System.Net.HttpWebRequest.Create(url) as System.Net.HttpWebRequest;
req.AllowAutoRedirect = false;
req.Referer = refer;
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
System.Net.HttpWebResponse res = req.GetResponse() as System.Net.HttpWebResponse;
System.Net.WebHeaderCollection headers = res.Headers;
String newUrl = "";
if ((res.StatusCode == System.Net.HttpStatusCode.Found) ||
  (res.StatusCode == System.Net.HttpStatusCode.Redirect) ||
  (res.StatusCode == System.Net.HttpStatusCode.Moved) ||
  (res.StatusCode == System.Net.HttpStatusCode.MovedPermanently))
{
  newUrl = headers["Location"];
  newUrl = newUrl.Trim();
}

if (headers["Set-Cookie"] != null)
{
  Cookie = headers["Set-Cookie"];
}

NameValueCollection collHeader = new NameValueCollection();
if (Cookie.Length > 0)
{
  collHeader.Add("Cookie", Cookie);
}
res.Close();
req = null;
   
String fileName = newUrl.Substring(newUrl.LastIndexOf("/") + 1);
req = System.Net.HttpWebRequest.Create(newUrl) as System.Net.HttpWebRequest;
req.AllowAutoRedirect = true;
req.Referer = url;
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
res = req.GetResponse() as System.Net.HttpWebResponse;
           
System.IO.Stream stream = res.GetResponseStream();
byte[] buffer = new byte[32 * 1024];
int bytesProcessed = 0;
System.IO.FileStream fs = System.IO.File.Create(Server.MapPath(fileName));
int bytesRead;
do
{
  bytesRead = stream.Read(buffer, 0, buffer.Length);
  fs.Write(buffer, 0, bytesRead);
  bytesProcessed += bytesRead;
}
while (bytesRead > 0);
fs.Flush();
fs.Close();
res.Close();
Response.Write("文件 " + fileName +  " 已经下载完成。");


作者 孟宪会
补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,