将android中的大文件发布到服务器

问题描述 投票:1回答:2

我必须从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
2个回答
0
投票

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

希望能帮助到你。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.