web-dev-qa-db-fra.com

Téléchargement de fichiers et d'autres données de Android via Http POST

Il s'agit d'un moyen simple de publier des fichiers depuis Android.

String url = "http://yourserver.com/upload.php";
File file = new File("myfileuri");
try {
    HttpClient httpclient = new DefaultHttpClient();

    HttpPost httppost = new HttpPost(url);

    InputStreamEntity reqEntity = new InputStreamEntity(new FileInputStream(file), -1);
    reqEntity.setContentType("binary/octet-stream");
    reqEntity.setChunked(true); // Send in multiple parts if needed
    httppost.setEntity(reqEntity);
    HttpResponse response = httpclient.execute(httppost);
    //Do something with response...

} catch (Exception e) {
    e.printStackTrace();
}  

Ce que je veux faire, c'est ajouter plus de variables POST à ma demande. Comment je fais ça? Lors du téléchargement de chaînes simples dans une demande POST, nous utilisons URLEncodedFormEntity.

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

Alors que lors du téléchargement de fichiers, nous utilisons InputStreamEntity.

De plus, comment puis-je télécharger spécifiquement ce fichier sur $_FILES['myfilename']?

15
shiladitya

Quelques façons pour vous:

  • faire 2 demandes de publication: d'abord avec le fichier image. Le serveur renvoie un identifiant d'image et, à la deuxième demande, vous associez à cet identifiant vos paramètres.

  • ou, au lieu de la solution '2 request', vous pouvez utiliser la requête MultipartEntity. Regardez ici pour plus de données

0
validcat

Après avoir passé une journée complète trouvé loopj . Vous pouvez suivre cet exemple de code:

//context: Activity context, Property: Custom class, replace with your pojo
public void postProperty(Context context,Property property){
        // Creates a Async client. 
        AsyncHttpClient client = new AsyncHttpClient();
         //New File
        File files = new File(property.getImageUrl());
        RequestParams params = new RequestParams();
        try {
            //"photos" is Name of the field to identify file on server
            params.put("photos", files);
        } catch (FileNotFoundException e) {
            //TODO: Handle error
            e.printStackTrace();
        }
        //TODO: Reaming body with id "property". prepareJson converts property class to Json string. Replace this with with your own method 
        params.put("property",prepareJson(property));
        client.post(context, baseURL+"upload", params, new AsyncHttpResponseHandler() {
            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                System.out.print("Failed..");
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                System.out.print("Success..");
            }
        });

    }
1
Ram Mandadapu

Puisque vous souhaitez télécharger des fichiers à partir de votre application, voici un bon tutoriel pour vous:

Téléchargement de fichiers sur le serveur HTTP en utilisant POST sur Android.

Si vous souhaitez également télécharger des chaînes, je pense que vous connaissez déjà la solution :)

1
Akash Shah

la méthode la plus efficace consiste à utiliser Android-async-http

Vous pouvez utiliser ce code pour télécharger un fichier:

 

    File myFile = new File("/path/to/file.png");
    RequestParams params = new RequestParams();
    try {
        params.put("profile_picture", myFile);
    } catch(FileNotFoundException e) {}

1
H.S.H