2013-12-10 14 views
13

Có cách nào để biết tên gốc của tệp bạn tải xuống bằng WebClient khi Uri không chứa tên không?Lấy tên tệp gốc khi tải xuống bằng WebClient

Điều này xảy ra chẳng hạn trong các trang web tải xuống bắt nguồn từ trang động nơi tên không được biết trước.

Sử dụng trình duyệt của tôi, tệp sẽ lấy tên quay số. Nhưng làm thế nào điều này có thể được thực hiện bằng cách sử dụng WebClient? Ví dụ:

 WebClient wc= new WebClient(); 
     var data= wc.DownloadData(@"www.sometime.com\getfile?id=123"); 

Sử dụng DownloadFile() không phải là giải pháp vì phương pháp này cần trước tên tệp.

+3

Bạn đã thử kiểm tra 'wc.ResponseHeaders' chưa? Tệp tải xuống thường chứa tiêu đề tệp đính kèm với tên tệp. – Tobberoth

+0

Tobberoth. Đó thực sự là câu trả lời! Không biết điều đó. Cảm ơn bạn rât nhiêu! –

Trả lời

27

Bạn cần phải kiểm tra các tiêu đề phản ứng và xem nếu có là một tiêu đề bố trí nội dung có trong đó bao gồm tên tệp thực.

WebClient wc = new WebClient(); 
var data= wc.DownloadData(@"www.sometime.com\getfile?id=123"); 
string fileName = ""; 

// Try to extract the filename from the Content-Disposition header 
if (!String.IsNullOrEmpty(wc.ResponseHeaders["Content-Disposition"])) 
{ 
fileName = wc.ResponseHeaders["Content-Disposition"].Substring(wc.ResponseHeaders["Content-Disposition"].IndexOf("filename=") + 9).Replace("\"", ""); 
} 
+0

'System.Net.Mime.ContentDisposition' có thể được sử dụng để phân tích cú pháp tiêu đề' var header = new ContentDisposition (wc.ResponseHeaders ["Content-Disposition"]); ' –

+2

Cảm ơn, nhưng đúng là" .... IndexOf ("filename =") + 9) .... " –

+0

@RaphaelZimermann bạn nói đúng. Đã cập nhật câu trả lời của tôi. Cảm ơn. – HaukurHaf

5

Đọc đáp ứng Tiêu đề "Content-Disposition" với WebClient.ResponseHeaders

Nó nên là:

Content-Disposition: attachment; filename="fname.ext" 

mã của bạn sẽ giống như thế:

string header = wc.ResponseHeaders["Content-Disposition"]??string.Empty; 
const string filename="filename="; 
int index = header.LastIndexOf(filename,StringComparison.OrdinalIgnoreCase); 
if (index > -1) 
{ 
    fileName = header.Substring(index+filename.Length); 
} 
+1

Câu trả lời hay nhưng chỉ số cần được nâng cao để tính toán độ dài của "filename =". IMHO tôi sẽ đổi nó thành fileName = header.Substring (index + "filename =". Length); – pbarranis

+2

@pbarranis bạn đúng, đã sửa! – giammin

Các vấn đề liên quan