web-dev-qa-db-fra.com

Comment définir le nom du fichier téléchargé depuis le navigateur?

J'écris une application Web qui, entre autres, permet aux utilisateurs de télécharger des fichiers sur mon serveur. Afin d'éviter les conflits de noms et d'organiser les fichiers, je les renomme une fois qu'ils sont placés sur mon serveur. En gardant une trace du nom du fichier d'origine, je peux communiquer avec le propriétaire du fichier sans qu'il sache que j'ai changé le nom du fichier à l'arrière. Autrement dit, jusqu'à ce qu'ils aillent télécharger le fichier. Dans ce cas, ils sont invités à télécharger un fichier avec un nom inconnu.

Ma question est, est-il possible de spécifier le nom d'un fichier à télécharger en utilisant uniquement HTML? Donc, un utilisateur télécharge un fichier nommé 'abc.txt' et je le renomme en 'xyz.txt', mais quand il le télécharge, je veux que le navigateur enregistre le fichier en tant que 'abc.txt' par défaut. Si cela n'est pas possible avec seulement du HTML, existe-t-il un moyen de le faire?

46
Sparafusile

Impossible de trouver un moyen en HTML. Je pense que vous aurez besoin d'un script côté serveur qui produira un en-tête de disposition de contenu. En php, cela se fait comme ceci:

header('Content-Disposition: attachment; filename="downloaded.pdf"');

si vous souhaitez fournir un nom de fichier par défaut, mais pas un téléchargement automatique, cela semble fonctionner.

header('Content-Disposition: filename="filetodownload.jpg"');

En fait, c'est le serveur qui sert directement vos fichiers, vous n'avez donc aucun moyen d'interagir avec lui depuis HTML, car HTML n'est pas du tout impliqué.

58
Palantir

Quand ils cliquent sur un bouton pour télécharger le fichier, vous pouvez ajouter attribut HTML5 download où vous pouvez définir le nom de fichier par défaut.

C'est ce que j'ai fait lorsque j'ai créé un fichier xlsx et que le navigateur veut l'enregistrer en tant que fichier Zip.

<a href="path/to/file" download="renamed.txt">Download</a>
<a href="downloads/export.xlsx" download="Data-Export.xlsx">Download Export</a>
44
Mephiztopheles

c'est très simple en utilisant l'attribut HTML5 download!

voici ma démo codepen .

https://codepen.io/xgqfrms/full/GyEGzG/

mon raccourci d'écran.

enter image description here

ajouter gif démo.

enter image description here

1
xgqfrms

Cela devra être fait côté serveur. Vous devrez avoir l'ancien nom de fichier dans une base de données quelque part, puis vous pourrez le déplacer vers un dossier temporaire avec le nom correct et envoyer ce fichier à l'utilisateur. TBQH je pense que vous devriez envisager d'éviter les conflits de noms avec les sous-répertoires et stocker le chemin d'accès à chaque fichier dans votre base de données au lieu de l'ancien nom/nouveau nom.

0
Segfault

Eh bien, la réponse de @ Palantir est, pour moi, la manière la plus correcte!

Si vous prévoyez d'utiliser cela avec plusieurs fichiers, je vous suggère d'utiliser (ou d'en créer un) PHP Download Manager.

MAIS , si vous voulez faire cela à un ou deux fichiers, je vous proposerai l'option mod_rewrite:

Vous devez créer ou éditer votre fichier . Htaccess sur le dossier htdocs et ajouter ceci:

RewriteEngine  on 
RewriteRule ^abc\.txt$  xyz.txt

Avec ce code, les utilisateurs téléchargeront xyz.txt données avec le nom abc.txt

REMARQUE: vérifiez si vous avez déjà le " RewriteEngine on " dans votre fichier, si oui, ajoutez uniquement le second pour chaque fichier que vous souhaitez rediriger.

Bonne chance;) (Désolé pour mon anglais)

0
cusspvz