2017-09-13 231 views
0

我有一个使用spark(不是apache spark,而是spark-java)编写的java应用程序。我只想简单地获取所发布流的句柄,但不能直接从流中读取。但是,只要我拨打电话getInputStream(),就好像整个文件正在被读取。不应该只有当我尝试从输入流中读取时才会发生?如果我错了,任何人都可以提供关于如何做这样的事情的指导?Spark Java中的InputStream和文件上传

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

请问为什么你想在没有读取它的情况下获得InputStream的句柄? – Mithfindel

+0

我将从中读取。更具体地说,我的应用程序是一个代理,我想连接一个传入流并将其传递给第三方,以便从流中读取库。流可能很大,所以我不希望我的应用程序在第三方库甚至调用读取之前将所有内容都缓冲在内存中。 –

回答

0

鉴于你的使用情况 - 潜在的大文件上传由第三方图书馆阅读 - 我将绕过斯巴克的/ 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 
     ... 
    } 
} 

通用FileUpload文档称这是Streaming API,所以这可能是您正在寻找的内容(以避免缓冲JVM内存中的整个InputStream内容)。