根据URL下载文件,有些请求的答应头中有Transfer-Encoding=chunked。不知道要怎么下载。
用过XMLHTTP、WebRequest、WebClient几个类,都不行。
用迅雷下载,是可以下载的,我想这种文件应该可以下载的,可能是设置不对。
网上找了关于chunked的信息,没看明白。Transfer-Encoding:chunked
表示Content Body将用Chunked编码传输内容。
Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。具体的Chunk编码格式如下:如百度的验证图,头部有 Transfer-Encoding=chunked; 要怎么下载。
http://tieba.baidu.com/cgi-bin/genimg?7CDBEB22520CAD4F06BBF9C85B2FE872F68D4381D4366CF60EA055FA2AFA7E42986F6E4BABF4628E3A802853E4E66F22ED317BB7E22401885D874B
用过XMLHTTP、WebRequest、WebClient几个类,都不行。
用迅雷下载,是可以下载的,我想这种文件应该可以下载的,可能是设置不对。
网上找了关于chunked的信息,没看明白。Transfer-Encoding:chunked
表示Content Body将用Chunked编码传输内容。
Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。具体的Chunk编码格式如下:如百度的验证图,头部有 Transfer-Encoding=chunked; 要怎么下载。
http://tieba.baidu.com/cgi-bin/genimg?7CDBEB22520CAD4F06BBF9C85B2FE872F68D4381D4366CF60EA055FA2AFA7E42986F6E4BABF4628E3A802853E4E66F22ED317BB7E22401885D874B
这种编码主要是因为长度不定。
网上的这种解码程序多的很,尤其是.net版的。
string file = @"c:/1.jpg";HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(url);
httpRequest.Referer = "http://tieba.baidu.com/"; // 指定这就可以了HttpWebResponse httpWebResponse = (HttpWebResponse)httpRequest.GetResponse();
int fileLength = (int)httpWebResponse.ContentLength;
byte[] buffer = new byte[fileLength];System.IO.Stream stream = httpWebResponse.GetResponseStream();
stream.Read(buffer, 0, fileLength);
System.IO.FileStream fileStream = new System.IO.FileStream(file, System.IO.FileMode.Create);
fileStream.Write(buffer, 0, fileLength);
stream.Close();
fileStream.Close();
如果 httpWebResponse.ContentLength 返回 -1int fileLength = (int)httpWebResponse.ContentLength;
if (fileLength == -1) fileLength = 1000000; //只要长度大于下载的文件就可以。
byte[] buffer = new byte[fileLength]; System.IO.Stream stream = httpWebResponse.GetResponseStream();
stream.Read(buffer, 0, fileLength);
System.IO.FileStream fileStream = new System.IO.FileStream(file, System.IO.FileMode.Create);
fileStream.Write(buffer, 0, fileLength);
stream.Close();
fileStream.Close();