java - 使用 ByteArray 请求 MultiPart/Form-Data
问题描述
我想发送一个请求,包括 bytearray 作为表单数据。每个人都使用“文件”,但我只有“字节数组”,我不想使用任何路径。我在 curl 中的请求:
curl -F file=@file server
在java中我尝试过:
byte[] fileByte = Base64.decodeBase64(parameter);
ByteArrayInputStream myFile = new ByteArrayInputStream(fileByte);
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("server");
multipartEntityBuilder.addBinaryBody("file", myFile, ContentType.APPLICATION_OCTET_STREAM, "filename");
HttpEntity multipart = multipartEntityBuilder.build();
httpPost.setEntity(multipart);
我试过了
multipartEntityBuilder.addBinaryBody("file", fileByte, ContentType.DEFAULT_BINARY, "filename");
//OR FileBody, ByteArrayEntity, InputStream or like thats
所以,这些方法对我不起作用。我怎样才能成功发送请求?
我认为问题肯定与 ByteArray 或 InputStream 有关。我必须为 my byte[] 找到另一种类型,或者使用 File 类型但没有路径在 java 中发布正确的方法。
解决方案
我不知道“服务器”是什么,但问题可能出在您发送到的服务器上。我运行了您的代码,写入互联网上可用的公共 HTTP POST 测试服务器,它对我来说很好用。这是我运行的代码:
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
class ListsTest {
public static void main(String[] args) {
byte[] fileByte = "Sample string data".getBytes(StandardCharsets.UTF_8);
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("https://ptsv2.com/t/r7ypk-1613291354/post");
multipartEntityBuilder.addBinaryBody("file", fileByte, ContentType.DEFAULT_BINARY, "filename");
HttpEntity multipart = multipartEntityBuilder.build();
httpPost.setEntity(multipart);
try {
client.execute(httpPost);
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果您转到目标测试服务器存储桶:
https://ptsv2.com/t/r7ypk-1613291354
您可以看到服务器接收到的完整请求的样子,并看到有效负载将其作为具有适当文件名和内容的文件很好地覆盖。请求显示的文件内容部分如下所示:
您的替代方法对我同样有效。我选择发布这个版本是因为它更简单,不需要您将字节数组包装在 InputStream 对象中。
推荐阅读
- html - IosSlider 不允许在其下方添加内容
- vue.js - 如何在 Vue 中从外部回调中设置数据?
- python - 如何从列表中减去列表?
- c# - 在 asp.net 核心中使用 serilog 维护单独的范围上下文
- php - wp_enqueue_style 媒体查询仍在来源/报道中?
- kubernetes - K8 - 使用 nginx 入口控制器在两个服务之间进行循环负载平衡
- javascript - 图片宽度会影响内容加载速度吗?
- google-sheets - Google 表格 - QUERY - 压缩数据透视表
- ruby-on-rails - 尝试创建删除函数(React 前端/Rails 后端)
- r - 在嵌套数据框中应用条件函数