我正在尝试将输入流中的数据发送到多部分/表单数据中,作为文件参数使用:
MultipartEntityBuilder.create()
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.addBinaryBody("file", inputStream)
.build();
问题是服务器似乎需要一个 Content-Length header 。我知道我的 inputStream 的正确大小 - 我可以手动设置吗?
最佳答案
而不是使用 addBinaryBody
方法,您可以创建自己的FormBodyPart
与 ContentBody
.合适的ContentBody
是 InputStreamBody
但它的 getContentLength
方法返回 -1
.
我建议您扩展该类以提供自定义内容长度。
class KnownSizeInputStreamBody extends InputStreamBody {
private final long contentLength;
public KnownSizeInputStreamBody(InputStream in, long contentLength, ContentType contentType) {
super(in, contentType);
this.contentLength = contentLength;
}
@Override
public long getContentLength() {
return contentLength;
}
}
然后,您可以将多部分实体创建为
FormBodyPart bodyPart = FormBodyPartBuilder.create().setName("file")
.setBody(new KnownSizeInputStreamBody(inputStream, contentLenth, ContentType.APPLICATION_OCTET_STREAM)).build();
HttpEntity entity = MultipartEntityBuilder.create().addPart(bodyPart).build();
视情况而定(您自己的内容类型、内容长度、名称等)。
在我的情况下,http 客户端为整个多部分请求正文编写了内容长度,而不是为每个部分编写。
关于java - 多部分实体 : Content-Length for InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32998854/