2

有没有使用 NDK 将文件从 SD 上传到服务器的源代码?或任何其他上传大文件的方法,而无需获取

Out Of Memory Exception

如果是这样,请给我链接?

下面的代码是我使用的代码,我得到了内存不足异常

 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

似乎您错过了来自:http://developer.android.com/reference/java/net/HttpURLConnection.html 的 setChunkedStreamingMode(int) 调用 发布内容 要将数据上传到 Web 服务器,请使用 setDoOutput(true) 配置输出连接。为了获得最佳性能,您应该在预先知道主体长度时调用 setFixedLengthStreamingMode(int),或者在不知道时调用 setChunkedStreamingMode(int)。否则HttpURLConnection 将被迫在传输之前将完整的请求正文缓冲在内存中,从而浪费(并且可能耗尽)堆并增加延迟。

但是您的内容太大而无法缓冲。

于 2012-08-28T14:37:50.377 回答
0

您不需要 NDK。如果没有您的代码,我只能建议有将整个文件读入缓冲区的代码。这是错误的。执行以下操作:按小部分读取文件并将这些部分一一发送到输出流(从连接中获取)

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 回答