Wir haben die Einstellungen für das Herunterladen von Dateien auf einem Websystem durch Verknüpfung von Tomcat und Apache zusammengefasst. [Bestätigte Umgebung]
response.setContentType("application/octet-stream");
response.getWriter().write("Hello World");
https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types
Dies ist der Standardwert für Dateien im Binärformat. Es stellt tatsächlich eine unbekannte Datei im Binärformat dar, und der Browser führt sie normalerweise nicht automatisch aus oder fragt, ob sie ausgeführt werden soll. Sie behandeln den Wert des Content-Disposition-Headers wie einen Anhang und schlagen vor, die Datei als 'zu speichern.
Wie oben erwähnt, können Sie es herunterladen, indem Sie als Inhaltstyp "application / octat-stream" angeben. Wenn Sie jedoch den Dateityp kennen, der heruntergeladen werden soll, ist es seltsam, "application / octat-stream" anzugeben.
Wie unten gezeigt, können Sie, wenn Sie im Header "Content-Disposition" "Anhang" angeben, auch dann herunterladen, wenn der Inhaltstyp nicht "application / octat-stream" ist.
response.setContentType("text/html");
response.setHeader("Content-Disposition","attachment");
response.getWriter().write("Hello World");
Der für "Dateiname" angegebene Wert ist der Standarddateiname zum Zeitpunkt des Downloads.
response.setHeader("Content-Disposition","attachment;filename=\"sample.html\"");
// attachment;filename="sample.html"
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
When used in combination with Content-Disposition: attachment, it is used as the default filename for an eventual 'Save As" dialog presented to the user.
Wenn der Dateiname Doppelbytezeichen enthält, verwenden Sie "Dateiname *".
String encodedFilename = URLEncoder.encode("Stichprobe.html", "UTF-8");
response.setHeader("Content-Disposition","attachment;filename*=\"UTF-8''" + encodedFilename + "\"");
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
The parameters "filename" and "filename*" differ only in that "filename*" uses the encoding defined in RFC 5987. When both "filename" and "filename*" are present in a single header field value, "filename*" is preferred over "filename" when both are present and understood.
Bitte beachten Sie, dass Leerzeichen mit halber Breite in das Pluszeichen "+" konvertiert werden. Der folgende Code hat den Dateinamen "a + b.html".
String encodedFilename = URLEncoder.encode("a b.html", "UTF-8");
response.setHeader("Content-Disposition","attachment;filename*=\"UTF-8''" + encodedFilename + "\"");
Dies ist eine Java URL Encoder-Spezifikation. https://docs.oracle.com/javase/jp/8/docs/api/java/net/URLEncoder.html
Das Leerzeichen "" wird in das Pluszeichen "+" umgewandelt.
Wenn Sie "+" durch "% 20" ersetzen, wird im Dateinamen ein Leerzeichen angezeigt. Übrigens hat URLEncode je nach Sprache Dialekte, daher werde ich nicht darauf eingehen. .. .. https://www.glamenv-septzen.net/view/1170
Zeichen, die im Dateinamen nicht verwendet werden können, werden in Unterstriche konvertiert. Der folgende Code hat den Dateinamen "_________. Html".
// ¥ / : * ? " < > |Dateiname einschließlich
String encodedFilename = URLEncoder.encode("\\/:*\"<>|.html", "UTF-8");
response.setHeader("Content-Disposition","attachment;filename*=\"UTF-8''" + encodedFilename + "\"");
Wenn Sie sowohl "Dateiname" als auch "Dateiname *" wie unten gezeigt schreiben, wird "Dateiname" ignoriert, wenn "Dateiname *" gültig ist. Wenn Sie einen Browser in Betracht ziehen, der "Dateiname *" nicht unterstützt (gibt es 2017 einen solchen Browser?), Scheint es gut, ihn zusammen zu schreiben.
String encodedFilename = URLEncoder.encode("Stichprobe.html", "UTF-8");
response.setHeader("Content-Disposition","attachment;" +
"filename=\"sample.html\"" +
"filename*=\"UTF-8''" + encodedFilename + "\"");
Therefore, when both "filename" and "filename*" are present in a single header field value, recipients SHOULD pick "filename*" and ignore "filename".
filaname *
Im RFC 6266-Beispiel hat "Dateiname" ein doppeltes Anführungszeichen, "Dateiname *" jedoch nicht.
Content-Disposition: attachment;
filename="EURO rates";
filename*=utf-8''%e2%82%ac%20rates
Wenn "Dateiname *" in doppelte Anführungszeichen gesetzt wird ("Dateiname * =" utf-8''sample.html ""), lautet das Download-Ergebnis jedes Browsers wie folgt.
Anders als bei Firefox wurde "Dateiname *" ignoriert und der Dateiname war "Download".
Aktivieren Sie mod_headers und geben Sie den Content-Disposition-Header an. Der folgende Code lädt alle XML-Dateien unter Apache herunter.
LoadModule headers_module modules/mod_headers.so
<FilesMatch "\.(xml)$">
Header set Content-Disposition attachment
</FilesMatch>
[Referenzseite] http://qiita.com/kompiro/items/ac60721bc43625a057dc
Wenn Sie auf "http: // sample.co.jp / sample.xml" zugreifen, wird es mit dem Dateinamen "sample.xml" heruntergeladen. Beachten Sie, dass der Dateiname in der URL enthalten ist. Wenn der Dateiname Zeichen enthält, die als URL eine besondere Bedeutung haben, wird er nicht korrekt heruntergeladen. Dateinamen mit den folgenden Zeichen wurden nicht korrekt heruntergeladen. (Wenden Sie sich an Firefox. Es ist nicht bekannt, ob dies alle Zeichen sind, die im Dateinamen nicht verwendet werden können.)
# %
Wenn das Download-Attribut im Element a angegeben ist, wird der im Download-Attribut angegebene Wert als Dateiname heruntergeladen. Sie können auch Zeichen voller Breite, Leerzeichen halber Breite und #
verwenden, was als URL eine besondere Bedeutung hat.
IE wird jedoch nicht unterstützt ...
<a href="sample.png " download="Test a b#%.png ">Download</a>
https://developer.mozilla.org/ja/docs/Web/HTML/Element/a
Dieses Attribut weist den Browser an, herunterzuladen, anstatt zur URL zu navigieren, und fordert den Benutzer auf, diese als lokale Datei zu speichern. Wenn Sie einen Wert für das Attribut angeben, wird dieser als Standarddateiname für die Eingabeaufforderung zum Speichern interpretiert (Benutzer können ihn bei Bedarf umbenennen). Es gibt keine Begrenzung für die Werte, die verwendet werden können, aber / und \ werden in Unterstriche konvertiert. Viele Dateisysteme haben Einschränkungen hinsichtlich der Zeichen, die in Dateinamen verwendet werden können, und der Browser kann die Dateinamen anpassen.
<a href="sample.png " download="Test a b#%.png ">Download</a>
Wenn Sie im Download-Attribut "\ /: *?" <> | "Angeben, werden alle in Unterstriche konvertiert (überprüfen Sie dies mit Firefox). Der folgende Code hat den Dateinamen "_________. Html".
<a href="sample.png " download="\/:*?"<>|.png ">Download</a>
Vor Tomcat 7 (?) Lautet die Standardeinstellung für "URIEncoding" "ISO-8859-1". Dieser Zeichencode ist ein lateinischer Zeichensatz und kann kein Japanisch darstellen.
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html#Common_Attributes
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
Wenn Sie eine Datei mit Japanisch herunterladen möchten, müssen Sie den Zeichencode auf UTF-8 setzen.
server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" /><!--← Nachtrag-->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
URIEncoding="UTF-8" /><!--← Nachtrag-->
In Tomcat8 ist der Standardwert UTF-8, sodass Sie ihn nicht angeben müssen.
https://tomcat.apache.org/tomcat-8.0-doc/config/http.html#Common_Attributes
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used.
[Referenzseite] http://qiita.com/kazuki43zoo/items/a365d194f5c4df28912f
Recommended Posts