【发布时间】:2016-12-05 09:00:50
【问题描述】:
我正在尝试编写 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,当我需要单独发送没有任何文本参数的图像时,它可以正常工作。 (没有字符串体)
但是当我尝试发送图像(作为 ByteArrayBody)和一些文本(作为 StringBody)时,我从服务器收到一条神秘的错误消息,内容如下: '无法使用 mimeType 初始化参数对象:应用程序/八位字节流'。这可能是一条自定义错误消息,所以我真的找不到太多这方面的信息。
我尝试为 StringBody() 使用其他一些构造函数,因为该构造函数已被弃用,但没有帮助。不确定要使用正确的构造函数,但不确定这是否会导致问题。
编辑:以前好像有人问过一个非常相似的问题,但该解决方案对我不起作用: Android: upload file with filling out POST body together 我收到一条关于 使用 mimeType 初始化参数失败:application/octet-stream)
【问题讨论】:
-
我相信您需要对图像进行 Base64Encode。看看stackoverflow.com/questions/5416038/…
-
谢谢,我去看看。但这无法解释为什么上面的代码可以很好地执行此 curl 命令的功能: curl -F "file"="@example.png" "example.com"
标签: java curl http-post mime-types