71 votes

Comment envoyer un fichier dans Android depuis un appareil mobile vers un serveur en utilisant http ?

Sous Android, comment envoyer un fichier (données) d'un appareil mobile à un serveur en utilisant http.

12 votes

À quoi ressemblerait le code côté serveur pour une telle requête ?

84voto

Emmanuel Points 6262

Facile, vous pouvez utiliser une requête Post et soumettre votre fichier sous forme binaire (tableau d'octets).

String url = "http://yourserver";
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),
        "yourfile");
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) {
    // show error
}

2 votes

Quel est le nom du paramètre pour recevoir le fichier dans le serveur ?

1 votes

@sanrodari : vous obtenez le fichier dans le tableau $_FILES

2 votes

Mon $_FILES reste vide, je vois beaucoup d'autres posts utilisant MultipartEntity. Ai-je besoin de cela à la place ?

16voto

DaGGeRRz Points 1116

Cela peut être fait avec une demande HTTP Post au serveur :

HttpClient http = AndroidHttpClient.newInstance("MyApp");
HttpPost method = new HttpPost("http://url-to-server");

method.setEntity(new FileEntity(new File("path-to-file"), "application/octet-stream"));

HttpResponse response = http.execute(method);

2 votes

Dans mon cas, il jette une erreur ,IllegalStateException AndroidHttpClient n'a jamais été fermé, je ne sais pas comment le contourner.

0 votes

Votre expérience peut varier, mais pour moi, cela a retourné un ensemble vide de $_FILES du côté du serveur. L'utilisation de la fonction MultiPart a réglé le problème. stackoverflow.com/questions/1067655/

1 votes

Quelle est la valeur par défaut $_FILES['file'] si vous n'en fixez pas ? Est-ce que c'est seulement basename($_FILES['file']['tmp_name'])

10voto

cOcO Points 50

La méthode la plus efficace est d'utiliser Android-async-http

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

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

// send request
AsyncHttpClient client = new AsyncHttpClient();
client.post(url, params, new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] bytes) {
        // handle success response
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] bytes, Throwable throwable) {
        // handle failure response
    }
});

Notez que vous pouvez placer ce code directement dans votre activité principale, sans avoir à créer explicitement une tâche d'arrière-plan. AsyncHttp s'en chargera pour vous !

0 votes

Comment utiliser cette fonction pour télécharger plusieurs fichiers ? je dois attendre le retour de la réponse pour télécharger le fichier suivant, j'ai essayé d'utiliser cette fonction dans une boucle for mais la boucle for n'a pas attendu le retour de la réponse....

9voto

slott Points 835

Enveloppez le tout dans une tâche Async pour éviter les erreurs de threading.

public class AsyncHttpPostTask extends AsyncTask<File, Void, String> {

    private static final String TAG = AsyncHttpPostTask.class.getSimpleName();
    private String server;

    public AsyncHttpPostTask(final String server) {
        this.server = server;
    }

    @Override
    protected String doInBackground(File... params) {
        Log.d(TAG, "doInBackground");
        HttpClient http = AndroidHttpClient.newInstance("MyApp");
        HttpPost method = new HttpPost(this.server);
        method.setEntity(new FileEntity(params[0], "text/plain"));
        try {
            HttpResponse response = http.execute(method);
            BufferedReader rd = new BufferedReader(new InputStreamReader(
                    response.getEntity().getContent()));
            final StringBuilder out = new StringBuilder();
            String line;
            try {
                while ((line = rd.readLine()) != null) {
                    out.append(line);
                }
            } catch (Exception e) {}
            // wr.close();
            try {
                rd.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // final String serverResponse = slurp(is);
            Log.d(TAG, "serverResponse: " + out.toString());
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

0 votes

On peut alors l'appeler avec : new AsyncHttpPostTask(" myserver").execute(new.execute(new) Fichier("monfichier")) ;

4voto

jitain sharma Points 180

La méthode la plus efficace est d'utiliser org.apache.http.entity.mime.MultipartEntity;

voir ce code de la lien en utilisant org.apache.http.entity.mime.MultipartEntity;

public class SimplePostRequestTest3 {

  /**
   * @param args
   */
  public static void main(String[] args) {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://localhost:8080/HTTP_TEST_APP/index.jsp");

    try {
      FileBody bin = new FileBody(new File("C:/ABC.txt"));
      StringBody comment = new StringBody("BETHECODER HttpClient Tutorials");

      MultipartEntity reqEntity = new MultipartEntity();
      reqEntity.addPart("fileup0", bin);
      reqEntity.addPart("fileup1", comment);

      reqEntity.addPart("ONE", new StringBody("11111111"));
      reqEntity.addPart("TWO", new StringBody("222222222"));
      httppost.setEntity(reqEntity);

      System.out.println("Requesting : " + httppost.getRequestLine());
      ResponseHandler<String> responseHandler = new BasicResponseHandler();
      String responseBody = httpclient.execute(httppost, responseHandler);

      System.out.println("responseBody : " + responseBody);

    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      httpclient.getConnectionManager().shutdown();
    }
  }

}

Ajouté :

Exemple de lien

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