2012-12-10 5 views
1

Android 3.x 버전 이상으로 여러 이미지 업로드시이 문제가 있습니다. 내 응용 프로그램은 하이브리드이며 순수한 Android가 아닙니다. Phonegap 인터페이스를 사용하여 Android 코딩을 수행해야합니다. AsyncTask를 사용하여 작성한 코드는 다음과 같습니다. 안드로이드 2.3에서도 똑같이 작동하지만 Android 3.x 이상에서는 작동하지 않습니다. 내 코드를 공유하고 있습니다.Phonegap을 사용하여 Android에서 AsyncTask를 사용하여 여러 이미지 업로드

public class CFileUploader extends Plugin { 
    private String ACTION_POST_DATA = "cpost_data"; 
    private String CrLf = "\r\n"; 
    String base64Str=null; 

    @Override 
    public PluginResult execute(String arg0, JSONArray arg1, String arg2) { 
     Log.e("Sample App", " IN EXECUTE METHOD "); 

     PluginResult pluginResult = null; 
     if (ACTION_POST_DATA.equals(arg0)) { 
      try { 
       upload(arg1.getString(0), arg1.getString(1), arg1.getString(2), 
         arg1.getString(3), arg1.getString(4)); 

      } catch (JSONException jsonex) { 
       jsonex.printStackTrace(); 
      } 
     } 
     return pluginResult; 
    } 

    private PluginResult upload(String token, String date, String time, 
      String email, String fileNames) { 
     Log.e("Sample App", " IN UPLOAD METHOD "); 
     PluginResult pluginres = null; 

     final Data obje=new Data(token, date, time, email, fileNames); 

     CFileUploader.this.ctx.runOnUiThread(new Runnable(){ 
      public void run(){ 
       MyImageTask mTask=new MyImageTask(); 
       mTask.execute(obje); 
      } 
     }); 

     return pluginres; 
    } 

    class Data { 
     String token, date, time, email, fileNames; 
     Data(String token, String date, String time, String email, String fileNames){ 
      this.token=token; 
      this.date=date; 
      this.time=time; 
      this.email=email; 
      this.fileNames=fileNames; 
     } 

    } 

    private class MyImageTask extends AsyncTask<Data, String, String>{ 

