[PYTHON] Djnago Note Set Japanese pour le nom de fichier Content-Disposition

PostScript 2020/2/7 Un collègue a souligné et apporté les corrections suivantes: arc:

--url encode la valeur de filename =

Objectif

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.

environnement

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";

Vue Django

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

Solution

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.

Conclusion

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

Djnago Note Set Japanese pour le nom de fichier Content-Disposition
Comment régler l'heure du serveur sur l'heure japonaise
[Python] Mémo pour traduire Matplotlib en japonais [Windows]
[Introduction à cx_Oracle] (5e) Gestion des données japonaises
Procédure de réglage de l'hydrogène de l'atome (environnement virtuel)
Mémo connecté à HiveServer2 d'EMR avec python
Remarques sur l'utilisation d'AIST Spacon ABCI
Un mémo pour comprendre visuellement l'axe des pandas.
Remarques sur la façon d'utiliser lors de la combinaison de pandas.
Mémo de déploiement de Django × Postgresql sur Docker vers Heroku
[Blender] Comment définir dynamiquement les sélections EnumProperty
Définissez la colonne spécifiée de QTableWidget sur ReadOnly StyledItemDelegate