根据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

解决方案 »

  1.   

    先解码。然后才行!
    这种编码主要是因为长度不定。
    网上的这种解码程序多的很,尤其是.net版的。
      

  2.   

    只要指定来源就可以下载string url = @"http://tieba.baidu.com/cgi-bin/genimg?7CDBEB22520CAD4F06BBF9C85B2FE872F68D4381D4366CF60EA055FA2AFA7E42986F6E4BABF4628E3A802853E4E66F22ED317BB7E22401885D874B";
    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();
      

  3.   

    补充
    如果 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();