MultipartEntity:InputStream的Content-Length

问题描述 投票:2回答:1

我正在尝试从multipart / form-data中的输入流发送数据,作为文件参数使用:

MultipartEntityBuilder.create()
            .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
            .addBinaryBody("file", inputStream)
            .build();

问题是服务器似乎需要Content-Length标头。我知道inputStream的大小正确 - 我可以手动设置吗?

java apache-httpcomponents
1个回答
6
投票

您可以使用addBinaryBody创建自己的FormBodyPart,而不是使用ContentBody方法。适当的ContentBodyInputStreamBody但它的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客户端编写了整个多部分请求主体的内容长度,而不是每个部分。

© www.soinside.com 2019 - 2024. All rights reserved.