我正在尝试使用 apache commons httpclient 3.1 将文件发送到 IIS 服务器,但出现内存不足错误。
InputStream is = FileService.getInputStream(fileName, FileService.HDD);
ByteArrayOutputStream fileToUpload = new ByteArrayOutputStream();
ByteArrayPartSource file = null;
try {
byte[] buffer = new byte[1024];
for (int len; (len = is.read(buffer)) != -1;)
fileToUpload.write(buffer, 0, len);
file = new ByteArrayPartSource(fileName, fileToUpload.toByteArray());
post.setContentChunked(false);
Part[] part = new Part[] { new FilePart(fileName, file)};
post.setRequestEntity(new MultipartRequestEntity(part, post.getParams()));
}
catch (OutOfMemoryError e) {
}
finally {
try {
if (is != null) is.close();
if (fileToUpload != null) fileToUpload.close();
} catch (IOException e) {
}
}
OutOfMemoryError 发生在 fileToUpload.toByteArray()。有没有办法分块发送文件?我不能使用文件对象,因为我得到了权限错误。
我也尝试过不使用 httpClient 但我仍然出现内存不足错误
InputStream fileToUpload = FileService.getInputStream(fileName, FileService.HDD);
OutputStream output = connection.getOutputStream();
PrintWriter writer = null;
try {
writer = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
writer.println("--" + boundary);
writer.println("Content-Disposition: form-data; name=\"binaryFile\"; filename=\""+ fileName + "\"");
writer.println("Content-Type: application/octet-stream");
writer.println("Content-Transfer-Encoding: binary");
writer.println();
writer.flush();
LogService.info("FileSender#setFileToUpload() Before");
byte[] buffer = new byte[2048];
int bytesRead;
while ((bytesRead = fileToUpload.read(buffer)) != -1){
output.write(buffer, 0, bytesRead);
}
LogService.info("FileSender#setFileToUpload() After");
output.flush();
writer.println();
writer.flush();
writer.println("--" + boundary + "--");
} finally {
if (writer != null) writer.close();
if (output != null) output.close();
if (fileToUpload != null) fileToUpload.close();
}