我有一个使用spark编写的java应用程序(不是apache spark,而是spark-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";
});
由于
答案 0 :(得分:0)
鉴于您的使用案例 - 第三方库读取的潜在大文件上传 - 我会绕过Spark的/ 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 ,因此这可能就是您要查找的内容(以避免缓冲JVM内存中的整个InputStream
内容。)