2017-10-09 118 views
1
string uri = "https://sometest.com/l/admin/ical.html?t=TD61C7NibbV0m5bnDqYC_q"; 

    string filePath = "D:\\Data\\Name"; 

    WebClient webClient = new WebClient(); 
    webClient.DownloadFile(uri, (filePath + "/" + uri.Substring(uri.LastIndexOf('/')))); 

/// filePath + "/" + uri.Substring(uri.LastIndexOf('/')) = "D:\\Data\\Name//ical.html?t=TD61C7NibbV0m5bnDqYC_q" 

Accesing整個(串)uri,一個的.iCal文件將被自動下載...的文件名room113558101.ics(不,這將幫助)。得到URL和非法字符下載的文件路徑

如何正確獲取文件?

+1

你試過使用'HttpServerUtility.UrlEncode()'? – DiskJunky

+2

你認爲這是什麼URL是一個文件名爲fr om/onwards包含一個「?」,肯定是最有效的 – BugFinder

+0

@BugFinder在訪問uri時,文件被auttomaticaly下載... –

回答

3

您正在以錯誤的方式構建文件路徑,導致文件名無效(ical.html?t=TD61C7NibbV0m5bnDqYC_q)。相反,使用Uri.Segments屬性,並使用路徑段(這將是在這種情況下ical.html另外,不要用手合併文件路徑 - 使用Path.Combine

var uri = new Uri("https://sometest.com/l/admin/ical.html?t=TD61C7NibbV0m5bnDqYC_q"); 
var lastSegment = uri.Segments[uri.Segments.Length - 1]; 
string directory = "D:\\Data\\Name"; 
string filePath = Path.Combine(directory, lastSegment); 
WebClient webClient = new WebClient(); 
webClient.DownloadFile(uri, filePath); 

回答您關於得到正確的文件名編輯的問題。在這種情況下,你不知道正確的文件名,直到您對服務器的請求,並得到響應文件名會被包含在響應的Content-Disposition頭所以,你應該做的是這樣的:。

var uri = new Uri("https://sometest.com/l/admin/ical.html?t=TD61C7NibbV0m5bnDqYC_q"); 
string directory = "D:\\Data\\Name"; 
WebClient webClient = new WebClient(); 
// make a request to server with `OpenRead`. This will fetch response headers but will not read whole response into memory   
using (var stream = webClient.OpenRead(uri)) { 
    // get and parse Content-Disposition header if any 
    var cdRaw = webClient.ResponseHeaders["Content-Disposition"]; 
    string filePath; 
    if (!String.IsNullOrWhiteSpace(cdRaw)) { 
     filePath = Path.Combine(directory, new System.Net.Mime.ContentDisposition(cdRaw).FileName); 
    } 
    else { 
     // if no such header - fallback to previous way 
     filePath = Path.Combine(directory, uri.Segments[uri.Segments.Length - 1]); 
    } 
    // copy response stream to target file 
    using (var fs = File.Create(filePath)) { 
     stream.CopyTo(fs); 
    } 
} 
+0

訪問整個uri,.ical文件將被下載,而不是.html文件 –

+0

@FlorinM。以及你的問題是關於路徑錯誤中的非法字符,沒有關於正在下載什麼類型的文件。 – Evk

+0

我編輯它。對不起,我錯過了 –