我有一个复杂的静态文件层次结构,可以从类路径中提供,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 "";
}
});
答案 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引擎下运行的逻辑语义是如此不同。