使用Apache Http Async客户端进行多部分POST请求上传文件

6

我将使用Apache HttpAsyncClient库上传一个大小为260k的图片作为multipart表单的一部分。

我按照以下方法创建我的表单:

val multipartEntityBuilder = new MultipartEntityBuilder
multipartEntityBuilder.addBinaryBody("file", file)
val multipartEntity = multipartEntityBuilder.build()

然后我在执行请求时收到了ContentTooLongException异常,基本上是由于库源代码中的这行代码引起的:https://github.com/apache/httpclient/blob/4.5.3/httpmime/src/main/java/org/apache/http/entity/mime/MultipartFormEntity.java#L102 我搜索了很多,但没有找到任何关于为什么在代码中存在contentLength限制的解释。也许有人能解释一下吗?我的第二个问题是:上传大于25KB的文件的正确方法是什么?
谢谢!

更新的链接:https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/MultipartFormEntity.java#L95-L105并附上说明:https://issues.apache.org/jira/browse/HTTPASYNC-163 - Raipe
建议确实使用BufferedHttpEntity:要么构建一个自定义的“HttpAsyncRequestProducer”,能够异步地生成多部分内容,要么将“MultipartFormEntity”与“BufferedHttpEntity”包装在一起,如果他们不介意在将多部分内容写入异步I/O通道之前在内存中缓冲它。 - Raipe
1个回答

10

找到解决方案:创建文件的inputstream,使用BufferedHttpEntity包装multipart实体,然后将该缓冲实体传递给请求:

val multipartEntityBuilder = MultipartEntityBuilder.create()
multipartEntityBuilder.addBinaryBody("file", new FileInputStream(file), ContentType.DEFAULT_BINARY, name)
val multipartEntity = multipartEntityBuilder.build()
val entity = new BufferedHttpEntity(multipartEntity)

这会将整个文件加载到内存中,因此上传一个50GB的文件会导致内存错误,有没有办法避免这种情况发生? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接