JSP-download - application/octet-stream
Ich habe eine Seite in JSP-Liste-Datei, die heruntergeladen werden können durch einen Benutzer.
Thoses Dateien nicht auf dem lokalen server sind Sie auf einem remote-Datei-server.
Wenn der Benutzer klicken Sie zum herunterladen einer Datei, die webserver-Verbindung über TCP auf den file-server. Der web-server die Datei herunterladen und erstellen Sie eine HTTP-Antwort für den client.
Hier ist mein code:
<%@page language="java"%>
<%@page import="sun.misc.Request"%>
<%@page import="listing.ClientTCPStockage"%>
<%@page import="java.net.InetAddress"%>
<%
out.clearBuffer();
String nomFichier = request.getParameter("fichier");
String adresseStockage = request.getParameter("adresseStockage");
ClientTCPStockage clientStockage = new ClientTCPStockage(InetAddress.getByName(adresseStockage), 2004);
byte donneeFichier[] = clientStockage.getDonneesFichier(nomFichier);
response.setHeader("Content-Disposition", "attachment;filename=\"" + nomFichier + "\"");
response.setHeader("Content-Type", "application/octet-stream;");
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Length", String.valueOf(donneeFichier.length));
for(int i = 0; i < donneeFichier.length; i++){
out.write(donneeFichier[i]);
}
%>
Diese arbeitet völlig in Ordnung für text-basierte Datei, wie .csv oder normal .txt
aber Es funktioniert nicht für andere geben möchten .mp3 oder .jpeg.. die Dateien beschädigt.
Ich denke, es ist ein problem mit meine Codierung, aber ich kann nicht finden, wo..
Hier ist der HTTP-Header der Antwort:
HTTP/1.x 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: attachment;filename="test.mp3"
Accept-Ranges: bytes
Content-Type: application/octet-stream;
Content-Length: 5387668
Date: Sun, 20 Dec 2009 18:52:18 GMT
Dank.
- ClientTCPStockage die Verbindung zum Datei-server und greifen Sie die Datei als byteArray. An diesem Punkt der Inhalt ist gültig, weil, wenn ich versucht, um es wieder auf die Festplatte als Datei funktioniert es tadellos. Daten zu erhalten korrupten, wenn ich die Ausgabe als HTTP-response
- Wahrscheinlich dup: siehe stackoverflow.com/questions/1776142/... für die Tücken des Schreibens auf eine
OutputStream
von JSP.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn gezwungen, verwenden Sie jsp (und nicht ein servlet), können Sie einen Blick auf dieses how-to
Es nutzt die
ServletOutputStream
, welche mehr für binäre Inhalten, sondern als eineJspWriter
.Beachten Sie auch die Einstellungen zum trimmen der Leerzeichen.
out
unintuitively bezieht sich auf dieWriter
, nicht dieOutputStream
.JSP ist die view-Technologie. Alles, was außerhalb der scriptlets
<% %>
werden gedruckt auf die Antwort, inklusive whitespace-Zeichen wie Zeilenumbrüche. Es wäre sicherlich korrupte binäre Dateien.Könnten Sie schneiden den Leerraum in der JSP-Datei, aber scriptlets sind entmutigt, seit einem Jahrzehnt und heute als schlechte Praxis. Raw Java-code gehört in den Java-Klassen, die nicht in JSP-Dateien. Die wirkliche Lösung ist die Verwendung eines
Servlet
für diese.Erstellen Sie eine Klasse, die
extends HttpServlet
implementieren Sie diedoGet()
Methode, bewegen Sie den Java-code aus der JSP-Datei, die in dieser Methode anzeigen dieses servlet auf eine bestimmteurl-pattern
und sollte dein problem verschwinden. Finden Sie hier eine basic Beispiel-servlet.Abgesehen von diesem problem ist, dass Sie speichern die gesamte Datei in ein
byte[]
statt in einemInputStream
. Ich bin nicht sicher, was IhreClientTCPStockage
tatsächlich tut, aber ich würde vorschlagen, zu beheben, der sowie. Weil jedesbyte
einerbyte[]
Kosten effektiv ein byte-JVM Speicher. Stell dir vor, du hast 128 MB JVM-Arbeitsspeicher und, dass es mehr als 10 Benutzer gleichzeitig ausführen dieses Stück code mit einer Datei, die größer als 12.8 MB. Ja,OutOfMemoryError
.<%@page language="java"%><%@page import="sun.misc.Request"%><%@page import="listing.ClientTCPStockage"%><%@page import="java.net.InetAddress"%><%
und die jsp-Seite würde wahrscheinlich funktionieren. Einige Tage haben Sie gerade gotta get Dinge getan, ohne zu überarbeiten alle Ihre jsps in Servlets. 🙂%>
.clearBuffer()
wird nicht klar, was bereits geleert wurde an den client. Und es wird nicht werfen-ohne Ausnahme-entweder (clear()
wird). Squishing Linien 1-6 zusammen ist zumindest einen Versuch Wert. Lassen Sie uns wissen, wenn es funktioniert.<% %>
Dinge (Leerzeichen, Zeilenumbrüche, etc) und auch sicherstellen, dass Ihre JSP-Datei noch nicht gespeichert mit einer Stückliste.