Obtenir le nom de fichier lors de son téléchargement
Nous fournissons les fichiers qui sont enregistrés dans notre base de données et le seul moyen de les récupérer, c'est en passant par leur id
comme dans:
www.AwesomeURL.com/AwesomeSite.aspx?requestedFileId=23
Tout est fichier de travail que je suis en utilisant le Classe WebClient.
Il n'y a qu'un problème, je suis confronté:
Comment puis-je obtenir le réel nom de fichier?
Mon code ressemble à ceci atm:
WebClient client = new WebClient ();
string url = "www.AwesomeURL.com/AwesomeSite.aspx?requestedFileId=23";
client.DownloadFile(url, "IDontKnowHowToGetTheRealFileNameHere.txt");
Tout ce que je sais, c'est l' id.
Cela ne se produit pas lorsque j'essaie d'accéder url
à partir du navigateur où il se c'est le bon nom => DownloadedFile.xls.
Quelle est la bonne façon d'obtenir la bonne réponse?
- Avez-vous trouvé la solution? Si aucune des réponses ici vous a aidé et vous l'avez trouvé, merci de la partager avec nous. 🙂
- En fait je n'ai pas trouvé de solution encore.. planqué le code et toujours en attente d'un hasard de l'inspiration 😉
- Donc ce qui arrive quand vous essayez le code proposé dans ma réponse? Vous n'avez jamais commenté là..
- Comment pourrais-je obtenir de l'encodage du nom de fichier? Si j'utilise HttpWebResponse je peux utiliser StreamReader sr = new StreamReader(s, l'Encodage.GetEncoding(la réponse.CharacterSet));
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème, et j'ai trouvé cette classe: Système.Net.Le Mime.ContentDisposition.
La classe de la documentation suggère que c'est pour les e-mails des pièces jointes, mais il fonctionne très bien sur le serveur que j'ai utilisé pour le test, et c'est vraiment sympa d'éviter de l'analyse.
Voici tout le code nécessaire, en supposant que le serveur a appliqué-tête content-disposition:
Si le serveur n'a pas mis en place cette en-tête, essayez de débogage et de voir ce que ResponseHeaders vous avez, l'un d'entre eux sera probablement contenir le nom que vous désirez. Si le navigateur pour afficher le nom, il doit venir de quelque part.. 🙂
"file.txt"
au lieu defile.txt
.fileName = contentDisposition.Substring(index + lookFor.Length).Replace("\"", "");
🙂StreamReader
avec unMemoryStream
, et ensuite utiliserrawStream.CopyTo(memStream)
etFile.WriteAllBytes(path, memStream.ToArray())
(.NET 4 seulement).System.Net.Mime.ContentDisposition
par l'instanciation de la chaîne de caractères retournée parclient.ResponseHeaders["content-disposition"]
[j'avais été en utilisantWebResponse
j'ai donc utiliséResponse.Headers["Content-Disposition"]
le nom du fichier est contenu dans leFileName
bien et nous pouvons également vérifier si laContent-Disposition
estInline
ou non, qui permettront de déterminer que devons-nous utiliser l'Url ou leContent-Disposition
pour obtenir le nom de fichier.System.Net.Mime.ContentDisposition
)Vous avez besoin de regarder le
content-disposition
en-tête, par l'intermédiaire de:un exemple typique serait:
WebClient
eu accès aux en-têtes de réponse.Vous pouvez utiliser HTTP
content-disposition
en-tête de suggérer des noms de fichiers pour le contenu que vous fournissez:Donc, dans votre
AwesomeSite.aspx
script, vous pouvez définir lacontent-disposition
en-tête. Dans votreWebClient
classe vous permettrait de récupérer cet en-tête pour enregistrer le fichier comme suggéré par votreAwesomeSite
site.- Je atteindre avec le code de wst.
Voici le code complet à télécharger le fichier dans l'url c:\temp dossier
Bien que la solution proposée par l'Ombre de l'Assistant fonctionne bien pour les fichiers texte, j'ai eu besoin de télécharger des fichiers binaires, telles que les images et de fichiers exécutables, dans mon application.
Voici une petite extension à
WebClient
qui fait le tour. Le téléchargement est asynchrone. Aussi la valeur par défaut pour le nom de fichier est nécessaire, parce que nous ne savons pas vraiment si le serveur va envoyer tous les en-têtes.