web-dev-qa-db-fra.com

Télécharger une photo à l'aide de HttpPost MultiPartEntityBuilder

J'essaie de télécharger la photo prise sur le serveur. c'est ce que je fais:

public JSONObject makePostFileRequest(String url, String photoFile) {
    try {
        // photoFile = /path/tofile/pic.jpg
        DefaultHttpClient httpClient = GlobalData.httpClient;
        HttpPost httpPost = new HttpPost(url);

        File file = new File(photoFile);
        FileBody fileBody = new FileBody(file); // here is line 221

        MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();

        multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        multipartEntity.addPart("PhotoMessage", fileBody);

        httpPost.setEntity(multipartEntity.build());

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

Je reçois cette erreur:

11-29 13: 12: 14.924: E/AndroidRuntime (15781): Causé par: Java.lang.NoClassDefFoundError: org.Apache.http.entity.ContentType 11-29 13: 12: 14.924: E/AndroidRuntime (15781): à l'adresse org.Apache.http.entity.mime.content.FileBody. (FileBody.Java:89). 11-29 13: 12: 14.924: E/AndroidRuntime (15781): sur com.petcial.petopen.custom.JSONParser.makePostFileRequest (JSONParser.Java:221)

Qu'est-ce que je fais mal?


Mettre à jour

InputStream inputStream;
inputStream = new FileInputStream(new File(photoFile));
byte[] data;
data = IOUtils.toByteArray(inputStream);

httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
                        System.getProperty("http.agent"));
InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data), "Pic.jpg");

MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();

multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("PhotoMessage", inputStreamBody);

httpPost.setEntity(multipartEntity.build());

HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();

voici l'erreur:

11-29 14: 00: 33.364: E/AndroidRuntime (19478): Causé par: Java.lang.NoClassDefFoundError: org.Apache.http.util.Args 11-29 14: 00: 33.364: E/AndroidRuntime (19478): à org.Apache.http.entity.mime.content.AbstractContentBody. (AbstractContentBody.Java:48) 11-29 14: 00: 33.364: E/AndroidRuntime (19478): à l'adresse org.Apache.http.entity.mime.content.InputStreamBody. (InputStreamBody.Java:69). 11-29 14: 00: 33.364: E/AndroidRuntime (19478): à org.Apache.http.entity.mime.content.InputStreamBody. (InputStreamBody.Java:62) 11-29 14: 00: 33.364: E/AndroidRuntime (19478): à com.petcial.petopen.custom.JSONParser.makePostFileRequest (JSONParser.Java:233)

ces bibliothèques ont résolu mon problème:

23
Filip Luchianenco

enter image description here Vérifiez ce fichier dans l’onglet Ordre et export et exécutez-le.

8
Anil Bhatiya

Il y a ma solution de travail pour envoyer une image avec post, en utilisant les bibliothèques HTTP Apache (très important ici, c'est border addition Cela ne fonctionnera pas sans elle dans mon cas):

ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] imageBytes = baos.toByteArray();

HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(StaticData.AMBAJE_SERVER_URL + StaticData.AMBAJE_ADD_AMBAJ_TO_GROUP);

String boundary = "-------------" + System.currentTimeMillis();

httpPost.setHeader("Content-type", "multipart/form-data; boundary="+boundary);

ByteArrayBody bab = new ByteArrayBody(imageBytes, "pic.png");
StringBody sbOwner = new StringBody(StaticData.loggedUserId, ContentType.TEXT_PLAIN);
StringBody sbGroup = new StringBody("group", ContentType.TEXT_PLAIN);

HttpEntity entity = MultipartEntityBuilder.create()
                    .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
                    .setBoundary(boundary)
                    .addPart("group", sbGroup)
                    .addPart("owner", sbOwner)
                    .addPart("image", bab)
                    .build();

httpPost.setEntity(entity);

try {
       HttpResponse response = httpclient.execute(httpPost);
       ...then reading response
6
Krystian

Mieux vaut passer le chemin du fichier image. Vous trouverez ci-dessous le code que j'ai utilisé pour télécharger l'image sur le serveur. 

public class UploadProductDetails {


    public void uploadProductDetails(String filePath, String fileName)
    {

        InputStream inputStream;
        try
        {
            inputStream = new FileInputStream(new File(filePath));
            byte[] data;
            try
            {
                data = IOUtils.toByteArray(inputStream);

                HttpClient httpClient = new DefaultHttpClient();

                httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
                        System.getProperty("http.agent"));



                HttpPost httpPost = new HttpPost("http://ipaddress");


                InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data), "abc.png");
                MultipartEntity multipartEntity = new MultipartEntity();
                multipartEntity.addPart("file", inputStreamBody);


                httpPost.setEntity(multipartEntity);
                HttpResponse httpResponse = httpClient.execute(httpPost);

                // Handle response back from script.
                if(httpResponse != null) {
                    //Toast.makeText(getBaseContext(),  "Upload Completed. ", 2000).show();

                } else { // Error, no response.
                    //Toast.makeText(getBaseContext(),  "Server Error. ", 2000).show();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
    }

}
1
Anil Bhatiya

Notez que l'utilisation de ce code: new InputStreamBody(new ByteArrayInputStream(yourByteArray)) peut entraîner des problèmes, car il renvoie -1 lors de l'appel de getContentLength().

À la place, utilisez ceci: new ByteArrayBody(yourByteArray)

0
Yoav Feuerstein