在 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 引擎下的逻辑语义如此不同。
我有一个复杂的静态文件层次结构要从类路径提供服务,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 引擎下的逻辑语义如此不同。