我使用HttpWebRequest下载百度网盘里的文件,可以获取到Content-Disposition, 然后获取文件名,有以下三种情况:
1.全英文没问题。
2.全中文有时没问题,有时文件名还是乱码。
3.文件名中英文混合的会有问题,获取到的文件名中亠部分乱码.
代码如下:
var url = state.ToString(); HttpWebRequest request = null; if (url.ToLower().StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.AllowWriteStreamBuffering = true; request.Credentials = System.Net.CredentialCache.DefaultCredentials; request.Proxy = new WebProxy { UseDefaultCredentials = true }; request.MaximumResponseHeadersLength = -1; request.AllowAutoRedirect = false; request.UserAgent = "TLE Retriever v1.5.8"; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "GET"; request.Headers.Add("Accept-Language", "zh-cn"); request.Headers.Add("Accept-Encoding", "gzip,deflate"); request.KeepAlive = true; if (request == null) return; var response = request.GetResponse(); request.Abort(); var filename = response.Headers["Content-Disposition"]; if (string.IsNullOrWhiteSpace(filename)) return; var pos = filename.ToLower().IndexOf("filename="); if (pos <= 0 || pos > filename.Length - 1) return; filename = filename.Substring(pos + "filename=".Length); filename = HttpUtility.UrlDecode(filename);
直到最后一句代码,获取工作已经完成,但获取的文件名是乱码,而FF和IE中显示正常,谁能给个帮助?
google了一圈,msdn中能看懂的文字都查了遍,都在说服务端怎么返回,几乎没人讨论客户端怎么下载的,只能等待高人了。
在MSDN上找到答案了,是使用的是一个以ISO开头的编码先解码,然后再根据Charset判断再解码,但好像还不是很完美,有个别文件解出来多出一个B010的字符串前缀。IE显示正常,但我发现FF里显示的也有这个前缀,怎么改编码方式都没用。这样就可以了,起码比迅雷强,迅雷直接显示乱码。
恭喜让我长姿势了~
把request.Headers.Add("Accept-Encoding", "gzip,deflate");这句去掉
这个问题我也遇到过
不对,尽管我觉得不用试,但我还是试了下,依然不行
那句header是压缩的,但对于文件名是没有影响的,传输过程中是压缩的,到客户端后会被自动解压。
拿TXT另存为,字符编码改为UTF8
大哥,这个方法我就不试了
@沧海一杰: 。。。。。
HttpUtility.UrlDecode要一个编码参数的,用response里返回的编码(哪个属性时间长了记不清了)。
首先你需要确定返回的 Content-Disposition 使用的是什么编码,注意这同 Body 的编码是不同的。
然后你需要读取 Content-Disposition 的字节流值,然后在转换成 unicode 的 string.