3

サーブレットを使用して、プロジェクトから保存された画像を取得します。私のサーブレットのコードは次のとおりです。

String file = request.getParameter("file"); 
BufferedInputStream in = new BufferedInputStream(new FileInputStream(directory + file));
// Get image contents.
byte[] bytes = new byte[in.available()];
in.read(bytes);
in.close();
// Write image contents to response.
response.getOutputStream().write(bytes);

HTML イメージ タグは次のようになります。

<img src="/images/?file=example.jpg" />

すべてが良いです。しかし、今では、次のようにリクエスト パラメータとしてではなく、URI に画像ファイル名を指定したいと考えています。

<img src="/images/example.jpg" />

どうすれば達成できますか?

4

1 に答える 1

4

/images/*明らかに正確な URL パターンではなく 、プレフィックス URL パターンにサーブレットをマップします/images。すると、そのまま URL を指定して、 でファイル名を URI パス情報として取得できますHttpServletRequest#getPathInfo()

キックオフの例:

@WebServlet("/images/*")
public class ImageServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String filename = request.getPathInfo().substring(1);
        File file = new File(directory, filename);
        response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
        response.setHeader("Content-Length", String.valueOf(file.length()));
        Files.copy(file.toPath(), response.getOutputStream());
    }

}

具体的な問題InputStream#available()とは関係ありません。最初のコードのように、明らかに思っていたことを実行しません。コンテンツ全体の長さは返されません。ディスク ファイル システム I/OIe をブロックせずにコードが読み取ることができる最初のブロックの長さを返すだけです。つまり、現在 I/O バッファーにあるコンテンツの長さを返します。これは必ずしもコンテンツ全体の長さを表しているわけではありません! 確かに大きな画像ではありません。Java 7 を使用しているFiles#copy()場合、上記のように可能な限り少ない量のコードでジョブを達成することが唯一の目的である場合にのみ使用してください。

于 2013-09-13T14:30:43.563 に答える