2017-09-13 228 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內容)。