2017-10-04 116 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