Spark Java中的InputStream和文件上载

时间:2017-09-13 05:21:06

标签: java spark-java

我有一个使用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";
});

由于

1 个答案:

答案 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内容。)