     @Override 
     protected String doInBackground(Data... params) {    
      HttpURLConnection conn = null; 
      DataOutputStream dos = null; 
      DataInputStream inStream = null; 
      ByteArrayOutputStream baos = null; 
      byte[] imgData = null; 
      String urlString = "https://www.sampledata.com/myapp/upload_snapshots.php"; 

      Log.e("Sample App", " token " + params[0].token + " " + "date " + params[0].date + " " 
        + " time " + params[0].time + " " + "email " + params[0].email); 
      Log.e("Sample App", " imgPath " + params[0].fileNames); 

      try { 
       URL url = new URL(urlString); 
       conn = (HttpURLConnection) url.openConnection(); 
       conn.setDoInput(true); 
       conn.setDoOutput(true); 
       conn.setUseCaches(false); 
       conn.setRequestMethod("POST"); 
       conn.setRequestProperty("Connection", "Keep-Alive"); 
       conn.setRequestProperty("Content-Type", 
         "multipart/form-data;boundary=---------------------------1177141514664"); 

       String msg = ""; 
       StringBuffer buffer = new StringBuffer(msg); 
       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"token\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append(params[0].token + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"date\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append(params[0].date + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"time\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append(params[0].time + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"MAX_FILE_SIZE\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append("100000000072000" + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"email\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append(params[0].email + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"appkey\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append("426C3A7D5992B838BAF1BD10594C920C" + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"method\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append("upload.snapshots" + CrLf); 

       String msg1 = ""; 
       StringBuffer imgBuffer = new StringBuffer(msg1); 
       List<byte[]> byetsInfo = new ArrayList<byte[]>(); 
       ArrayList<String> filenames = new ArrayList<String>(); 
       try { 
        JSONObject jObj = new JSONObject(new String(params[0].fileNames)); 
        JSONArray jArray = jObj.getJSONArray("snapshot_images"); 
        String drPath = android.os.Environment 
          .getExternalStorageDirectory().toString(); 

        for (int i = 0; i < jArray.length(); i++) { 
         String img = jArray.getString(i); 
         Log.e("Sample app", " imageName " + img); 

         File f = new File(drPath + "/myapp_images/" + img); 
         Uri ur = Uri.fromFile(f); 
         filenames.add(img); 
         Bitmap bmp; 
         try { 
          bmp = Media.getBitmap(CFileUploader.this.cordova 
            .getActivity().getContentResolver(), ur); 
          baos = new ByteArrayOutputStream(); 
          bmp.compress(CompressFormat.JPEG, 90, baos); 

          imgData = baos.toByteArray(); 
          Log.e("Sample app", " img data size " + imgData.length); 

         } catch (FileNotFoundException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

         byetsInfo.add(imgData); 

        } 

       } catch (JSONException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 

       String msg3 = ""; 
       StringBuffer eofBuffer = new StringBuffer(msg3); 
       eofBuffer.append(CrLf); 
       eofBuffer.append("-----------------------------4664151417711--"); 
       eofBuffer.append(CrLf); 

       conn.setChunkedStreamingMode(0); 

       for (int i = 0; i < byetsInfo.size(); i++) { 
        dos = new DataOutputStream(conn.getOutputStream()); 

        imgBuffer.delete(0, imgBuffer.length()); 
        imgBuffer.append("-----------------------------4664151417711"); 
        imgBuffer.append(CrLf); 
        imgBuffer.append("Content-Disposition: form-data; name=\"snapshotUpload[]\"; filename=\"" 
          + filenames.get(i) + "\"" + CrLf); 
        imgBuffer.append("Content-Type: image/jpeg" + CrLf); 
        imgBuffer.append(CrLf); 

        dos.write(buffer.toString().getBytes()); 
        dos.write(imgBuffer.toString().getBytes()); 

        int index = 0; 
        int size = 1024; 
        do { 

         if ((index + size) < byetsInfo.get(i).length) { 
          size = byetsInfo.get(i).length - index; 
         } 
         dos.write(byetsInfo.get(i), index, size); 
         index += size; 
        } while (index < byetsInfo.get(i).length); 
        Log.e("file upload ", " written: " + index); 

        dos.write(eofBuffer.toString().getBytes()); 

       } 

       Log.e("Debug", "File is written"); 
       Log.e("activity upload demo ", 
         " in file upload " + conn.getResponseMessage()); 
       dos.flush(); 

      } catch (Exception ec) { 
       ec.printStackTrace(); 
      } 

      // Read the response 
      try { 
       inStream = new DataInputStream(conn.getInputStream()); 
       char buff = 512; 
       int len; 
       byte[] data = new byte[buff]; 
       do { 
        len = inStream.read(data); 
        if (len > 0) { 
         System.out.println(new String(data, 0, len)); 
         base64Str += new String(data, 0, len); 
         Log.e("Sample app", " " + new String(data, 0, len)); 
        } 
       } while (len > 0); 
       Log.e("file upload ", " DONE "); 

       dos.close(); 
       inStream.close(); 

      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 

      try { 
       if (conn.getResponseMessage().equalsIgnoreCase("OK")) { 
        return base64Str; 
       } else { 
        return null; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
     } 

    } 

} 

토큰, 날짜, 시간, 전자 메일 및 파일 이름 js 파일에서 가져올 것입니다.

나는이와 함께 base64로 문자열을 얻어야한다 : 나는 위의 안드로이드 3.x 및이 코드를 실행하면

Submitted Requests: 
requests={"imageInfo":{"snapshotDateTime":"2012-12-09 22:38:14","snapshots":{"name":["Water lilies.jpg","Sunset.jpg"],"type":["image\/jpeg","image\/jpeg"],"tmp_name":["\/tmp\/phpXmZchs","\/tmp\/phpqylUgX"],"error":[0,0],"size":[83794,71189]}}} 

나는 그들 중 하나를 얻고 있지 않다. 내가 잘못 가고하는 것이 많은 somewhere.Thanks 경우

은 저를 수정하십시오.

+0

정확하게 작동하지 않는 부분을 게시하십시오. Logcat 출력도 도움이 될 것입니다. –

+0

@AnupCowkur 세부 사항을 추가했습니다. 제발 봐주세요 – Lavanya

+0

나는 그 문제가'HttpUrlConnection'과 관련이 있을지에 대해 기꺼이 ... Honeycomb이 처음 나왔을 때 클래스의 코드에 대한 여러 구현 관련 변경 사항이 있음을 알고 있습니다. 이 문제를 디버그하려면 http 연결의 응답 상태 (즉, conn.getResponseStatus() ... 결과는 무엇입니까?)를 파악합니다. 귀하의 질문에 그런 종류의 물건을 게시하고 아마도 우리는 더 멀리 도울 수 있습니다. 이미 많은 질문이있는 것 같아서 독자적으로 검색하는 Google을 원할 수도 있습니다 (예 : 마지막 게시물 참조 : http://stackoverflow.com/q/10058516/844882) –

답변

1

이 방법에서보세요 . 며칠 동안 고생하고 나자 마침내 솔루션과 코드를 한 줄씩 다 찾아 냈습니다.

conn.setChunkedStreamingMode(0); 

위의 행을 제거했으며 버전에 관계없이 모든 장치에서 정상적으로 작동합니다.

0

여러 개의 업로드를 위해 여러 개의 AsyncTasks를 시작하려고합니다. 각 태스크가 이전의 벌집 버전에는 해당하지만 벌집에서는 true이고 나중에 AsyncTask의 동작이 변경되고 Asynctask의 모든 인스턴스가 단일 스레드로 실행되는 다른 스레드가 있다고 가정합니다. 많은 덕분에 응답 한자는 진정한 병렬 실행

executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.

+0

전화를 한 번만 만들고 http 연결도 한 번만 수행합니다. 내가 보내는 콘텐츠 만 여러 개입니다. – Lavanya

+0

이것은 실제로 두 SDK의 차이점입니다. 그러나 그녀가 두 개 이상의 AsyncTask의 병렬 실행을 결코 수행하지 않기 때문에 OP의 상황에 영향을 주어서는 안됩니다. –

관련 문제