我们在使用下载软件时,比如迅雷或FLASHGET,当遇到了动态的url下载地址,也就是说通过url看不到实际的文件名,一般情况下,下载工具都能正确的识别动态url要下载的文件名。
当然,动态路径有2种不同的形式,一是动态url通过重定向到实际的文件url,二是动态的url并不跳转,在浏览器中打开这样的地址,会提示下载(以前的文章提到过,添加http消息头Content-Disposition的值为attachment;filename=文件名 即可实现)。
对于第一种情况,很容易获取到文件名,ResponseUri属性中包含了实际的文件名,尽管是通过了重定向。这里有个前提,调用HttpWebRequest请求时,要设置下允许重定向获取响应,默认情况下是允许的。
对于第二种情况,就稍微复杂了些。通过监测http流,可以发现响应消息体中包含了文件内容流,而响应消息头中有Content-Disposition,文件名就在这个消息头中。我们要做的,就是从这里边提取文件名,具体方法有很多,比如下面采用正则的方式提取:
1
string pattern = ".[^;]*;\\s+filename=\"(?<file>.*)\"";
2
Regex r = new Regex( pattern );
3
Match m = r.Match( str );
4
if( m.Success )
5
{
6
fileName = m.Groups["file"].Value;
7
}
string pattern = ".[^;]*;\\s+filename=\"(?<file>.*)\"";2
Regex r = new Regex( pattern );3
Match m = r.Match( str );4
if( m.Success )5
{6
fileName = m.Groups["file"].Value;7
}
这里没考虑编码的问题,所以获取的文件名有可能是乱码。
查看原文: http://www.zhangyongjun.com/blog/trackback.asp?tbID=243

浙公网安备 33010602011771号