2009-07-15 22 views
1

私はそれはかなり可能だと思いますが、わかりません。私が直接サーブレットを使用する可能性を持っていないので、私は、JSPを使用するように強制していJSPからバイナリファイルをダウンロードすることはできますか?

(長い歴史、短い時間、あなたが聞きたくない)

だから私は、次のようなものを考えますするでしょう:

// 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; 
} 

%> 

コードにあまり注意を向けてはいけません。それはアイデアを示すだけです。バイナリ配列をjsp出力ストリームに書き込みます。

可能ですか?それは合理的に聞こえますか?すでにJSTLや他のものがそれを処理していますか?

答えて

2

はい、汎用バイナリデータには "application/octet-stream"を使用してください。また、すべての改行/空白をインポートタグとスクリプトレットの周りから削除します。

<%@ 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'はLiferay 6で失敗します。スタックオーバーフローでは、単一のcharの編集を提案できません。 –

+0

'java.io.Writer'は' char [] 'を引数として' write(..) 'メソッドを持ちますが、(少なくともJava 7では)' byte [] 'のためのメソッドはありません。 –

+0

代わりに<%@ 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(); %> – Mike

関連する問題