126 votes

Envoi d'images à l'aide de Http Post

Je veux envoyer une image depuis le client Android vers le serveur Django en utilisant Http Post. L'image est choisie dans la galerie. Actuellement, j'utilise des paires liste-valeur-nom pour envoyer les données nécessaires au serveur et je reçois les réponses de Django en JSON. La même approche peut-elle être utilisée pour les images (avec les urls des images intégrées dans les réponses JSON) ?

Par ailleurs, quelle est la meilleure méthode : accéder aux images à distance 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 permettant de résoudre ces problèmes serait très apprécié.

Edit : Les images choisies dans la galerie sont envoyées au serveur après avoir été mises à l'échelle à la taille requise.

143voto

Piro Points 1796

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

L'envoi d'images peut se faire à l'aide de la fonction Bibliothèques HttpComponents . Téléchargez la dernière version de HttpClient (actuellement 4.0.1 ) binaire avec le paquet de dépendances et copier apache-mime4j-0.6.jar et httpmime-4.0.1.jar à votre projet et ajoutez-les à votre chemin de construction Java.

Vous devrez ajouter 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.StringBody;

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

public void post(String url, List<NameValuePair> 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.

14voto

AZ_ Points 7127

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éprécié . Veuillez consulter le code ci-dessous.

String responseBody = "failure";
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

String url = WWPApi.URL_USERS;
Map<String, String> map = new HashMap<String, String>();
map.put("user_id", String.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.toString(client.execute(post).getEntity(), "UTF-8");
//  System.out.println("Response from Server ==> " + responseBody);

    JSONObject object = new JSONObject(responseBody);
    Boolean success = object.optBoolean("success");
    String message = object.optString("error");

    if (!success) {
        responseBody = message;
    } else {
        responseBody = "success";
    }

} catch (Exception e) {
    e.printStackTrace();
} finally {
    client.getConnectionManager().shutdown();
}

-13voto

Dylan McClung Points 80

Je fais généralement cela dans le fil de discussion qui traite 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 voudrez créer un Drawable au lieu d'un Bitmap.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X