在spark java中提供静态文件

时间:2015-01-15 12:39:06

标签: spark-java

我有一个复杂的静态文件层次结构,可以从类路径中提供,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 "";
    }
});

2 个答案:

答案 0 :(得分: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;
            }

答案 1 :(得分:1)

我发现这个问题最有帮助,但是在一个稍微不同的背景下。 首先,IOUtils.copy代码段失败,因为PrintWriter调用返回的response.raw().getWriter()实例仅处理字符数据。第二个代码段有效,因为返回的response.raw().getOutputStream()处理二进制数据。

帮助那些可能遇到问题的人偶然发现:我试图在Tomcat下运行我的Spark 2.1应用程序,而不是独立运行。如此配置,如果您设置静态文件路径,SparkFilter类将贪婪地提供静态文件位置下的所有内容,而不会让您的路由有机会响应。它将使用getWriter()调用,从而破坏可能位于静态文件位置下的任何二进制数据。

因此,如果您想提供静态二进制数据,并且希望使用SparkFilter运行应用程序,则看起来您必须为二进制数据编写自己的路由处理程序,然后还要确保二进制数据如果您选择使用它们,数据将存在于静态文件路径之外。

令我感到遗憾的是,独立运行与在Servlet引擎下运行的逻辑语义是如此不同。