我正在尝试编写java代码以完成此命令的操作:
curl -F "image=@image.jpg" -F "param1=some-value" -F "param2=some_value" http://example.com
我正在尝试这样的事情:
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost poster = new HttpPost("http://example.com");
MultipartEntityBuilder mpEntityBuilder = MultipartEntityBuilder.create();
mpEntityBuilder.addPart("param1", new StringBody("some-value"));
mpEntityBuilder.addPart("param2", new StringBody("some-value"));
mpEntity.addPart("image", getImage("some-image"));
poster.setEntity(mpEntityBuilder .build());
HttpResponse response = httpClient.execute(poster);
这里getImage(String)返回一个ByteArrayBody。 (我实际上是在飞行中从网上下载图像,而不是像curl命令那样从磁盘上读取,但我认为这不会产生影响)
我检查了这个链接,但它并没有完全解决你同时发送图像和文本参数的情况: Java Equivalent of curl query
奇怪的是,我使用几乎相同的代码将HTTP发布到另一个API,当我需要单独发送图像而没有任何文本参数时,该API工作正常。 (没有字符串)
但是当我尝试发送一个图像(作为ByteArrayBody)和一些文本(作为StringBody)时,我从服务器收到一条含有以下内容的神秘错误消息: '无法使用mimeType初始化参数对象:application / octet-stream'。这可能是一个自定义错误消息,所以我真的找不到很多关于此的信息。
我尝试使用StringBody()的一些其他构造函数,因为这个不推荐使用,但它没有帮助。不确定使用什么是正确的构造函数,但不确定这是否会导致问题。
编辑:好像以前有人问了一个非常相似的问题,但解决方案对我不起作用: Android: upload file with filling out POST body together 我收到一条错误消息 使用mimeType参数初始化失败:application / octet-stream)
答案 0 :(得分:1)
我没有看到它的文件记录,但curl -F @
显然试图帮助填写Content-type
以填写某些扩展名/后缀,包括image/jpeg
.jpg
。 HttpClient没有,默认一切都是MIME'我不知道'键入application/octet-stream
,这可能会导致您的错误。 使用设置内容类型的3-arg ctor
new ByteArrayBody (data, ContentType.create("image/jpeg"), null)
或者如果你想指定文件名属性,curl -F @
也可以,但网络服务器(与浏览器不同)通常不关心,提供{{1}代替String
第三个参数。