【问题标题】:InputStream and File Upload in Spark JavaSpark Java 中的 InputStream 和文件上传
【发布时间】:2017-09-15 01:13:26
【问题描述】:

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

谢谢

【问题讨论】:

  • 请问您为什么要在不读取 InputStream 的情况下获取句柄?
  • 我会从中阅读。更具体地说,我的应用程序是一个代理,我想在其中连接传入流并将其传递给第三方库,该库将从流中读取。流可能很大,所以我不希望我的应用在第 3 方库调用 read 之前缓冲内存中的所有内容。

标签: java spark-java


【解决方案1】:

鉴于您的用例 - 第三方库读取的可能大文件上传 - 我会绕过 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 内容)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2018-11-13
    • 2017-04-14
    • 2012-08-03
    • 1970-01-01
    相关资源
    最近更新 更多