android用post方法上传大文件的时候会内存溢出Out of memory(我用的是G2测试的 上了6M文件就会这样)
不知道有人也遇到我这样的情况,求解决方法
代码如下:
DataOutputStream outStream = null;
HttpURLConnection conn = null;
try { URL url = new URL(actionUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);// 允许输入
conn.setDoOutput(true);// 允许输出
conn.setUseCaches(true);// 不使用Cache
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Content-Type","text/xml");
outStream = new DataOutputStream(conn.getOutputStream());
FileInputStream inputFile = new FileInputStream(files);
int c=0;
long count1 = 0;
//byte[] buf = new byte[1024];
while ((c = inputFile.read(buf)) != -1)
{
outStream.write(buf,0,c);
outStream.flush();
count1+=c;
System.err.println("write size "+(count1)/1024);
}
inputFile.close(); int cah = conn.getResponseCode();
Log.v("cah:", ""+cah);
if (cah != 200){
throw new RuntimeException("请求url失败");
} else {
InputStream is = conn.getInputStream();
outStream.flush();
int ch;
StringBuilder result = new StringBuilder();
while ((ch = is.read()) != -1) {
result.append((char) ch);
}
System.err.println(result.toString());
}
outStream.close();
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(null != conn){
conn.disconnect();
conn = null;
}
if(null!=outStream){
try {
outStream.close();
} catch (IOException e) {
//
}
outStream = null;
}
}
不知道有人也遇到我这样的情况,求解决方法
代码如下:
DataOutputStream outStream = null;
HttpURLConnection conn = null;
try { URL url = new URL(actionUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);// 允许输入
conn.setDoOutput(true);// 允许输出
conn.setUseCaches(true);// 不使用Cache
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Content-Type","text/xml");
outStream = new DataOutputStream(conn.getOutputStream());
FileInputStream inputFile = new FileInputStream(files);
int c=0;
long count1 = 0;
//byte[] buf = new byte[1024];
while ((c = inputFile.read(buf)) != -1)
{
outStream.write(buf,0,c);
outStream.flush();
count1+=c;
System.err.println("write size "+(count1)/1024);
}
inputFile.close(); int cah = conn.getResponseCode();
Log.v("cah:", ""+cah);
if (cah != 200){
throw new RuntimeException("请求url失败");
} else {
InputStream is = conn.getInputStream();
outStream.flush();
int ch;
StringBuilder result = new StringBuilder();
while ((ch = is.read()) != -1) {
result.append((char) ch);
}
System.err.println(result.toString());
}
outStream.close();
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(null != conn){
conn.disconnect();
conn = null;
}
if(null!=outStream){
try {
outStream.close();
} catch (IOException e) {
//
}
outStream = null;
}
}
HttpPost httpPost = new HttpPost(actionUrl);这个类可上传大文件,不知道有没有监听上传流量的方法!
然后上传,这样文件太大就会出现 out of mem
这样就要把文件分块上传。我们知道下载的时候一般都支持断点续传,
上传的也类似,你google一下,在http头中加一些参数。首先把你的文件分块,然后分几次来上传。
还有一个问题,他既然是写入缓存,比如一个文件5M,我上传到3M的时候,网络断了,我如何获取到已经上传的文件大小?我们客户端只能保存有多少数据写入了缓存(outStream.write(buf,0,c); count1),没法知道有多少数据服务已经获得!