我正在尝试从multistream / form-data中的inputstream发送数据,作为使用以下参数的文件参数:
MultipartEntityBuilder.create()
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.addBinaryBody("file", inputStream)
.build();
问题是服务器似乎需要Content-Length标头。我知道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客户端为整个多部分请求正文而不是每个部分编写了内容长度。