2013-12-10 12 views
13

Esiste un modo per conoscere il nome originale di un file scaricato tramite WebClient quando l'Uri non contiene il nome?Ottieni nome file originale durante il download con WebClient

Ciò accade ad esempio nei siti in cui il download proviene da una pagina dinamica in cui il nome non è noto in anticipo.

Utilizzando il mio browser, il file ottiene il nome orrect. Ma come si può fare usando il WebClient? E.g.

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

L'utilizzo di DownloadFile() non è una soluzione poiché questo metodo richiede un nome file in anticipo.

+3

Avete provato a verificare 'wc.ResponseHeaders'? I download di file in genere contengono un'intestazione di allegato con il nome file. – Tobberoth

+0

Tobberoth. Questa è davvero la risposta! Non lo sapevo. Grazie mille! –

risposta

27

È necessario esaminare le intestazioni di risposta e vedere se c'è è una intestazione content-disposition presente che include il nome file effettivo.

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

Il 'System.Net.Mime.ContentDisposition' può essere utilizzato per analizzare l'intestazione' var header = new ContentDisposition (wc.ResponseHeaders ["Content-Disposition"]); ' –

+2

Grazie, ma il corretto è" .... IndexOf ("filename =") + 9) .... " –

+0

@RaphaelZimermann hai ragione. Aggiornato la mia risposta. Grazie. – HaukurHaf

5

leggere l'intestazione di risposta "Content-Disposition" con WebClient.ResponseHeaders

Dovrebbe essere:

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

il codice dovrebbe essere simile:

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

Buona risposta ma l'indice deve essere avanzato per tenere conto della lunghezza di "nomefile =". IMHO lo cambierei in fileName = header.Substring (index + "filename =". Length); – pbarranis

+2

@pbarranis hai ragione, corretto! – giammin

Problemi correlati