我正在使用 Apache HttpComponents v4.3.3(maven httpclient 和 httpmime)。我需要上传一个包含一些元数据的文件。有效的 curl 命令如下所示。
curl -k -i -H "Content-Type: multipart/mixed" -X POST --form 'field1=val1' --form 'field2=val2' --form 'file=@somefile.zip;type=application/zip' https://www.some.domain/
我尝试如下模仿这个 curl 帖子。
HttpEntity entity = MultiPartEntityBuilder
.create()
.addPart("field1",new StringBody("val1",ContentType.TEXT_PLAIN))
.addPart("field2",new StringBody("val2",ContentType.TEXT_PLAIN))
.addPart("file", new FileBody(new File("somefile.zip"), ContentType.create("application/zip"))
.build();
HttpPost post = new HttpPost("https://www.some.domain");
post.addHeader("Content-Type", "multipart/mixed");
但是,当我使用HttpClient 执行HttpPost 后,出现如下异常(服务器代码也是运行在Jetty 上的Java)。
org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
当我向 curl 添加跟踪时
curl --trace - -k -i -H "Content-Type: multipart/mixed" -X POST --form 'field1=val1' --form 'field2=val2' --form 'file=@somefile.zip;type=application/zip' https://www.some.domain/
我看到表单字段/值对设置为 HTTP header 。
Content-Disposition: form-data; name=field1...value1
知道我在这里做错了什么吗?感谢您的帮助。
最佳答案
我做了一些修改并做了两件事来让代码正常工作。
- 不再使用 addPart(...)
- 不再设置 Content-Type header
这是修改后的代码片段,以防有人感兴趣。
HttpEntity entity = MultipartEntityBuilder
.create()
.addTextBody("field1","val1")
.addTextBody("field2","val2")
.addBinaryBody("file", new File("somefile.zip"),ContentType.create("application/zip"),"somefile.zip")
.build();
HttpPost post = new HttpPost("https://www.some.domain");
post.setEntity(entity);
我还将 HttpComponents 设置为 Debug模式。
-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog -Dorg.apache.commons.logging.simplelog.showdatetime=true -Dorg.apache.commons.logging.simplelog.log.org.apache.http=DEBUG
事实证明,每个部分现在都有一个边界。更好的是,Content-Type 和边界是自动生成的。
Content-Type: multipart/form-data; boundary=5ejxpaJqXwk2n_3IVZagQ1U0_J_X9MdGvst9n2Tc
关于java - 如何使用 Apache HttpComponentst 创建和发布多部分/混合 http 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23218785/