2

NDK を使用して SD からサーバーにファイルをアップロードするためのソース コードはありますか? または取得せずに大きなサイズのファイルをアップロードするその他の方法

Out Of Memory Exception

もしそうなら、plzは私にリンクを提供しますか?

以下のコードは私が使用したもので、メモリ不足の例外が発生しました

 private void UploadFileByClient(LocalFileVO localFileVO){


        try{

            File uploadFile = new File(
                    (localFileVO.getFolderPath() + "/" + localFileVO.getFileName()));

            HttpClient    client = new DefaultHttpClient();

            final HttpResponse resp; 
            final HttpClient httpClient = new DefaultHttpClient(); 
            final HttpPut post = new HttpPut("https://qa2-talos-vip-mexico.symnds.com/fileservice/files/");
            post.setHeader("User-Agent", "Mexico/1.0.0.57/android");
            post.setHeader("Content-Type", localFileVO.getMimeType());
            post.setHeader("Authorization", TOKEN);
            post.setHeader("x-mexico-endpointid", GUID);
            post.setHeader("x-mexico-filehash", localFileVO.getFileHash());
            post.setHeader("x-mexico-filesize", localFileVO.getSize());

            if (!TextUtils.equals("0", localFileVO.getFolderId()))
                post.setHeader("x-mexico-folder", localFileVO.getFolderId());

            post.setHeader("x-mexico-filename", localFileVO.getEncodedFileName());
            post.setHeader("Expect", "100-continue");
            post.setHeader("x-mexico-modtime",
                    String.valueOf(System.currentTimeMillis() / 1000));



//          ParcelFileDescriptor fileDescriptor = this.getContentResolver().openFileDescriptor(Uri.parse(uploadFile.getAbsolutePath()), "r"); 
//          InputStream in = this.getContentResolver().openInputStream(Uri.parse(uploadFile.getAbsolutePath()));
            InputStream in = new FileInputStream(uploadFile);

            CountingInputStreamEntity entity = new CountingInputStreamEntity(in, uploadFile.length()); 
            entity.setUploadListener(this);
            post.setEntity(entity); 
            resp = httpClient.execute(post); 
            if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
                System.out.println("=======================Got the response from server============================");
            }


        }catch(Exception e){
            System.out.println("==============Failed using HttpClient================="+e.getMessage());
        }

    }

   private int uploadFile( LocalFileVO localFileVO) throws IOException {


       UploadFileByClient(localFileVO);

      if(true){
          return 0;
      }

        File uploadFile = new File((localFileVO.getFolderPath() + "/" + localFileVO.getFileName()));


        System.setProperty("http.keepAlive", "false");

        int     code = 0;
        try{

        HttpURLConnection urlConnection; 

        URL url = new URL("https://qa2-talos-vip-mexico.symnds.com/fileservice/files/");
    //  URL url = new URL("https://zpi.nortonzone.com/fileservice/files/");

        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setConnectTimeout(30000);
        urlConnection.setRequestProperty("Host", url.getHost());
        // urlConnection.setRequestProperty("Connection", "Keep-Alive");
        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(true);
        urlConnection.setUseCaches(false);
        urlConnection.setInstanceFollowRedirects(false);
    //  urlConnection.setChunkedStreamingMode(1024);
        urlConnection.setFixedLengthStreamingMode(Integer.parseInt(localFileVO.getSize()));
        //urlConnection.setChunkedStreamingMode(1024);

        urlConnection.setRequestMethod("PUT");
        urlConnection.setRequestProperty("User-Agent", "Mexico/1.0.0.57/android");
        urlConnection.setRequestProperty("Content-Type", localFileVO.getMimeType());
        //urlConnection.setRequestProperty("Content-Length", localFileVO.getSize());
        urlConnection.setRequestProperty("Authorization", TOKEN);
        urlConnection.setRequestProperty("x-mexico-endpointid", GUID);
        urlConnection.setRequestProperty("x-mexico-filehash", localFileVO.getFileHash());
        //urlConnection.setRequestProperty("x-mexico-filesize", localFileVO.getSize());

        if (!TextUtils.equals("0", localFileVO.getFolderId()))
            urlConnection.setRequestProperty("x-mexico-folder", localFileVO.getFolderId());

        urlConnection.setRequestProperty("x-mexico-filename", localFileVO.getEncodedFileName());
        urlConnection.setRequestProperty("Expect", "100-continue");
        urlConnection.setRequestProperty("x-mexico-modtime",
                String.valueOf(System.currentTimeMillis() / 1000));

        bufferOutputStream = new BufferedOutputStream(urlConnection.getOutputStream(),BSIZE);
    //  CountingOutputStream cOutStream = new CountingOutputStream(bufferOutputStream);

        FileInputStream fileInputStream = new FileInputStream(uploadFile);

        long startTime = System.currentTimeMillis();
        try{
            int totalSize = 0;

             while (true) {
                   synchronized (chunks) {
                        int amountRead = fileInputStream.read(chunks);
                        System.out.println("========amount read========="+amountRead);
                        if (amountRead == -1) {
                              break;
                        }
                        bufferOutputStream.write(chunks, 0, amountRead);
                        bufferOutputStream.flush();
                  }
             }
            System.out.println("================================TotalSize " + totalSize);
            bufferOutputStream.flush();
             bufferOutputStream.close();
             fileInputStream.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        long endTime = System.currentTimeMillis();
        System.out.println("=============================================Writing time ==========================================================" + (endTime - startTime)); 
        //code = urlConnection.getResponseCode();

        InputStream inputStream  = urlConnection.getInputStream();



    long endTime1 = System.currentTimeMillis();
    System.out.println("Time to get the response is  " + (endTime1 - endTime)); 
    // progressBar.setProgress(100);
        System.out.println("=================Response code is ================="+code);
        urlConnection.disconnect();
        //fileInputStream.close();

        }catch(Exception e){
            System.out.println("========================Exception occured=================="+e.getMessage());
        }
        return code;

    }

ありがとう

4

2 に答える 2

0

次の場所からのsetChunkedStreamingMode(int)呼び出しを逃したようです:http://developer.android.com/reference/java/net/HttpURLConnection.htmlコンテンツの投稿Webサーバーにデータをアップロードするには、setDoOutput(true)を使用して出力用の接続を構成します。最高のパフォーマンスを得るには、本体の長さが事前にわかっている場合はsetFixedLengthStreamingMode(int)を呼び出し、不明な場合はsetChunkedStreamingMode(int)を呼び出す必要があります。そうしないと、HttpURLConnectionは、送信される前にリクエスト本文全体をメモリにバッファリングするように強制され、ヒープを浪費し(場合によっては使い果たし)、レイテンシを増加させます。

ただし、コンテンツが大きすぎてバッファリングできません。

于 2012-08-28T14:37:50.377 に答える
0

これにはNDKは必要ありません。あなたのコードがなければ、ファイル全体をバッファに読み込むためのコードがあることを示唆することしかできません。違います。次のようなことを行います:ファイルを小さな部分で読み取り、これらの部分を1つずつ出力ストリームに送信します(接続から取得します)

FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile) )
..
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();

// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);

// Enable POST method
connection.setRequestMethod("POST");

connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
....
outputStream = new DataOutputStream( connection.getOutputStream() );
....
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);

while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}

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

// Responses from the server (code and message)
serverResponseCode = connection.getResponseCode();
serverResponseMessage = connection.getResponseMessage();

fileInputStream.close();
outputStream.flush();
outputStream.close();
于 2012-08-28T11:09:34.550 に答える