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

将android中的大文件发布到服务器,android,sockets,http-post,out-of-memory,androidhttpclient,Android,Sockets,Http Post,Out Of Memory,Androidhttpclient,我必须从android应用程序向服务器发送大于10MB的大文件。它为大文件提供了OutOfMemory异常。我尝试过很多解决方案,但都不管用。这是我的代码,适用于小文件 HttpURLConnection conn = null; DataOutputStream dos = null; String lineEnd = "\r\n"; String twoHyphens = "--"; String bound

我必须从android应用程序向服务器发送大于10MB的大文件。它为大文件提供了
OutOfMemory异常。我尝试过很多解决方案,但都不管用。这是我的代码,适用于小文件

        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如何使用的信息。 Android限制了应用程序可以使用的内存量。根据设备的RAM数量,此限制在设备之间有所不同。发送大文件的唯一方法是用卡盘发送。在这里,您可以找到一个示例:


希望有帮助。

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

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


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

当我开发一个单独的应用程序(只在点击按钮时上传文件)时,这段代码将30MB的文件上传到服务器。然而,当这个代码放在实际的应用程序中,这个应用程序也做了一些其他的事情,然后得到了一个异常。你能给出你对这种行为的看法吗?这可能是因为你的实际应用程序已经使用了安卓操作系统允许应用程序使用的部分内存。你应该始终查询你的设备为应用程序分配的最大内存量,并且只使用该内存的20%来上传文件。