java - 多部分实体 : Content-Length for InputStream

标签 java apache-httpcomponents

我正在尝试将输入流中的数据发送到多部分/表单数据中,作为文件参数使用:

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

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

最佳答案

而不是使用 addBinaryBody方法,您可以创建自己的FormBodyPartContentBody .合适的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 客户端为整个多部分请求正文编写了内容长度,而不是为每个部分编写。

关于java - 多部分实体 : Content-Length for InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32998854/

相关文章:

java - 你如何为 Java 运行 DDD?

java - 无法使用 kerberos 票证缓存对 apache http 客户端 4.5 进行身份验证

java - 将 Apache HttpClient 响应拦截器与请求相匹配

java - 在黑莓上使用 HttpCore

java - 如何使用 Apache HttpComponents 从 Java Socket 获取 HTTPRequest

java - 从请求中获取发布数据

java - 用限制替换所有非数字

java - 从子类访问方法时出错

java - Rpg 调用 Java 构造函数,在异常处理程序上出现错误 ClassDefNotFound

java - 如何使用 Java 从链接列表中的文本文件读取字符串?