Envoi d’images à l’aide de Http Post

Je veux envoyer une image du client Android au serveur Django en utilisant Http Post. L’image est choisie dans la galerie. À l’heure actuelle, j’utilise le nom de valeur de liste Pairs pour envoyer les données nécessaires au serveur et recevoir les réponses de Django en JSON. Peut-on utiliser la même approche pour les images (avec les URL pour les images incorporées dans les réponses JSON)?

En outre, quelle est la meilleure méthode: accéder à distance aux images sans les télécharger du serveur ou les télécharger et les stocker dans un tableau Bitmap et les utiliser localement? Les images sont peu nombreuses (<10) et de petite taille (50 * 50 dip).

Tout tutoriel pour résoudre ces problèmes serait très apprécié.

Modifier: les images choisies dans la galerie sont envoyées au serveur après leur mise à l’échelle à la taille requirejse.

Je vais supposer que vous connaissez le chemin et le nom de fichier de l’image que vous souhaitez télécharger. Ajoutez cette chaîne à votre NameValuePair utilisant l’ image comme nom de clé.

L’envoi d’images peut être effectué à l’aide des bibliothèques HttpComponents . Téléchargez le dernier package binary HttpClient (actuellement 4.0.1 ) avec des dépendances et copiez apache-mime4j-0.6.jar et httpmime-4.0.1.jar dans votre projet et ajoutez-les à votre chemin de génération Java.

Vous devrez append les importations suivantes à votre classe.

 import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.SsortingngBody; 

Vous pouvez maintenant créer une MultipartEntity pour attacher une image à votre requête POST. Le code suivant montre un exemple de la façon de procéder:

 public void post(Ssortingng url, List nameValuePairs) { HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpPost httpPost = new HttpPost(url); try { MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); for(int index=0; index < nameValuePairs.size(); index++) { if(nameValuePairs.get(index).getName().equalsIgnoreCase("image")) { // If the key equals to "image", we use FileBody to transfer the data entity.addPart(nameValuePairs.get(index).getName(), new FileBody(new File (nameValuePairs.get(index).getValue()))); } else { // Normal string data entity.addPart(nameValuePairs.get(index).getName(), new StringBody(nameValuePairs.get(index).getValue())); } } httpPost.setEntity(entity); HttpResponse response = httpClient.execute(httpPost, localContext); } catch (IOException e) { e.printStackTrace(); } } 

J'espère que cela vous aidera un peu dans la bonne direction.

Version 4.3.5 Code mis à jour

  • httpclient-4.3.5.jar
  • httpcore-4.3.2.jar
  • httpmime-4.3.5.jar

Depuis MultipartEntity a été déconseillé . Veuillez consulter le code ci-dessous.

 Ssortingng responseBody = "failure"; HttpClient client = new DefaultHttpClient(); client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); Ssortingng url = WWPApi.URL_USERS; Map map = new HashMap(); map.put("user_id", Ssortingng.valueOf(userId)); map.put("action", "update"); url = addQueryParams(map, url); HttpPost post = new HttpPost(url); post.addHeader("Accept", "application/json"); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(MIME.UTF8_CHARSET); if (career != null) builder.addTextBody("career", career, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (gender != null) builder.addTextBody("gender", gender, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (username != null) builder.addTextBody("username", username, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (email != null) builder.addTextBody("email", email, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (password != null) builder.addTextBody("password", password, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (country != null) builder.addTextBody("country", country, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (file != null) builder.addBinaryBody("Filedata", file, ContentType.MULTIPART_FORM_DATA, file.getName()); post.setEntity(builder.build()); try { responseBody = EntityUtils.toSsortingng(client.execute(post).getEntity(), "UTF-8"); // System.out.println("Response from Server ==> " + responseBody); JSONObject object = new JSONObject(responseBody); Boolean success = object.optBoolean("success"); Ssortingng message = object.optSsortingng("error"); if (!success) { responseBody = message; } else { responseBody = "success"; } } catch (Exception e) { e.printStackTrace(); } finally { client.getConnectionManager().shutdown(); } 

La bibliothèque loopj peut être utilisée directement à cette fin:

 SyncHttpClient client = new SyncHttpClient(); RequestParams params = new RequestParams(); params.put("text", "some ssortingng"); params.put("image", new File(imagePath)); client.post("http://example.com", params, new TextHttpResponseHandler() { @Override public void onFailure(int statusCode, Header[] headers, Ssortingng responseSsortingng, Throwable throwable) { // error handling } @Override public void onSuccess(int statusCode, Header[] headers, Ssortingng responseSsortingng) { // success } }); 

http://loopj.com/

J’ai eu beaucoup de mal à implémenter la publication d’une image d’un client Android sur un servlet à l’aide de httpclient-4.3.5.jar, httpcore-4.3.2.jar, httpmime-4.3.5.jar. J’ai toujours eu une erreur d’exécution. J’ai découvert que fondamentalement, vous ne pouvez pas utiliser ces jars avec Android, car Google utilise une ancienne version de HttpClient dans Android. L’explication est ici http://hc.apache.org/httpcomponents-client-4.3.x/android-port.html . Vous devez obtenir le fichier httpclientandroidlib-1.2.1 à partir de la bibliothèque Android http-client . Puis changez vos importations de ou.apache.http.client à ch.boye.httpclientandroidlib. J’espère que cela t’aides.

Je le fais généralement dans le thread gérant la réponse json:

 try { Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

Si vous devez effectuer des transformations sur l’image, vous devez créer un fichier Drawable au lieu d’une image bitmap.