gpt4 book ai didi

java - 通过 apache HttpClient 3.1 在大型 HTTP MultipartRequestEntity 上发生 OutOfMemory

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:22:09 27 4
gpt4 key购买 nike

我实际上是在低内存环境中尝试使用 apache HttpClient 3.1 通过 MultipartRequestEntity 和 java 1.4 上传文件(> 5M),因此增加 java 堆是不可能的

我有一个文件分成了很多部分,我只需要将每个部分的所有数据附加到请求中,我也可以在不分割的情况下获取文件

真正的问题是我正在构建的请求正在产生内存溢出,是否有任何方法可以避免这种情况并能够立即发送此请求?

这就是我实际拥有的,我需要将字节附加到部分(一种部分[0].write(data)),或者获取一个流来写入它而不加载到内存中,我不知道'不知道这是否真的可能

    HttpClient client = new HttpClient();
PostMethod post = new PostMethod(url);

post.setContentChunked(true);

try {
Part[] parts = new Part[fileNames.size()];

String fileName = "sample.pdf";

for(int i = 0; i<fileNames.size();i++){
File file = Util.getFile(fileNames.get(i));
FileInputStream is = new FileInputStream(file);
byte[] fileBytes = IOUtils.toByteArray(is);
parts[i] = new FilePart("file", new ByteArrayPartSource(fileName, fileBytes) , "application/octet-stream", post.getRequestCharSet());
is.close();
is = null;
fileBytes = null;
}

MultipartRequestEntity requestEntity = new MultipartRequestEntity(parts, post.getParams());

post.setRequestEntity(requestEntity);


int statusCode = client.executeMethod(post);

另一种可能性是使用 HttpUrlConnection 编写 BufferedWriter,但这也会在写入时产生 OutOfMemory

最佳答案

我本可以直接使用 File java 文件类完成此操作,但问题是我没有 java File 类,相反我必须实现 PartSource 来读取我的特殊文件类并将其设置为在加入我的所有文件后读取强制性地将零件归档在一个文件中。通常你应该这样做:

parts[0] = new FilePart("file", new FilePartSource(file) , "application/octet-stream", postMethod.getRequestCharSet()); 

如果您不想为请求将整个数据缓冲在内存中,则需要一个文件

现在我已经解决了这个问题

关于java - 通过 apache HttpClient 3.1 在大型 HTTP MultipartRequestEntity 上发生 OutOfMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53630996/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com