2013-06-11 62 views
-1

我想通過WebClient類和OpenReadAsync方法將PDF文件下載到獨立存儲中。 一旦我將文件保存到IsolatedSotrage,我將其命名爲「file.pdf」,但我需要保留原來的名稱。 我該怎麼做? 我做了一些研究,我明白,下載之前獲取文件名是困難的,不是很方便,因爲一些標題信息可能會丟失。 但下載後?我可以在download.OpenReadCompleted完成方法嗎?根本不知道何去何從。在下載ti之前/之後保留原始文件名稱IsolatedsStorage? (C#/ WindowsPhone)

謝謝大家。

+1

這個問題是缺乏大量的信息 - 你在哪裏下載,什麼是樣本網址(可以我們從那裏提取文件名),這是一個可以控制的服務(所以可以通過文件名作爲屬性發送)等等。 – Oren

+0

不,我只是在開發一個下載器,在IsolatedStorage中存儲一些文件。我明顯可以從URL中提取名稱,好吧,但並非每個URL都簡單顯示爲www.website.com/filename.pdf。 我只是想知道下載後是否有任何方式來訪問文件的名稱和類型。 –

+0

下面是一個例子,Geek Champ的書下載: http://www.geekchamp.com/marketplace/components/windows-phone-toolkit-in-depth-3rd-edition/downloadfree?id=381255 –

回答

0

假設你知道你正在通過URL下載的文件名,或者至少你可以解析它。假設,你可以通過UserState對象將它傳遞給事件處理程序:

myClient.OpenReadAsync(url, filenameFromUrl); 

然後,在事件處理程序:

void OnOpenReadCompleted(OpenReadCompletedEventArgs e) 
{ 
    string filename = e.UserState.ToString(); 
} 

如果您不知道URL或不能得到文件名是因爲它是某種Web服務掩蓋它,然後不,你不能從事件參數中獲取它。

+0

非常感謝,但我還需要保留原來的名稱,這些不同的URL不僅僅包含文件名,如「www.website.com/filename.pdf」。 有沒有更好的組織代碼的方法? –

0

您需要使用HttpWebRequest並獲取響應標題。下面是一個概念驗證代碼髒證明,但它可以很容易地集成到任何流你已經有了:

private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     HttpWebRequest req = HttpWebRequest.CreateHttp("http://www.geekchamp.com/marketplace/components/windows-phone-toolkit-in-depth-3rd-edition/downloadfree?id=381255"); 

     req.BeginGetResponse(new AsyncCallback(ReadCallback), req); 
    } 

    private void ReadCallback(IAsyncResult asynchronousResult) 
    { 
     HttpWebRequest req = (HttpWebRequest)asynchronousResult.AsyncState; 
     HttpWebResponse response = (HttpWebResponse)req.EndGetResponse(asynchronousResult); 

     // RegEx to extract file name from headers 
     var reFile = new Regex("filename=\"(.*?)\""); 

     // The header that contains the filename. Example: 
     // Content-Disposition: attachment; filename="Windows Phone Toolkit In Depth 3rd Abstract.pdf" 
     var contentDisposition = response.Headers["Content-Disposition"]; 

     // FIXME: this assumes match success. Might be easier to just use a replace 
     var filename = reFile.Match(contentDisposition).Groups[1].Value; 

     // ... your code here ... 
    } 
+0

非常感謝,它工作。 +1 –

相關問題