2016-07-26 2 views
1

한 번에 여러 이미지를 업로드하고 싶습니다. 그래서 'MultipartEntityBuilder'를 찾았지만 제대로 작동하지 않습니다.Android에서 Multipart를 사용하려면 어떻게해야합니까?

그것은 내 소스의 ...

public void executeMultipartPost() throws Exception { 
    try { 

     MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
     builder.setCharset(Charset.forName("UTF-8")); 
     builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); 
     byteArray = byteArrayOutputStream.toByteArray(); 


     builder.addTextBody("file1", byteArray.toString()); 
     builder.addTextBody("file2", byteArray2.toString()); 

     // send 
     InputStream inputStream = null; 
     HttpClient httpClient = AndroidHttpClient.newInstance("Android"); 
     HttpPost httpPost = new HttpPost(UPLOAD_URL); 
     httpPost.setEntity(builder.build()); 
     HttpResponse httpResponse = httpClient.execute(httpPost); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     inputStream = httpEntity.getContent(); 

     // response 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); 
     StringBuilder stringBuilder = new StringBuilder(); 
     String line = null; 
     while ((line = bufferedReader.readLine()) != null) { 
      stringBuilder.append(line + "\n"); 
     } 
     inputStream.close(); 

     // result 
     String result = stringBuilder.toString(); 

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

'(builder.build()) httpPost.setEntity'이 줄은 오류가 디버깅이다. NoSuchFiledError 로그 캣에서 ...

하지만 난 다음 비트 맵 FTP로 전송하는 이미지를 만들었 생각 :

은 더 '~에 의한',하지만 프로세스가 없습니다. 뭐가 잘못 되었 니..? 감사.

답변

1

코드가 MultipartEntity의 사용되지 않는 코드를 제거하고 MultipartEntityBuilder를 사용할 수 있습니다. 그러나 여기에 관련된 구체적인 문제는 핵심 Android 라이브러리가 새로 추가 된 것과 충돌한다는 것입니다. 또한 사용할 수있는 저장소가 있습니다. 당신은 아래 파일에 다음 코드를 시도해 볼 수도 있습니다 ...

build.grade (Module:app) 
compile('org.apache.httpcomponents:httpmime:4.3.6') { 
    exclude module: 'httpclient' 
} 

compile 'org.apache.httpcomponents:httpclient-android:4.3.5' 

Getting NoSuchFieldError INSTANCE org/apache/http/message/BasicHeaderValueParser

+0

흠이 말은 버전은 아주 다르다 ?? 나는 4.3.6으로 바꿀 것이다. 하지만 이클립스 - 안드로이드를 사용하고있어. 그래서 병이 필요해. 나는 시험 할 것이다!! 감사. – Adrian

+0

예 나는 주로 사용자가 일식 오는 것을 알고 : –

+0

흠 ... 내가 http * ??? – Adrian

1

공공 정적 UploadResult 업로드 (최종 비트 맵 비트 맵, 최종 컨텍스트 컨텍스트) {

StringBuilder builder = new StringBuilder(); 
    UploadResult result = null; 
    try { 
     URL uri = new URL(context.getString(R.string.base_url) + context.getString(R.string.api_upload)); 
     HttpURLConnection con = (HttpURLConnection) uri.openConnection(); 
     con.setConnectTimeout(20000); 
     con.setReadTimeout(20000); 
     con.setRequestMethod("POST"); 
     con.setDoOutput(true); 
     con.setDoInput(true); 

     con.setRequestProperty("Charset", "UTF-8"); 
     con.setRequestProperty("connection", "keep-alive"); 
     String BOUNDARY = UUID.randomUUID().toString(); 
     String LINE_END = "\r\n"; 
     String PREFIX = "--"; 
     con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + BOUNDARY); 

     OutputStream os = con.getOutputStream(); 

     String sb = PREFIX + 
       BOUNDARY + 
       LINE_END + 
       "Content-Disposition: form-data; name=\"file\"; filename=\"tmp.png\"" + LINE_END + 
       "Content-Type: application/octet-stream; charset=UTF-8" + LINE_END + 
       LINE_END; 

     os.write(sb.getBytes()); 
     os.write(Util.Bitmap2Byte(bitmap)); 

     os.write(LINE_END.getBytes()); 
     byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes(); 
     os.write(end_data); 

     os.flush(); 
     os.close(); 
     int code = con.getResponseCode(); 
     System.out.println("code:" + code); 
     BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8")); 

     if (code == 200) { 
      String ch; 
      while (null != (ch = br.readLine())) { 
       builder.append(ch); 
      } 
     } 
     con.disconnect(); 

     String response = builder.toString(); 
     if (!response.isEmpty()) { 
      result = JSON.parseObject(response, UploadResult.class); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return result; 
} 
+0

UploadResult 클래스 란 무엇입니까 ?? 이 클래스를 가져올 수 없습니다 ... – Adrian

+0

HTTP 응답입니다. 응답이 json 또는 xml이면 UploadResult가 응답 엔터티 –

+0

JSON이 fastjson이고, gson으로 변경할 수도 있습니다 –