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;
}
}

解决方案 »

  1.   

    查了下资料,正文的内容通过outputStream写入,实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,而是在流关闭后,根据输入的内容生成http正文。那上面这方法就没法写上传大文件了,
    HttpPost httpPost = new HttpPost(actionUrl);这个类可上传大文件,不知道有没有监听上传流量的方法!
      

  2.   

    post的时候可能先在内存中存放
    然后上传,这样文件太大就会出现 out of mem
    这样就要把文件分块上传。我们知道下载的时候一般都支持断点续传,
    上传的也类似,你google一下,在http头中加一些参数。首先把你的文件分块,然后分几次来上传。
      

  3.   

    断点续传我们也考虑过,但给服务器压力大,上传一半的文件都要保存,
    还有一个问题,他既然是写入缓存,比如一个文件5M,我上传到3M的时候,网络断了,我如何获取到已经上传的文件大小?我们客户端只能保存有多少数据写入了缓存(outStream.write(buf,0,c); count1),没法知道有多少数据服务已经获得!
      

  4.   

    HttpURLConnection 只能上传小文件.因为文件缓存在内存中.所以内存溢出.可以不用这个.直接适用socket连接实现!
      

  5.   

    哥用HttpUrlConnection post 上传了近 1.3G 的文件!
      

  6.   

    大神,你确定是在android端上传的么?
      

  7.   

    你确定是在android 端上传的么?