代码之家  ›  专栏  ›  技术社区  ›  Brian

如何修复我的android照片上传以发送更大的数据流

  •  1
  • Brian  · 技术社区  · 14 年前

    我有一个android应用程序试图通过API接口将照片上传到web服务器。只要图像大小不太大(在1280x800左右的某个地方失败),该方法就可以很好地工作。在这里,可以工作的代码将缩小图像,但对于较大的图像则会失败。有什么建议吗?

    public void uploadPhoto(FileInputStream fileInputStream, String session_key) throws IOException, ClientProtocolException {
    
        URL connectURL = new URL(API_ENDPOINT_URL + "session_key="
                + session_key + "&method=" + ApiMethods.UPLOAD_PHOTO);
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
    
        HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
    
        // Allow Inputs
        conn.setDoInput(true);
    
        // Allow Outputs
        conn.setDoOutput(true);
    
        // Don't use a cached copy.
        conn.setUseCaches(false);
    
        // Use a post method.
        conn.setRequestMethod("POST");
    
        conn.setRequestProperty("Connection", "Keep-Alive");
    
        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+ boundary);
    
        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
    
        dos.writeBytes(twoHyphens + boundary + lineEnd);
        // Log.d(TAG, "  dos1: " + dos);
        dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""+ "file.png" + "\"" + lineEnd);
        // Log.d(TAG, "  dos2: " + dos);
        dos.writeBytes(lineEnd);
        // Log.d(TAG, "  dos3: " + dos);
    
        // create a buffer of maximum size
    
        int bytesAvailable = fileInputStream.available();
        int maxBufferSize = 1024;
        int bufferSize = Math.min(bytesAvailable, maxBufferSize);
        byte[] buffer = new byte[bufferSize];
    
        // read file and write it into form...
    
        int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        Log.d(TAG, " BytesREad:" + bytesRead);
        while (bytesRead > 0) {
            Log.d(TAG, " BytesREad in while:" + bytesRead);
            dos.write(buffer, 0, bufferSize);
            // Log.d(TAG, "  dos3: " + dos);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            /*
             * dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary +
             * twoHyphens + lineEnd);
             */
        }
    
        // send multipart form data necesssary after file data...
    
        // dos.write(data);
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
        // Log.d(TAG, "  dos4 tostring: " + dos.toString());
    
        // close streams
        // Log.e(Tag,"File is written");
        // fileInputStream.close();
        dos.flush();
        // Log.d(TAG, "  dos5: " + dos.toString());
        InputStream is = conn.getInputStream();
        // retrieve the response from server
        int ch;
    
        StringBuffer b = new StringBuffer();
        while ((ch = is.read()) != -1) {
            b.append((char) ch);
            // Log.d(TAG, "  b: " + b.toString());
        }
        String s = b.toString();
        Log.i("Response", s);
        // Log.d(TAG, "   response:" + s);
        dos.close();
    
    }
    

    错误包括

    10-20 04:16:26.658:ERROR/dalvikvm heap(20213):8957952字节外部分配对于此进程太大。 10-20 04:16:26.658:错误/dalvikvm(20213):内存不足:堆大小=4551KB,已分配=3039KB,位图大小=9496KB 10-20 04:16:26.658:错误/(20213):虚拟机不允许我们分配8957952字节

    2 回复  |  直到 14 年前
        1
  •  1
  •   David Brown    14 年前

    我以前也遇到过类似的问题,结果不是上传照片,而是因为我想在一个活动中展示它。。

        2
  •  1
  •   Chris Bowal    14 年前

    在工作时 PhoneKlone ,我发现在android上上传大照片会导致错误,这仅仅是因为vm的错误限制。

    解决方法:使用压缩来减小文件大小或尝试“阻止”图像(分多个步骤上载视频的裁剪部分)