[PYTHON] Djnago Hinweis Japanisch für Dateinamen für Inhaltsdisposition festlegen

Nachtrag 2020/2/7 Ein Kollege wies darauf hin und nahm folgende Korrekturen vor: Bogen:

--url codiert den Wert von Dateiname =

Zweck

Ich möchte eine Datei mit einem japanischen Dateinamen (Dateiname einschließlich einer Multibyte-Zeichenfolge) als Antwort auf eine Anfrage herunterladen. Dies gilt für alle Web-Apps, nicht nur für Django.

Umgebung

Django: 1.10.xx Python: 3 Serien

Content-Diposition

Wenn Sie eine Datei über http herunterladen, müssen Sie das Feld Inhaltsdisposition der Antwort festlegen. Hier können Sie den Dateinamen zum Zeitpunkt des Downloads angeben, ob der Download sofort ausgeführt werden soll usw.

Content-Type='application/pdf'
Content-Disposition: filename="hogehoge.pdf";

Django View

Wenn Sie die obigen Einstellungen in Djangos Ansicht vornehmen, sieht dies folgendermaßen aus.

Der Punkt ist, dass anstatt den Dateinamen normal festzulegen, der URL-codierte Dateiname festgelegt wird. Ich habe das Gefühl, ich kann gehen, wenn ich mit dieser Einstellung gehen kann, aber einige Browser haben verstümmelte Zeichen.

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')
        """
~ Etwas PDF-Generierungsverarbeitung ~
        """
        response['Content-Disposition'] = "filename='{}'".format(urllib.parse.quote(test_filename))
        return response

Lösung

Die Tatsache, dass das Verhalten je nach Browser unterschiedlich ist, bedeutet, dass die Verarbeitung je nach Browser geändert werden sollte. Wenn Sie sich das User-Agent-Feld der http-Anfrage ansehen, sehen Sie den Namen des Browsers, der darauf zugegriffen hat, sodass der Handwerker sein Herz in die if-Anweisung für jeden Browser legt ...

Selbst wenn Sie so etwas nicht tun, können Sie anscheinend damit umgehen, indem Sie das Feld Dateiname * von Content-Diposition festlegen.

Referenz: [Dateiname herunterladen, gegen verstümmelte Zeichen kämpfen](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 = Dateiname = "Dateiname"; Dateiname * = UTF-8''URL-codierter Dateiname;

Das ist ganz so.

Fazit

Als ich es endlich in die Sicht von Django stellte, sieht es so aus.

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)

        #Übrigens RFC6266-konform("attachment"Hinzufügen)
        # https://tools.ietf.org/html/rfc6266#section-5
        response = HttpResponse(status=200, content_type='application/pdf')
        """
~ Etwas PDF-Generierungsverarbeitung ~
        """
        response['Content-Disposition'] = "attachment;  filename='{}'; filename*=UTF-8''{}".format(quoted_filename, quoted_filename)
        return response

Durch Festlegen des URL-codierten Dateinamens in Dateiname * kann dieser mit verschiedenen Browsern verwendet werden. Wir haben den Vorgang in Chrome, Firefox und Safari bestätigt.

Recommended Posts

Djnago Hinweis Japanisch für Dateinamen für Inhaltsdisposition festlegen
So stellen Sie die Serverzeit auf japanische Zeit ein
[Python] Memo zur Übersetzung von Matplotlib ins Japanische [Windows]
[Einführung in cx_Oracle] (5.) Umgang mit japanischen Daten
Verfahren zum Einstellen des Wasserstoffs des Atoms (virtuelle Umgebung)
Memo mit Python mit HiveServer2 von EMR verbunden
Hinweise zur Verwendung von AIST Spacon ABCI
Ein Memo zum visuellen Verstehen der Achse von Pandas.Panel
Hinweise zur Verwendung beim Kombinieren von pandas.DataFrame
Memo zur Bereitstellung von Django × Postgresql auf Docker für Heroku
[Blender] So legen Sie die Auswahlelemente von EnumProperty dynamisch fest
Setzen Sie die angegebene Spalte von QTableWidget auf ReadOnly StyledItemDelegate