2014-11-07 4 views
3

Multipart 접근 방식을 사용하여 내 앱에서 서버로 이미지 파일을 업로드하려고합니다. 요청을 보내 자마자 "반복 불가능한 요청 예외"라는 문제가 생겼습니다. 나는이 접근법에 익숙하지 않고 이것을 다루는 방법을 모른다.다중 부분에서 반복되지 않는 요청 예외 android

여기 내 코드입니다 : -

File imageFile = new File("/mnt/sdcard/link.jpg"); 
      Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath()); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); 
      byte[] image = stream.toByteArray(); 
      String img_str = Base64.encodeToString(image, 0); 

      InputStream imageStream; 
      JSONObject objResult; 
      boolean bSucess = true; 
      // Base 64 image string was stored with image object , 
      //String imageBase64 = image.getImageString(); 
      // This base64 to byte , One can directly read bytes from file from Disk 
      String imageDataBytes = img_str.substring(img_str.indexOf(",")+1); 
      HttpClient client = null; 
      HttpPost post = null; 
      HttpResponse response = null; 
      HttpEntity httpEntity = null; 

      imageStream = new ByteArrayInputStream(Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT)); 
      try{ 
       //Forming Json Object 
       JSONObject jsonImageMetdata = new JSONObject();  
       JSONObject objMultipart = new JSONObject();  
       try { 

        objMultipart.put("status", 1+""); 
        objMultipart.put("type", "Photo"); 
        objMultipart.put("filename", "menu.jpg"); 
        objMultipart.put("filetype", "image/jpeg"); 
        objMultipart.put("user_id", "1"); 
        objMultipart.put("auth_id", "1"); 
        objMultipart.put("userfile", Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT)); 
        jsonImageMetdata.put("MultipartImageMetadata", objMultipart); 
       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       // converting json data to string 
       String strImageMetadata = jsonImageMetdata.toString(); 
       client = new DefaultHttpClient(); 
       post = new HttpPost("http://stage.phonethics.in/inorbitapp/place_api/menu_list"); 
       post.setHeader("X-API-KEY", "d41d8cd98f00b204e9800998ecf8427e"); 
       MultipartEntityBuilder entityBuilder = null; 
       try{ 
        entityBuilder = MultipartEntityBuilder.create(); 
       } 
       catch(Exception a){ 
        Log.d("name",a.getMessage()); 
        throw a;     
       } 
       entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);  

       // adding text 
       entityBuilder.addTextBody("dummyParameter","Dummy text",ContentType.TEXT_PLAIN);    

       // adding Image 
       if(imageStream != null){     
        entityBuilder.addBinaryBody("file", imageStream,ContentType.create("image/jpeg"),"imagename.jpg"); 
       }   

       // sending formed json data in form of text 
       entityBuilder.addTextBody("descriptions", strImageMetadata, ContentType.APPLICATION_JSON) ; 
       HttpEntity entity = entityBuilder.build(); 
       post.setEntity(entity);   
       response = client.execute(post); 
       httpEntity = response.getEntity(); 
       result = EntityUtils.toString(httpEntity); 

누군가가 나를이 밖으로 정렬하는 데 도움이 될 수 있습니다. 어떤 도움을받을 수 있습니다. 감사합니다. .

답변

2

내 팀은 이번 주에 같은 문제가 발생했습니다. 신체에 InputStream을 사용하는 것이 문제의 근본 원인이라는 것이 밝혀졌습니다. InputStream은 다시 읽을 수 없기 때문에 요청은 "Non repeatable"로 표시됩니다. java.io.File을 허용하는 것과 같은 다른 addBinaryBody 메서드 서명 중 하나를 사용해야합니다.

+0

이 답변은 바로 돈입니다! 나는'InputStreamBody' 구현을'FileBody'로 대체했고 문제는 사라졌습니다. –

0

나는이 문제를 JetS3t Amazon 툴킷 클래스를 사용하여 해결했으며 그의 이름은 RepeatableInputStream입니다. 귀하의 경우에는 귀하의 의존성에 가져옵니다. 내 프로젝트에서는 Ivy를 사용합니다. 두 가지 모드를 보여줍니다.

메이븐 :

<dependency> 
<groupId>net.java.dev.jets3t</groupId> 
<artifactId>jets3t</artifactId> 
<version>0.7.2</version> 
</dependency> 

아이비 :

<dependency org="net.java.dev.jets3t" name="jets3t" rev="0.7.2"/> 

당신 같이 ImageStream의 사용이 수업 후 자신과 같은 반복을 포장하십시오.

// adding Image 
     if(imageStream != null){ 
     RepeatableInputStream imageStreamRepeatable = new RepeatableInputStream(imageStream,imageDataBytes.getBytes()); 

     entityBuilder.addBinaryBody("file", imageStreamRepeatable,ContentType.create("image/jpeg"),"imagename.jpg"); 
     }