在 spark java 中提供静态文件

serving static files in 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 "";
    }
});

我设法通过不使用 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;
            }

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

为了帮助可能遇到我的问题的其他人:我试图 运行 我的 Spark 2.1 应用程序在 Tomcat 下,而不是单独运行。如此配置后,如果您设置静态文件路径,SparkFilter class 将贪婪地为静态文件位置下的所有内容提供服务,而不给您的路由响应的机会。它将使用 getWriter() 调用,从而破坏静态文件位置下可能存在的所有二进制数据。

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

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