2

クラスパスから提供する静的ファイルの複雑な階層があり、http://sparkjava.com/documentation.html#static-filesの例は私のニーズに適合しません。

ルートでこれを実行しようとしましたが、単純な png は配信されません。より良い方法はありますか?

get("/assets/*", new Route() {
    @Override
    Object handle(Request request, Response response) throws Exception {
        String path = request.pathInfo().replaceFirst("/assets/", "/somepathtoassets/");
        InputStream inputStream = getClass().getResourceAsStream(path);
        if (inputStream != null) {
            response.type("image/png");
            response.status(200);
            Writer writer = response.raw().getWriter();
            IOUtils.copy(inputStream, writer);
            writer.close();
            inputStream.close();
        }
        return "";
    }
});
4

2 に答える 2

2

IOUtils.copy を使用せずに手動でコピーすることで、これを解決できました。バイトバッファ付き。

            InputStream inputStream = loadingClass.getResourceAsStream(path);
            if (inputStream != null) {
                response.type(getContentType(path));
                response.status(200);

                byte[] buf = new byte[1024];
                OutputStream os = response.raw().getOutputStream()
                OutputStreamWriter outWriter = new OutputStreamWriter(os);
                int count = 0;
                while ((count = inputStream.read(buf)) >= 0) {
                    os.write(buf, 0, count);
                }
                inputStream.close();
                outWriter.close();

                return "";
            } else {
                return null;
            }
于 2015-04-20T09:26:31.847 に答える
1

この質問が最も役に立ちましたが、コンテキストが少し異なります。まず、呼び出しによって返されたインスタンスが文字データのみを処理するIOUtils.copyため、スニペットは失敗します。2 番目のスニペットは、返されたがバイナリ データを処理するため機能します。PrintWriterresponse.raw().getWriter()response.raw().getOutputStream()

私の問題を抱えている可能性のあるこれに出くわす可能性のある他の人を助けるために、スタンドアロンではなく、Tomcat で Spark 2.1 アプリケーションを実行しようとしていました。そのように構成すると、SparkFilterクラスは、静的ファイル パスを設定すると、ルートに応答する機会を与えずに、静的ファイルの場所にあるすべてのものを貪欲に提供します。また、呼び出しを使用するためgetWriter()、静的ファイルの場所にある可能性のあるバイナリ データが破損します。

したがって、静的なバイナリ データを提供し、SparkFilterそれを使用してアプリケーションを実行する場合は、バイナリ データ用に独自のルート ハンドラを記述し、バイナリ データが静的ファイル パスの外にあることを確認する必要があるようです。 、それらを使用することを選択した場合。

スタンドアロンで実行する場合とサーブレット エンジンで実行する場合の論理セマンティクスが大きく異なることは、ちょっと残念です。

于 2015-05-07T01:13:02.833 に答える