【问题标题】:Post large files in android to server将android中的大文件发布到服务器
【发布时间】:2014-04-15 13:32:42
【问题描述】:

我必须从 android 应用程序向服务器发送大于 10MB 的大文件。它给了我OutOfMemory exception 用于大文件。我尝试了很多解决方案,但没有任何效果。这是我的适用于小文件的代码。

        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(fileName); 

        if (!sourceFile.isFile()) {                                    
            Log.e("clusterFileUploaded", fileName);
        }

        try {

            FileInputStream fileInputStream = new FileInputStream(sourceFile);
            URL url = new URL(purl);

            conn = (HttpURLConnection) url.openConnection(); 
            conn.setDoInput(true); 
            conn.setDoOutput(true); 
            conn.setUseCaches(false); 
            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("clusterFile", fileName); 

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

            dos.writeBytes(twoHyphens + boundary + lineEnd);         
            dos.writeBytes("Content-Disposition: form-data; name='clusterFile';filename="+ fileName +  lineEnd);

            dos.writeBytes(lineEnd);

            bytesAvailable = fileInputStream.available(); 

            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];

            bytesRead = fileInputStream.read(buffer, 0, bufferSize);  
            int serverResponseCode = 0;
            while (bytesRead > 0) {
                dos.write(buffer, 0, bufferSize);
                dos.flush();
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);   

            }

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

            DataInputStream is = new DataInputStream(conn.getInputStream());

            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();

            String line = null;
            try {
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            String sFileResp = sb.toString();

            serverResponseCode = conn.getResponseCode();
            String serverResponseMessage = conn.getResponseMessage();

            Log.i("uploadFile", "HTTP Response is : "
                    + serverResponseMessage + ": " + serverResponseCode+"::"+sFileResp);

            fileInputStream.close();
            dos.flush();
            dos.close();
            return  sFileResp;

        } catch (Exception e) {
            e.printStackTrace();
        }

服务器端接收大文件没有问题。我不想分块发送。我想在服务器端接收整个文件。

我绞尽脑汁这么多天,但没有运气。任何帮助将不胜感激。

致谢

【问题讨论】:

    标签: android sockets http-post out-of-memory androidhttpclient


    【解决方案1】:

    在这里你可以找到更多关于 android manages your app's memory. Android 限制了应用程序可以使用的内存量。此限制因设备的 RAM 大小而异。发送大文件的唯一方法是用夹头发送。在这里你可以找到一个例子:Upload large file in Android without outofmemory error

    希望对你有帮助。

    【讨论】:

    • 当我开发一个单独的应用程序(仅在单击按钮时上传文件)时,此代码通过将 30MB 文件上传到服务器来工作。但是,当此代码放置在实际应用程序中时,该应用程序还执行其他一些操作,然后出现 OOM 异常。你能就这种行为发表你的看法吗
    • 这可能是因为您的实际应用程序已经使用了 android 操作系统允许应用程序使用的一部分内存。您应该始终查询设备分配的最大内存量一个应用程序,并且仅将 20% 的内存用于文件上传。
    【解决方案2】:

    再添加一个方法conn.setChunkedStreamingMode(4096)

    这可确保您的数据以您定义的块大小上传, 此外,如果由于网络延迟、电池电量不足或信号强度波动而导致任何一个块中断,则仅上传该块的该部分而不是整个文件。

    注意:您可以更改块的大小,因为我给了 4mb。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2014-05-10
      • 2011-05-03
      • 1970-01-01
      相关资源
      最近更新 更多