2010-01-22 11 views
8

Dies kann total blöd klingen, aber es ist ein Fall des wirklichen Lebens :(Wie kann ich eine Datei mit JSP bereitstellen? .

Ich bin der Lage, eine HTML-Tabelle mit einer „virtuellen“ Link-Namen angezeigt werden

Etwas wie folgt aus:

Xyz description <a href="docId=123">document.doc</a> 

Xyz description <a href="docId=456">documentB.doc</a> 

Xyz description <a href="docId=798">documentC.doc</a> 

Diese Dokument-ID stellt eine ID in der Datenbank

wie auch immer (für diese Dokumente in einem Blob als byte [] gespeichert werden). ich bin in der Lage, diese ID zu bekommen, um die Datenbank abzufragen und die Byte abrufen [] (und speichern Sie es sogar in einer tmp-Datei)

Was ich nicht herausfinden kann, ist, dass, wenn der Benutzer auf den Link klickt (und nachdem ich den db-Abruf ausführen) das Byte [] an den Benutzer "dienen".

Nun der allerschlimmste Teil, und was mich dazu bringt, diese Frage hier zu stellen, ist, dass ich dies nur mit JSP (ohne Servlet) und ohne 3rd Party Libraries (nur ... frag mich nicht, warum ich hasse es auch)

So. Wie diene ich in einem jsp den binären Inhalt eines Byte-Array in dem Server-Dateisystem gespeichert

Mein erster Gast ist:

<% 
InputStream read // read the file form the fle system 
response.getOutputStream().write(theBytesReader); 
%> 

Bin ich in der Nähe der Lösung?

Würde dies für den Client funktionieren, als ob er wirklich auf dem Server für eine echte Datei geklickt hätte?

Vielen Dank im Voraus.

Antwort

5

Um den Punkt, schreiben Sie einfach den gleichen Code in JSP wie Sie in einem Servlet class tun würden. Sie können es praktisch kopieren. Stellen Sie nur sicher, dass Sie nicht sind, die einen beliebigen Schablonentext in den Stream schreiben, einschließlich Zeilenumbrüche und Leerzeichen außerhalb der Scriptlets. Sonst würde es auch in die Binärdatei geschrieben und korrumpiert werden.

Wenn Sie mehrere Scriptlet-Blöcke haben, müssen Sie sie so arrangieren, dass zwischen der Endung %> eines Scriptlet und dem Start <% des nächsten Scriptlet kein Zeilenumbruch stattfindet. Somit, z.B.

<%@page import="java.io.InputStream" %><% 
    //... 
%> 

statt

<%@page import="java.io.InputStream" %> 
<% 
    //... 
%> 
+0

Fügen Sie den Code wie von BalusC angegeben in die JSP-Datei ein, verwenden Sie jedoch out.clear();, um die Ausgabe zu löschen, anstatt die Seitenformatierung zu verfälschen. –

1

So etwas ...

InputStream instr = null; 
try { 
    instr = new BufferedInputStream(new FileInputStream("file.txt")); 
    for(int x=instr.read(); x!=-1; x=instr.read()){ 
     out.write(x); 
    } 
} finally { 
    out.close(); 
    if(instr != null) instr.close(); 
} 

Sie müssen dies als Antwort auf den Klick (entweder auf einer Seite neu geladen oder in einer anderen jsp-Datei).

Es gibt bessere Pufferlösungen, die Sie mit dem Schreiben unter Verwendung von Bytearrays anstatt einzeln durchführen können ... Ich überlasse das für Sie.

Sorry, Sie stecken in JSP Scriptlet Land ... Hoffe das hilft.

+0

Sie müssen den MIME-Typ in der Antwort auch wie in meinem Beispiel setzen. –

+0

Wahr ... Ich habe diesen Teil angenommen, danke für die Klärung. – cjstehno

2

Sie müssen den MIME-Typ in der HTTP-Antwort wie unten neben dem von Ihnen bereitgestellten Beispielcode festlegen.

Hinweis, der MIME-Typ application/octet-stream wird verwendet, um eine Binärdatei anzugeben.

+0

Ja, ich habe das schon, eigentlich benutze ich wie: 'application/vnd.ms-excel' aber meine eigentliche Frage ist, würde diese Methode funktionieren? (lesen und schreiben mit response.out?) – OscarRyz

+0

Ja, sollte es so lange wie der MIME-Typ korrekt ist. –

+0

Tatsächlich tun Leute dies ziemlich oft, um dynamische Bilder zu liefern, wo Sie eine Bild-URL haben, die etwas wie /foo/bar/yourImage.jsp ist und das Bild dynamisch versorgt, indem Sie die Bytes des Bildes zurückgeben sowie image/gif setzen oder ähnlich wie der Inhaltstyp. –

2

Bitte, bitte, bitte tu das nicht.

Sie machen Ihren Benutzern einen schlechten Dienst.

HTTP ist erstaunlich reich in Bezug auf was es mit Dateien tun kann. Caching, Chunking, Direktzugriff usw.

Werfen Sie einen Blick auf so etwas wie FileServlet und hämmern Sie das, um zu passen. Ja, es ist ein Servlet und keine JSP, aber das ist es, was Sie tun wollen, um ein guter HTTP-Bürger zu sein.

Einige Container haben andere Optionen, die Sie verwenden können, Sie Tomcats DefaultServlet hacken usw.

+0

Dies ist keine Antwort auf meine Frage, sondern ein Kommentar, ich weiß, dass dies mit Servlets erreicht werden könnte, aber wenn Sie meine Frage lesen, ist dies keine Option :(Es tut mir leid, aber Ihre Antwort ist nicht hilfreich – OscarRyz

+0

Eine JSP ist ein Servlet, Sie können 99% des Codes so gut wie möglich in Ihre JSP einbetten und das gleiche bekommen. –

Verwandte Themen