2016-07-26 2 views
1

Je veux télécharger plusieurs images à la fois. alors j'ai trouvé 'MultipartEntityBuilder' mais ça ne fonctionne pas bien.Comment utiliser Multipart sur Android?

Il est ma source ...

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(); 
    } 
} 

lors du débogage, 'httpPost.setEntity (builder.build())' cette ligne est une erreur.

et il n'y a pas « causé par ~ », mais le processus: NoSuchFiledError dans logcat ...

mais je pense que je fait l'image bitmap envoyer ensuite à FTP. Qu'est-ce qui ne va pas..? Merci.

Répondre

1

votre code pourrait se débarrasser du code déprécié de MultipartEntity et utiliser MultipartEntityBuilder. Cependant, le problème spécifique lié ici est que les bibliothèques Android de base entrent en conflit avec les nouvelles. Aussi maintenant il y a des dépôts de Maven disponibles. Vous pouvez essayer le code suivant dans le fichier ci-dessous:

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

hm ... vous voulez dire que le la version est assez différente? Je vais changer en 4.3.6. mais j'utilise eclipse-android ... donc j'ai besoin de pot. Je vais essayer!! Merci. – Adrian

+0

oui je sais surtout qu'il vient aux utilisateurs d'éclipse :) –

+0

hm ... Est-ce que je change http * ??? – Adrian

1

upload UploadResult public static (bitmap finale Bitmap, le contexte final Contexte) {

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

qu'est ce que UploadResult Class ?? Je ne peux pas importer cette classe ... – Adrian

+0

c'est la réponse http, vous pouvez le changer en String, si la réponse est json ou xml, le UploadResult est l'entité de réponse –

+0

JSON est fastjson, vous pouvez aussi le changer en gson –