8

これは完全にばかげているように聞こえるかもしれませんが、実際の生活の場合です:(

「仮想」リンク名でHTMLテーブルを表示できます。

このようなもの:

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>

このドキュメントIDは、データベース内のIDを表します(これらのドキュメントは、byte []としてblobに保存されます)。

ともかく。そのIDを取得し、データベースにクエリを実行して、byte []を取得することができます(さらに、tmpファイルに保存することもできます)。

方法がわからないのは、ユーザーがリンクをクリックすると(そして、db検索を実行した後)、byte[]をユーザーに「提供」することです。

最悪の部分であり、ここでこの質問をする理由は、JSPのみ(サーブレットなし)でサードパーティライブラリなしでこれを行う必要があることです(ただ...なぜ私もそれを嫌うのか私に聞かないでください)

それで。サーバーファイルシステムに格納されているバイト配列のバイナリコンテンツをjspで提供するにはどうすればよいですか?

私の最初のゲストは:

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

私は解決策に近づいていますか?

これは、クライアントが実際のファイルをサーバーで実際にクリックしたかのように機能しますか?

前もって感謝します。

4

4 に答える 4

5

要するに、サーブレット クラスで行うのと同じコードを JSP で記述するだけです。ほぼコピペできます。テンプレート テキストをストリームに書き込んでいないことだけを確認してください。これには、スクリプトレットの外側の改行や空白が含まれます。そうしないと、バイナリ ファイルにも書き込まれ、破損します。

複数のスクリプトレット ブロックがある場合は、スクリプトレットの終了%>と次のスクリプトレットの開始<%の間に改行がないように配置する必要があります。したがって、例えば

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

それ以外の

<%@page import="java.io.InputStream" %>
<%
    //...
%>
于 2010-01-22T02:29:21.977 に答える
2

提供したサンプルコードに加えて、以下のようにHTTP応答でMIMEタイプを設定する必要があります。

response.setContentType("application/octet-stream");

application / octet-stream MIMEタイプは、バイナリファイルを示すために使用されることに注意してください。

于 2010-01-22T02:16:47.323 に答える
2

どうか、どうか、これをしないでください。

ユーザーに不利益を与えています。

HTTP は、ファイルでできることに関して驚くほど豊富です。キャッシング、チャンキング、ランダム アクセスなど。

FileServletのようなものを見て、それをハンマーで叩いてフィットさせます。はい、これは JSP ではなくサーブレットですが、これは HTTP の優れた市民になるために必要なことです。

一部のコンテナーには、使用できる他のオプションがあり、Tomcats DefaultServlet などをハックできます。

于 2010-01-22T05:24:37.347 に答える
1

このようなもの...

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();
}

これは、クリックへの応答として必要になります(ページのリロードまたは別のjspファイルのいずれかで)。

一度に1つずつではなく、バイト配列を使用した書き込みで実行できるより優れたバッファリングソリューションがあります...それはお任せします。

申し訳ありませんが、JSPスクリプトレットの土地で立ち往生しています...これがお役に立てば幸いです。

于 2010-01-22T02:16:23.117 に答える