我实际上正试图在低内存环境中通过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());
如果你不想为请求在内存中缓冲整个数据,你需要一个文件
现在我已经解决了