透過 WebClient.DownloadFile() 或 DownloadData() 對 .NET 老鳥而言是雕蟲小技(參考:CODE-使用C#程式從網站下載檔案 ),但此種寫法檔名需自行指定。若下載對象非靜態檔案,伺服器端程式會透過 Content-Disposition Response Header 傳回檔名供客戶端參考,WebClient 是否能由 Response Header 自動取得檔名呢?
答案是可以! 程式範例如下:
static string DownloadFile(string url, string saveFolder)
{
using (var wc = new WebClient())
{
using (var stream = wc.OpenRead(url))
{
//若伺服器未提供檔名,預設以下載時間產生檔名
var fn = DateTime.Now.ToString("yyyyMMddHHmmss") + ".data";
var cd = wc.ResponseHeaders["content-disposition"];
if (!string.IsNullOrEmpty(cd)) {
var p = Regex.Split(cd, "filename=");
if (p.Length == 2) fn = p.Last();
}
using (var file = File.Create(Path.Combine(saveFolder, fn)))
{
stream.CopyTo(file);
}
return fn;
}
}
}