[JAVA] Herunterladen von Dateien (Servlet, HTML, Apache, Tomcat)

Wir haben die Einstellungen für das Herunterladen von Dateien auf einem Websystem durch Verknüpfung von Tomcat und Apache zusammengefasst. [Bestätigte Umgebung]

Umgebung zum Zeitpunkt der Bestätigung

Mit Servlet herunterladen

Stellen Sie den Inhaltstyp auf "application / octat-stream"

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.

Setzen Sie den Wert des Content-Disposition-Headers auf "Anhang"

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

Standarddateiname zum Zeitpunkt des Downloads

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 + "\"");

Sowohl "Dateiname" als auch "Dateiname *"

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

Doppelte Anführungszeichen für 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".

Laden Sie Dateien unter Apache herunter

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.)

 # %

Laden Sie als HTML ein Element herunter

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="&#x5c;/:*?&quot;&lt;&gt;|.png ">Download</a>

Vorsichtsmaßnahmen beim Herunterladen von Dateien unter Tomcat

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

Herunterladen von Dateien (Servlet, HTML, Apache, Tomcat)
So laden Sie eine ältere Version von Apache Tomcat herunter
Erstellen Sie ein Java-Servlet und eine JSP-WAR-Datei für die Bereitstellung auf Apache Tomcat 9 mit Gradle
So erreichen Sie den Dateidownload mit Feign
So springen Sie von Eclipse Java zu einer SQL-Datei
So konvertieren Sie eine Datei in ein Byte-Array in Java
Wie hinterlasse ich einen Kommentar?
Verwendung von Apache POI
So fügen Sie ein Video ein
So erstellen Sie eine Methode
So fordern Sie mit jMeter eine CSV-Datei als JSON an
[Ruby] So teilen Sie jede GraphQL-Abfrage in Dateien auf
So stellen Sie eine einfache Java-Servlet-App auf Heroku bereit
So registrieren Sie sich mit Tomcat als Kunde in Square
Verwendung des Bereichs (JSP & Servlet)
So erstellen Sie eine JAR-Datei und eine War-Datei mit dem Befehl jar
SCP überträgt War-Datei an Tomcat
So erstellen Sie eine JAR-Datei ohne Abhängigkeiten in Maven
So erstellen Sie einen Java-Container
Wie unterschreibe ich Minecraft MOD?
So erstellen Sie einen JDBC-Treiber
So konvertieren Sie erb-Datei in haml
So laden Sie eine Spring-Upload-Datei und zeigen ihren Inhalt an
So lesen Sie eine Datei und behandeln sie als Standardeingabe
[Swift] So senden Sie eine Benachrichtigung
So erstellen Sie einen Begrüßungsbildschirm
So erstellen Sie ein Jenkins-Plug-In
Wie erstelle ich ein Maven-Projekt?
[Anfänger] So löschen Sie NO FILE
So öffnen Sie eine Skriptdatei von Ubuntu mit VS-Code
[chown] So ändern Sie den Eigentümer einer Datei oder eines Verzeichnisses
So erstellen Sie ein Java-Array
So wechseln Sie von HTML zu Haml
[IntelliJ IDEA] So fügen Sie beim Speichern einer Java-Datei automatisch final hinzu
So führen Sie eine GIF-Datei über die Linux-Befehlszeile aus (Ubuntu)
So finden Sie heraus, welche Java-Version der Klassendatei kompiliert wurde
So starten Sie einen Docker-Container mit einem in einer Batchdatei bereitgestellten Volume
So führen Sie einen Vertrag mit web3j aus
So sortieren Sie eine Liste mit Comparator
So erstellen Sie eine Java-Kalenderzusammenfassung
Ein Memorandum zur Verwendung von Eclipse
[Java] Verwendung der File-Klasse
[Basic] So schreiben Sie ein Dockerfile Selbstlernend ②
So fügen Sie ein Video in Rails ein
So fügen Sie einen neuen Hash / Array hinzu
So fügen Sie eine JAR-Datei in ScalaIDE hinzu
[Einführung in Java] So schreiben Sie ein Java-Programm
Wie erstelle ich einen Discord Bot (Java)
Java: So senden Sie Werte von Servlet zu Servlet
[Servlet / Ajax] So lösen Sie NoClassDefFoundError [Eclipse]
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
[Rails] So erstellen Sie eine Teilvorlage
[Einführung in JSP + Servlet] Eine kleine Animation ♬