Spark 中的 InputStream 和文件上传 Java
InputStream and File Upload in Spark Java
我有一个使用 spark(不是 apache spark,而是 spark-java)编写的 java 应用程序。我只是想获得正在发布的流的句柄,但在我明确这样做之前不会从流中读取。但是,一旦我调用 getInputStream()
,此时似乎正在读取整个文件。难道只有当我尝试从输入流中读取时才会发生这种情况吗?如果我错了,任何人都可以提供有关如何做这样的事情的指导吗?
post("/encrypt", (req, res) -> {
try {
req.attribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement("ProtectCS"));
Part p = req.raw().getPart("uploaded_file");
InputStream input = p.getInputStream();
} catch (Exception e) {
logger.error(e.getMessage());
res.status(500);
return e.getMessage();
}
res.status(201);
return "Success";
});
谢谢
鉴于您的用例 - 第三方库可能读取大文件上传 - 我会绕过 Spark's/Jetty 的多部分支持并使用例如 Apache Commons FileUpload:
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
// Parse the *raw* request
FileItemIterator iter = upload.getItemIterator(request.raw());
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.getInputStream();
if (item.isFormField()) {
System.out.println("Form field " + name + " with value "
+ Streams.asString(stream) + " detected.");
} else {
System.out.println("File field " + name + " with file name "
+ item.getName() + " detected.");
// Process the input stream
...
}
}
Commons FileUpload 文档将此称为 Streaming API,因此这可能就是您要查找的内容(以避免缓冲整个 InputStream
中的内容JVM 内存)。
我有一个使用 spark(不是 apache spark,而是 spark-java)编写的 java 应用程序。我只是想获得正在发布的流的句柄,但在我明确这样做之前不会从流中读取。但是,一旦我调用 getInputStream()
,此时似乎正在读取整个文件。难道只有当我尝试从输入流中读取时才会发生这种情况吗?如果我错了,任何人都可以提供有关如何做这样的事情的指导吗?
post("/encrypt", (req, res) -> {
try {
req.attribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement("ProtectCS"));
Part p = req.raw().getPart("uploaded_file");
InputStream input = p.getInputStream();
} catch (Exception e) {
logger.error(e.getMessage());
res.status(500);
return e.getMessage();
}
res.status(201);
return "Success";
});
谢谢
鉴于您的用例 - 第三方库可能读取大文件上传 - 我会绕过 Spark's/Jetty 的多部分支持并使用例如 Apache Commons FileUpload:
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
// Parse the *raw* request
FileItemIterator iter = upload.getItemIterator(request.raw());
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.getInputStream();
if (item.isFormField()) {
System.out.println("Form field " + name + " with value "
+ Streams.asString(stream) + " detected.");
} else {
System.out.println("File field " + name + " with file name "
+ item.getName() + " detected.");
// Process the input stream
...
}
}
Commons FileUpload 文档将此称为 Streaming API,因此这可能就是您要查找的内容(以避免缓冲整个 InputStream
中的内容JVM 内存)。