2017-10-04 134 views
0

發送POST請求的二進制文件(Apache的HttpClient的,這裏科特林源代碼):檢索從POST請求

val httpPost = HttpPost("http://localhost:8000") 
val builder = MultipartEntityBuilder.create() 
builder.addBinaryBody("file", File("testFile.zip"), 
     ContentType.APPLICATION_OCTET_STREAM, "file.ext") 
val multipart = builder.build() 
httpPost.entity = multipart 
val r = httpClient.execute(httpPost) 
r.close() 

我收到通過火花Java的請求對象在我的崗位處理的請求作爲。如何從發佈請求中檢索原始文件(加上文件名作爲獎勵)? request.bodyAsBytes()方法似乎添加了一些字節,因爲正文大於原始文件。

感謝,約爾格

回答

0

近斯巴克的文檔頁面的底部有一個部分"Examples and FAQ"。第一個例子是「如何上傳東西?」。 從那裏,它進一步鏈接到example on GitHub

簡而言之:

post("/yourUploadPath", (request, response) -> { 
    request.attribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement("/temp")); 
    try (InputStream is = request.raw().getPart("file").getInputStream()) { 
     // Use the input stream to create a file 
    } 
    return "File uploaded"; 
}); 

訪問原始文件名:

request.raw().getPart("file").getSubmittedFileName() 

要處理多個文件或部分,我平時也相似,包括在下面(假定只有文件中的代碼多部分編碼上傳):

for (Part part : req.raw().getParts()) { 
    try (InputStream stream = part.getInputStream()) { 
    String filename = part.getSubmittedFileName(); 
    // save the input stream to the filesystem, and the filename to a database 
    } 
} 
+0

感謝您的回覆,但可悲的是這個例子不起作用,因爲重新q.raw()。getParts()或req.raw()。getPart(「file」)只需結束後處理程序的執行。 我跟蹤了調用,並在spark-java的深處,POST請求被標記爲已處理。處理程序仍處於活動狀態,但不會在getParts()或getPart()之外執行。 我是Kotlin的新手,因此我不確定這是否是spark-java Kotlin端口的問題。 – osx

+0

如果執行突然停止,很可能是由於例外。使用\t \t'Spark.exception(Exception.class,(e,request,response) - > {e.printStackTrace();});'作爲一個額外的路徑來確保你看到異常(對不起,Java代碼再次不瞭解Kotlin)。 – cello

+0

再次感謝您的回覆。 JetBrains IDE將代碼轉換爲'Spark.exception(Exception :: class.java,{e,request,response - > e.printStackTrace()})',我能夠找到一個錯誤(沒有多部分消息)。現在代碼歸結爲(編輯的)代碼,給了我一個'java.lang.NullPointerException',因爲'getParts()'返回一個空列表,因此'getPart(「file」)'異常。 POST請求的內容類型是'multipart/form-data;邊界= Z2Dl0386ZA0OMWccx1VRo6h7emmRriXNz'。 – osx