文件发布服务器上,通过发布将文件上传到服务器OutOfMemory

我正在开发一个远程备份应用程序,有时我需要上传大文件,例如15 MB,我已经在某些手机上进行了测试,但遇到内存不足错误

使用此功能是否可以使用更少的内存?

public int uploadFile(String sourceFileUri) {

String fileName = sourceFileUri;

HttpURLConnection conn = null;

DataOutputStream dos = null;

String lineEnd = "\r\n";

String twoHyphens = "--";

String boundary = "*****";

int bytesRead, bytesAvailable, bufferSize;

byte[] buffer;

int maxBufferSize = 1 * 1024 * 1024;

File sourceFile = new File(sourceFileUri);

if (!sourceFile.isFile()) {

runOnUiThread(new Runnable() {

public void run() {

/* messageText.setText("Source File not exist :"

+uploadFilePath + "" + uploadFileName);*/

}

});

return 0;

}

else

{

try {

// open a URL connection to the Servlet

FileInputStream fileInputStream = new FileInputStream(sourceFile);

URL url = new URL(upLoadServerUri);

// Open a HTTP connection to the URL

conn = (HttpURLConnection) url.openConnection();

conn.setDoInput(true); // Allow Inputs

conn.setDoOutput(true); // Allow Outputs

conn.setUseCaches(false); // Don't use a Cached Copy

conn.setRequestMethod("POST");

conn.setRequestProperty("Connection", "Keep-Alive");

conn.setRequestProperty("ENCTYPE", "multipart/form-data");

conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

conn.setRequestProperty("uploaded_file", fileName);

dos = new DataOutputStream(conn.getOutputStream());

dos.writeBytes(twoHyphens + boundary + lineEnd);

dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""

+ fileName + "\"" + lineEnd);

dos.writeBytes(lineEnd);

// create a buffer of maximum size

bytesAvailable = fileInputStream.available();

bufferSize = Math.min(bytesAvailable, maxBufferSize);

buffer = new byte[bufferSize];

// read file and write it into form...

bytesRead = fileInputStream.read(buffer, 0, bufferSize);

while (bytesRead > 0) {

dos.write(buffer, 0, bufferSize);

bytesAvailable = fileInputStream.available();

bufferSize = Math.min(bytesAvailable, maxBufferSize);

bytesRead = fileInputStream.read(buffer, 0, bufferSize);

}

// send multipart form data necesssary after file data...

dos.writeBytes(lineEnd);

dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

// Responses from the server (code and message)

serverResponseCode = conn.getResponseCode();

// String serverResponseMessage = conn.getResponseMessage();

// Log.i("uploadFile", "HTTP Response is : "

// + serverResponseMessage + ": " + serverResponseCode);

if(serverResponseCode == 200){

runOnUiThread(new Runnable() {

public void run() {

/*messageText.setText(msg);

Toast.makeText(UploadToServer.this, "File Upload Complete.",

Toast.LENGTH_SHORT).show();*/

}

});

}

//close the streams //

fileInputStream.close();

dos.flush();

dos.close();

} catch (MalformedURLException ex) {

// ex.printStackTrace();

runOnUiThread(new Runnable() {

public void run() {

/*messageText.setText("MalformedURLException Exception : check script url.");*/

Toast.makeText(UploadToServer.this, "MalformedURLException", Toast.LENGTH_SHORT).show();

}

});

Log.e("Upload file to server", "error: " + ex.getMessage(), ex);

} catch (Exception e) {

//e.printStackTrace();

runOnUiThread(new Runnable() {

public void run() {

//messageText.setText("Got Exception : see logcat ");

Toast.makeText(UploadToServer.this, "Got Exception : see logcat ",

Toast.LENGTH_SHORT).show();

}

});

Log.e("Upload file to server Exception", "Exception : "

+ e.getMessage(), e);

}

// dialog.dismiss();

return serverResponseCode;

} // End else block

}

这里的错误日志

java.lang.OutOfMemoryError

at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:93)

at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:218)

at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl$DefaultHttpOutputStream.write(HttpURLConnectionImpl.java:750)

at java.io.DataOutputStream.write(DataOutputStream.java:101)

at com.androidexample.uploadtoserver.UploadToServer.a(SourceFile:151)

at com.androidexample.uploadtoserver.e.run(SourceFile:62)

at java.lang.Thread.run(Thread.java:1102)

修改并添加固定无缓冲区后,出现此错误

Exception : expected 589715 bytes but received 589840

java.io.IOException: expected 589715 bytes but received 589840

at libcore.net.http.FixedLengthOutputStream.write(FixedLengthOutputStream.java:39)

at java.io.DataOutputStream.write(DataOutputStream.java:98)

at com.androidexample.uploadtoserver.UploadToServer.uploadFile(UploadToServer.java:152)

at com.androidexample.uploadtoserver.UploadToServer$1.run(UploadToServer.java:62)

at java.lang.Thread.run(Thread.java:856)

我猜这差个字节是标题数据吗?如何获取标头的length()?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值