2012-11-26 19 views
6

Sto cercando una soluzione per questo problema per giorni e non riesco a trovare nessuno.Ottieni nome file senza Content-Disposition

Desidero scaricare un file da un server Web con un client Web. Il download funziona bene, ma non riesco a ottenere il vero nome del file, che è molto importante per me.

Ho letto su molte home page, che il nome del file deve essere salvato nell'intestazione Content-Disposition. Sfortunatamente questa intestazione del sito è vuota. Ho provato a farlo con:

string header_contentDisposition =""; 
using (WebClient client = new WebClient()) 
      { 
       client.OpenRead(link); 

       header_contentDisposition = client.ResponseHeaders["Content-Disposition"]; 
       MessageBox.Show(header_contentDisposition); 
      } 

Non ci sono informazioni salvate in questa intestazione.

Se provo a scaricare il file con il mio browser (IE, Opera, Chrome) il nome file viene visualizzato nel file log, quindi deve essere salvato da qualche parte.

Potete immaginare dove posso trovarlo?

EDIT: Non posso estrarlo dalla URL, perché il collegamento è generato da PHP come

http://www.example.com/download.php?id=10 
+1

È possibile scaricare le intestazioni che * sono * presenti? O forse i browser lo stanno impostando automaticamente dall'URL? –

+0

Tutte le intestazioni ho ottenuto: Età = 292161 connessione = keep-alive Accept-Ranges = byte Content-Length = 15.953.830 Cache-Control = max-age = 31.536.000 Content-Type = application/vnd.android. pacchetto-archivio Data = Ven, 23 Nov 2012 09:21:40 GMT Scadenza = Sab, 23 Nov 2013 09:21:40 GMT Ultimo aggiornamento = Ven, 23 Nov 2012 08:38:35 GMT Server = nginx – user1854270

+0

Puoi darci un vero URL per poterlo riprodurre? –

risposta

15

Si può provare questo:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     try 
     { 

      HttpWebResponse res = (HttpWebResponse)request.GetResponse(); 
      using (Stream rstream = res.GetResponseStream()) 
      { 
       string fileName = res.Headers["Content-Disposition"] != null ? 
        res.Headers["Content-Disposition"].Replace("attachment; filename=", "").Replace("\"", "") : 
        res.Headers["Location"] != null ? Path.GetFileName(res.Headers["Location"]) : 
        Path.GetFileName(url).Contains('?') || Path.GetFileName(url).Contains('=') ? 
        Path.GetFileName(res.ResponseUri.ToString()) : defaultFileName; 
      } 
      res.Close(); 
     } 
     catch { } 

Provato questo su http://upload.p-kratzer.com/index.php?dir=&file=asdfasdfwervdcvvedb e lo fa return wetter.JPG.

+0

Great Lunyx. Grazie. Ma quando lo uso per i link di Google google ottenere una stringa di grande risultato. Ad esempio "attachment; filename = filename.apk; filename * = UTF-8''filename.apk" – smedasn

Problemi correlati