Java 等价于 curl post 带有图像和文本的请求
Java equivalent of curl post request with image and text
我正在尝试编写 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) returns 一个 ByteArrayBody。 (我实际上是从网上动态下载图像,而不是像 curl 命令那样从磁盘读取图像,但我认为这不会有什么不同)
我检查了这个 link 但它并没有完全解决您同时发送图像和文本参数的情况:
Java Equivalent of curl query
奇怪的是,我使用几乎相同的代码将 HTTP post 发送到另一个 API,这在我需要单独发送没有任何文本参数的图像时工作正常。 (没有字符串主体)
但是当我尝试发送图像(作为 ByteArrayBody)和一些文本(作为 StringBody)时,我从服务器收到一条神秘的错误消息,内容如下:
'Could not initialize parameter object with mimeType: application/octet-stream'。这可能是一条自定义错误消息,所以我真的找不到太多这方面的信息。
我尝试为 StringBody() 使用其他一些构造函数,因为这个构造函数已被弃用,但没有帮助。不确定使用什么是正确的构造函数,但不确定这是否会导致问题。
编辑:好像之前有人问过一个非常相似的问题,但解决方案对我不起作用:
Android: upload file with filling out POST body together
我收到一条关于
mimeType 参数初始化失败:application/octet-stream)
我没有看到它的记录,但 curl -F @
显然是想提供帮助 为一些 extensions/suffixes 填写 Content-type
,包括 image/jpeg
对于 .jpg
。 HttpClient 不会,并将所有内容默认为 MIME“我不知道”类型 application/octet-stream
,这可能会导致您的错误。 使用设置内容类型的 3-arg ctor
new ByteArrayBody (data, ContentType.create("image/jpeg"), null)
或者如果您想指定文件名属性,curl -F @
也可以,但网络服务器(与浏览器不同)通常 不关心,提供一个 String
代替 null
第三个参数。
我正在尝试编写 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) returns 一个 ByteArrayBody。 (我实际上是从网上动态下载图像,而不是像 curl 命令那样从磁盘读取图像,但我认为这不会有什么不同)
我检查了这个 link 但它并没有完全解决您同时发送图像和文本参数的情况: Java Equivalent of curl query
奇怪的是,我使用几乎相同的代码将 HTTP post 发送到另一个 API,这在我需要单独发送没有任何文本参数的图像时工作正常。 (没有字符串主体)
但是当我尝试发送图像(作为 ByteArrayBody)和一些文本(作为 StringBody)时,我从服务器收到一条神秘的错误消息,内容如下: 'Could not initialize parameter object with mimeType: application/octet-stream'。这可能是一条自定义错误消息,所以我真的找不到太多这方面的信息。
我尝试为 StringBody() 使用其他一些构造函数,因为这个构造函数已被弃用,但没有帮助。不确定使用什么是正确的构造函数,但不确定这是否会导致问题。
编辑:好像之前有人问过一个非常相似的问题,但解决方案对我不起作用: Android: upload file with filling out POST body together 我收到一条关于 mimeType 参数初始化失败:application/octet-stream)
我没有看到它的记录,但 curl -F @
显然是想提供帮助 为一些 extensions/suffixes 填写 Content-type
,包括 image/jpeg
对于 .jpg
。 HttpClient 不会,并将所有内容默认为 MIME“我不知道”类型 application/octet-stream
,这可能会导致您的错误。 使用设置内容类型的 3-arg ctor
new ByteArrayBody (data, ContentType.create("image/jpeg"), null)
或者如果您想指定文件名属性,curl -F @
也可以,但网络服务器(与浏览器不同)通常 不关心,提供一个 String
代替 null
第三个参数。