1

Android デバイスからサーバーに大きなサイズの zip ファイル (約 10 MB 以上) をアップロードする必要があります。8 MB 未満をアップロードできますが、10 MB を超えてアップロードしようとすると「OutOfMemoryError」がスローされるため
conn.setFixedLengthStreamingMode(fileInputStream.available());、コードに追加すると、次の例外もスローされます

07-08 10:57:22.649: W/System.err(31383): java.io.IOException: expected 860 bytes but received 4096
07-08 10:57:22.649: W/System.err(31383):    at libcore.net.http.FixedLengthOutputStream.write(FixedLengthOutputStream.java:39)
07-08 10:57:22.649: W/System.err(31383):    at java.io.DataOutputStream.write(DataOutputStream.java:98)
07-08 10:57:22.649: W/System.err(31383):    at com.ams.utilities.PhotoUploadAsyncTask.doInBackground(PhotoUploadAsyncTask.java:273)
07-08 10:57:22.649: W/System.err(31383):    at com.ams.utilities.PhotoUploadAsyncTask.doInBackground(PhotoUploadAsyncTask.java:1)
07-08 10:57:22.656: W/System.err(31383):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-08 10:57:22.656: W/System.err(31383):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-08 10:57:22.656: W/System.err(31383):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-08 10:57:22.664: W/System.err(31383):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-08 10:57:22.672: W/System.err(31383):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-08 10:57:22.688: W/System.err(31383):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-08 10:57:22.703: W/System.err(31383):    at java.lang.Thread.run(Thread.java:856)

Zipファイルをアップロードするために使用する次のコード

DataOutputStream os = null;
HttpsURLConnection conn = null ;

String strBoundary = "---------------------------14737809831466499882746641449";
String endLine = "\r\n";                

conn = (HttpsURLConnection) new URL(url).openConnection();

if(fileInputStream != null)
    conn.setFixedLengthStreamingMode(fileInputStream.available());


conn.setRequestMethod("POST");
conn.setRequestProperty(
    "Content-Type",
    "multipart/form-data;boundary="+strBoundary);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Accept", "text/xml");
conn.connect();
os = new DataOutputStream(conn.getOutputStream());


os.write(("--" + strBoundary +endLine).getBytes());
os.write((encodePostBody(postData, strBoundary)).getBytes());
os.write((endLine + "--" + strBoundary + endLine).getBytes());


os.write(("Content-Disposition: form-data; name=\"cloud_photos\"; filename=\"cloud_photos.zip\"" + endLine).getBytes());


  os.write(("Content-Type: application/octet-stream" + endLine + endLine).getBytes());


    if(fileInputStream != null){

        long lengthOfFile = zipfilePath.length(); //fileInputStream.available();//

        int bytesAvailable = fileInputStream.available();



        int maxBufferSize = 4 * 1024;

        LogAMS.d(TAG, "bytesAvailable="+bytesAvailable);

        int bufferSize = Math.min(bytesAvailable, maxBufferSize);

        byte[] buffer = new byte[bufferSize];

        int total = 0;

        // read file and write it into form...
        int bytesRead = fileInputStream.read(buffer, 0, bufferSize);


        while (bytesRead > 0){   

            total += bytesRead;
        os.write(buffer, 0, bufferSize);
        bytesAvailable = fileInputStream.available();

        int progress = (int)((total*100) / lengthOfFile);

        if(progress <= 98){
            if(progress % 20 == 0)
                publishProgress(progress);
        }else{

            if(progress == 99)
                publishProgress(progress);
        }

        bufferSize = Math.min(bytesAvailable,maxBufferSize);

        bytesRead = fileInputStream.read(buffer, 0, bufferSize);



        }

    }


    }

    os.write((endLine + "--" + strBoundary + endLine).getBytes());

   // fileInputStream.close();

    os.flush();

    os.close();

    os = null;


return parseUploadResponse(conn.getInputStream());

チャンクでアップロードする必要があります。誰かが最善のアプローチについて提案をしてくれたら、とても感謝しています。

前もって感謝します

4

1 に答える 1

0

以下のポイントがあなたを助けることを願っています-

1) POST メソッドを使用して、サーバーにデータをアップロードします。

2)マルチパート画像を使用

3)あなたの活動を破壊する際のゴミを無効にする

于 2013-07-08T10:17:42.973 に答える