2009-07-15 5 views
1

Ich denke, es ist durchaus möglich, aber ich bin mir nicht sicher.Ist es möglich, eine Binärdatei von JSP herunterzuladen?

ich nicht direkt die Möglichkeit hat, Servlet zu verwenden, so dass ich JSP verwenden gezwungen (lange Geschichte, die kurze Zeit, die Sie nicht wollen hören)

So etwas wie die folgend Ich denke, tun:

// PSEUDO-CODE: 
// source.jsp 
Download your file 
<a href="file.jsp?xyz">MyDocument.doc</a> 


// file.jsp 
<%@page content-type="applicaton/somethig-binary-xyz"%> 
byte[] data = getBinaryFromSomeWhere(); 

int start = 0; 
int end = data.length < 1024 ? data.length : 1024; 
int written = 0; 
while(written < data.length) { 
    out.write(data, start, end); 
    writtern += end; 
    start = end; 
    end += written + data.length < 1024 ? data.length : 1024; 
} 

%> 

legen Sie zu viel Aufmerksamkeit auf den Code nicht. Es zeigt nur die Idee. Er schreibt das Bynary-Array in den jsp-Ausgabestrom.

Ist es möglich? Klingt das vernünftig? Gibt es eine JSTL oder eine andere Sache, die das schon erledigt?

Antwort

2

Ja, verwenden Sie "application/octet-stream" für generische Binärdaten. Und entfernen Sie jeden Zeilenumbruch/Leerzeichen aus den Import-Tags und um die Scriptlets.

<%@ page contentType="applicaton/octet-stream" %><% 
byte[] data = getBinaryFromSomeWhere(request.getParameter("xyz")); 
response.setHeader("Content-length", Integer.toString(data.length)); 
response.setHeader("Content-Disposition", "attachment; filename=xyz.bin"); 
response.getOutputStream().write(data, 0, data.length); 
response.getOutputStream().flush(); 
%> 
+0

'contentType'. 'content-type 'schlägt bei Liferay 6 fehl. Stack Overflow lässt mich keine einzelnen Char-Edits vorschlagen. –

+0

'java.io.Writer' hat' write (..) 'Methoden, die' char [] 'als Argument verwenden, aber keine Methoden für' byte [] '(zumindest in Java 7). –

+0

Stattdessen bevorzugen: <% @ page contentType = "application/octet-stream"%><% byte [] daten = getBinaryFromSomeWhere (request.getParameter ("xyz")); response.setHeader ("Inhaltslänge", Integer.toString (data.length)); response.setHeader ("Content-Disposition", "Anhang; Dateiname = xyz.bin"); response.getOutputStream(). Write (Daten, 0, data.length); response.getOutputStream(). Flush(); %> – Mike

Verwandte Themen