博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[非原创]HttpWebRequest下载附件时提取文件名称

Posted on 2009-06-02 16:05  Mr.Night  阅读(963)  评论(0)    收藏  举报

我们在使用下载软件时,比如迅雷或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   }

 

这里没考虑编码的问题,所以获取的文件名有可能是乱码。

 

查看原文: http://www.zhangyongjun.com/blog/trackback.asp?tbID=243