通过apache HttpClient 3.1在大型HTTP MultipartRequestEntity上的内存不足



我实际上正试图在低内存环境中通过java 1.4的MultipartRequestEntity使用apache HttpClient 3.1上传一个文件(>5M(,所以增加java堆是不可能的

我有一个被拆分为多个部分的文件,我只需要将每个部分的所有数据附加到请求中,我就可以在不拆分太多的情况下获得文件

真正的问题是,我正在构建的请求会导致内存溢出,有什么方法可以避免这种情况,并能够立即发送这个请求吗?

这就是我实际拥有的,我需要将字节附加到部分(一种part[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()); 

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

现在我已经解决了

相关内容

  • 没有找到相关文章

最新更新