PostScript 2020/2/7 Un collègue a souligné et apporté les corrections suivantes: arc:
--url encode la valeur de filename =
Je souhaite télécharger un fichier avec un nom de fichier japonais (nom de fichier comprenant une chaîne de caractères multi-octets) en réponse à une demande. Ceci est commun à toutes les applications Web, pas seulement à Django.
Django: 1.10.xx Python: 3 séries
Content-Diposition
Lors du téléchargement d'un fichier via http, vous devez définir le champ Content-Disposition de la réponse. Ici, vous pouvez spécifier le nom du fichier au moment du téléchargement, s'il faut exécuter le téléchargement immédiatement, etc.
Content-Type='application/pdf'
Content-Disposition: filename="hogehoge.pdf";
Si vous définissez les paramètres ci-dessus dans la vue de Django, cela ressemblera à ceci.
Le fait est qu'au lieu de définir le nom de fichier normalement, le nom de fichier encodé en URL est défini. J'ai l'impression de pouvoir y aller quand je peux utiliser ce paramètre, mais certains navigateurs ont des caractères déformés.
view.py
from django.views.generic import View
import urllib.parse
class DownloadTestView(View):
def get(self, request):
test_filename = 'test.pdf'
response = HttpResponse(status=200, content_type='application/pdf')
"""
~ Quelque chose comme le traitement de la génération PDF ~
"""
response['Content-Disposition'] = "filename='{}'".format(urllib.parse.quote(test_filename))
return response
Le fait que le comportement diffère selon le navigateur signifie que le traitement doit être modifié en fonction du navigateur. Si vous regardez le champ User-Agent de la requête http, vous pouvez voir le nom du navigateur qui y a accédé, donc l'artisan met tout son cœur dans l'instruction if pour chaque navigateur ...
Même si vous ne faites pas quelque chose comme ça, il semble que vous puissiez le gérer en définissant le champ filename * de Content-Diposition.
Référence: [Télécharger le nom du fichier, lutter contre les caractères déformés](http://negiblog.hatenablog.com/entry/2015/06/19/%25e3%2583%2580%25e3%2582%25a6%25e3%2583%25b3 % 25e3% 2583% 25ad% 25e3% 2583% 25bc% 25e3% 2583% 2589% 25e3% 2583% 2595% 25e3% 2582% 25a1% 25e3% 2582% 25a4% 25e3% 2583% 25ab% 25e5% 2590% 258d% 25e3 % 2580% 2581% 25e6% 2596% 2587% 25e5)
Content-Disposition = filename = "filename"; filename * = UTF-8''Nom de fichier encodé en URL;
C'est tout à fait vrai.
Enfin, cela ressemble à ceci lorsqu'il est déposé dans la vue de Django.
view.py
from django.views.generic import View
import urllib.parse
class DownloadTestView(View):
def get(self, request):
test_filename = 'test.pdf'
quoted_filename = urllib.parse.quote(test_filename)
#Incidemment, conforme à la RFC6266("attachment"Ajouter)
# https://tools.ietf.org/html/rfc6266#section-5
response = HttpResponse(status=200, content_type='application/pdf')
"""
~ Quelque chose comme le traitement de la génération PDF ~
"""
response['Content-Disposition'] = "attachment; filename='{}'; filename*=UTF-8''{}".format(quoted_filename, quoted_filename)
return response
En définissant le nom de fichier encodé en URL dans filename *, il peut être utilisé avec différents navigateurs. Nous avons confirmé l'opération sur Chrome, Firefox et Safari.
Recommended Posts