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代码片段失败,因为调用PrintWriter返回的实例response.raw().getWriter()只处理字符数据。第二个片段有效,因为返回的response.raw().getOutputStream()处理二进制数据。

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

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

我有点难过,独立运行与在 Servlet 引擎下运行的逻辑语义是如此不同。

于 2015-05-07T01:13:02.833 回答