我正在尝试从multipart / form-data中的输入流发送数据,作为文件参数使用:
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客户端编写了整个多部分请求主体的内容长度,而不是每个部分。