MultipartEntity:Content-Length 用于 InputStream
MultipartEntity: Content-Length for InputStream
我正在尝试使用 multipart/form-data 作为 file-parameter 从输入流发送数据:
MultipartEntityBuilder.create()
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.addBinaryBody("file", inputStream)
.build();
问题是服务器似乎需要 Content-Length header。我知道我的 inputStream 的正确大小 - 我可以手动设置它吗?
您可以使用 ContentBody
创建自己的 FormBodyPart
,而不是使用 addBinaryBody
方法。适当的 ContentBody
是 InputStreamBody
但其 getContentLength
方法 returns -1
。
我建议您扩展 class 以提供自定义内容长度。
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 客户端为整个多部分请求正文而不是每个部分写了内容长度。
我正在尝试使用 multipart/form-data 作为 file-parameter 从输入流发送数据:
MultipartEntityBuilder.create()
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.addBinaryBody("file", inputStream)
.build();
问题是服务器似乎需要 Content-Length header。我知道我的 inputStream 的正确大小 - 我可以手动设置它吗?
您可以使用 ContentBody
创建自己的 FormBodyPart
,而不是使用 addBinaryBody
方法。适当的 ContentBody
是 InputStreamBody
但其 getContentLength
方法 returns -1
。
我建议您扩展 class 以提供自定义内容长度。
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 客户端为整个多部分请求正文而不是每个部分写了内容长度。