Nachtrag 2020/2/7 Ein Kollege wies darauf hin und nahm folgende Korrekturen vor: Bogen:
--url codiert den Wert von Dateiname =
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.
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";
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
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.
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