2012-11-26 69 views
6

我正在寻找这个问题的解决方案几天,我找不到任何。获取文件名无内容处置

我想用webclient从web服务器下载文件。下载工作正常,但我无法得到真正的文件名,这对我来说非常重要。

我在很多主页上看过,文件名应该保存在Content-Disposition-Header中。不幸的是,该网站的标题是空的。我试图得到它:

string header_contentDisposition =""; 
using (WebClient client = new WebClient()) 
      { 
       client.OpenRead(link); 

       header_contentDisposition = client.ResponseHeaders["Content-Disposition"]; 
       MessageBox.Show(header_contentDisposition); 
      } 

这个头里面没有信息保存。

如果我试图用我的浏览器(IE,Opera,Chrome)下载文件,文件名会显示在filedialog中,所以它必须保存在某处。

你能想像我在哪里可以找到它吗?

编辑:我无法从URL中提取它,因为链接是由PHP产生像

http://www.example.com/download.php?id=10 
+1

你可以转储* *存在的头文件吗?或者,也许浏览器默认从URL? –

+0

所有标题我: 年龄= 292161 连接=保活 接受-范围=字节 内容长度= 15953830 的Cache-Control =最大年龄= 31536000 内容类型=应用程序/ vnd.android。 package-archive Date = Fri,2012年11月23日09:21:40 GMT Expires = 2013年11月23日星期六09:21:40 GMT Last-Modified = Fri,2012年11月23日08:38:35 GMT Server = nginx – user1854270

+0

你能给我们一个真实的URL,以便我们能够重现这一点吗? –

回答

15

你可以试试这个:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     try 
     { 

      HttpWebResponse res = (HttpWebResponse)request.GetResponse(); 
      using (Stream rstream = res.GetResponseStream()) 
      { 
       string fileName = res.Headers["Content-Disposition"] != null ? 
        res.Headers["Content-Disposition"].Replace("attachment; filename=", "").Replace("\"", "") : 
        res.Headers["Location"] != null ? Path.GetFileName(res.Headers["Location"]) : 
        Path.GetFileName(url).Contains('?') || Path.GetFileName(url).Contains('=') ? 
        Path.GetFileName(res.ResponseUri.ToString()) : defaultFileName; 
      } 
      res.Close(); 
     } 
     catch { } 

测试这对http://upload.p-kratzer.com/index.php?dir=&file=asdfasdfwervdcvvedb和它返回wetter.JPG。

+0

Great Lunyx。谢谢。但是,当我使用谷歌驱动器链接得到一个大的结果字符串。例如“attachment; filename = filename.apk; filename * = UTF-8”文件名.apk“ – smedasn