web-dev-qa-db-fra.com

Obtenir le nom de fichier original lors du téléchargement avec WebClient

Existe-t-il un moyen de connaître le nom d'origine d'un fichier que vous téléchargez à l'aide de WebClient lorsque l'URI ne contient pas ce nom? 

Cela se produit par exemple sur des sites dont le téléchargement provient d'une page dynamique dont le nom n'est pas connu au préalable. 

En utilisant mon navigateur, le fichier reçoit le nom orrect. Mais comment cela peut-il être fait avec le Web Client? E.g.

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

L'utilisation de DownloadFile () n'est pas une solution car cette méthode nécessite un nom de fichier à l'avance.

16
Tim Dams

Vous devez examiner les en-têtes de réponse et voir s'il existe un en-tête de disposition du contenu incluant le nom de fichier réel.

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("\"", "");
}
30
HaukurHaf

Lisez l'en-tête de réponse "Content-Disposition" avec WebClient.ResponseHeaders

CA devrait etre:

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

votre code devrait ressembler à:

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);
}
6
giammin

Pour obtenir le nom du fichier sans télécharger le fichier:

public string GetFilenameFromWebServer(string url)
{
    string result = "";

    var req = System.Net.WebRequest.Create(url);
    req.Method = "HEAD";
    using (System.Net.WebResponse resp = req.GetResponse())
    {
        // Try to extract the filename from the Content-Disposition header
        if (!string.IsNullOrEmpty(resp.Headers["Content-Disposition"]))
        {
            result = resp.Headers["Content-Disposition"].Substring(resp.Headers["Content-Disposition"].IndexOf("filename=") + 9).Replace("\"", "");
        }
    }

    return result;
}
1
Fidel

Si, comme moi, vous devez traiter un en-tête Content-Disposition qui n'est pas formaté correctement ou qui ne peut pas être analysé automatiquement par la classe ContentDisposition pour une raison quelconque, voici ma solution:

string fileName = null;

// Getting file name
var request = WebRequest.Create(url);
request.Method = "HEAD";

using (var response = request.GetResponse())
{
    // Headers are not correct... So we need to parse manually
    var contentDisposition = response.Headers["Content-Disposition"];

    // We delete everything up to and including 'Filename="'
    var fileNameMarker= "filename=\"";
    var beginIndex = contentDisposition.ToLower().IndexOf(fileNameMarker);
    contentDisposition = contentDisposition.Substring(beginIndex + fileNameMarker.Length);

    //We only get the string until the next double quote
    var fileNameLength = contentDisposition.ToLower().IndexOf("\"");
    fileName = contentDisposition.Substring(0, fileNameLength);
}
0
Ogier