web-dev-qa-db-fra.com

Envoi d'images à l'aide de Http Post

Je souhaite envoyer une image du client Android au client Django à l'aide de Http Post. L'image est sélectionnée dans la galerie. À l'heure actuelle, j'utilise list value name 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 des URL pour les images incorporées dans des réponses JSON)?

En outre, 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 pour aborder ces problèmes serait très apprécié.

Édition: les images sélectionnées dans la galerie sont envoyées au serveur après l’avoir redimensionné à la taille requise.

125
Primal Pappachan

Je suppose que vous connaissez le chemin d'accès et le nom du fichier de l'image que vous souhaitez télécharger. Ajoutez cette chaîne à votre NameValuePair en utilisant image comme nom de clé.

L'envoi d'images peut être effectué à l'aide de bibliothèques HttpComponents . Téléchargez le dernier fichier binaire avec dépendances HttpClient (actuellement 4.0.1 ) et copiez 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;

Maintenant, vous pouvez créer un MultipartEntity pour attacher une image à votre demande POST. Le code suivant montre un exemple de la procédure à suivre:

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 aide un peu dans la bonne direction.

143
Piro

Version mise à jour du code 4.3.5

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

Depuis MultipartEntity a été obsolète. 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();
}
14
AZ_

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

SyncHttpClient client = new SyncHttpClient();
RequestParams params = new RequestParams();
params.put("text", "some string");
params.put("image", new File(imagePath));

client.post("http://example.com", params, new TextHttpResponseHandler() {
  @Override
  public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
    // error handling
  }

  @Override
  public void onSuccess(int statusCode, Header[] headers, String responseString) {
    // success
  }
});

http://loopj.com/

10
vonox7

J'ai eu beaucoup de mal à mettre en œuvre la publication d'une image de Android client à servlet à l'aide de httpclient-4.3.5.jar, httpcore-4.3.2.jar, httpmime-4.3.5.jar. I J'ai toujours découvert que vous ne pouvez pas utiliser ces fichiers avec Android car Google utilise une version plus ancienne 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 bibliothèque Android http-client . Ensuite, changez vos importations de or.Apache.http.client vers ch.boye.httpclientandroidlib. J'espère que cela vous aidera.

5
DavidC