2012-11-26 68 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