2013-04-12 20 views
15

Questo è un modo semplice per inviare file da Android.Caricamento di file e altri dati da Android tramite Http POST request

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(); 
} 

Quello che voglio fare è aggiungere più variabili POST alla mia richiesta. Come lo faccio? Durante il caricamento di stringhe semplici nella richiesta POST, usiamo URLEncodedFormEntity.

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

Mentre durante il caricamento dei file, usiamo InputStreamEntity.

Inoltre, come caricare questo file in modo specifico su $_FILES['myfilename']?

+0

provare a utilizzare asynctask..you può usare un HashMap se si desidera caricare diversi tipi di variabili –

+0

ovviamente userò AsyncTask. e sì solitamente viene utilizzata l'hashmap delle coppie nome-valore per l'invio di più variabili. Ma i tipi di entità per String e File sono diversi. Questo mi confonde. – shiladitya

+1

usa la richiesta multipart – njzk2

risposta

0

A pochi modi per voi:

  • make 2 richieste pOST: in primo luogo con l'immagine del file. Il server restituisce un ID immagine e con la seconda richiesta si allegano a questo parametro i propri parametri.

  • oppure, invece della soluzione '2 richiesta', è possibile utilizzare la richiesta MultipartEntity. Look here for more datails

+0

Non mi sento di consigliarlo primo suggerimento.Se si fanno due richieste e uno di questi fallisce, si può scrivere un disastro per i propri dati. – chrisbjr

+0

sì, non lo raccomando, ma c'è una soluzione del genere.Ho usato il secondo, è molto meglio – validcat

1

Dal momento che si desidera caricare file dalla tua app, ecco un buon tutorial per voi:

Uploading files to HTTP server using POST on Android.

Se si desidera caricare le stringhe così, penso che si conosce già la soluzione:)

+0

hey Akash! grazie per la tua risposta, ma non ha ancora risposto alla mia domanda. Se non hai avuto il mio dubbio, questa domanda è esattamente la stessa. http://stackoverflow.com/questions/11598457/android-how-to-send-song-file-to-server-throught-httppost-along-with-other-vari?rq=1 sfortunatamente anche questo non è risolto :( – shiladitya

+0

ok ho capito ecco alcune domande con le risposte per il tuo tipo di problema:

1

il metodo più efficace è quello di utilizzare android-async-http

È possibile utilizzare questo codice per caricare il file:



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

+0

posso caricare qualsiasi tipo di file utilizzando questa libreria e non è necessario specificare mi tipo –

+1

Sì. Puoi caricare qualsiasi tipo di file –

+0

Il mio consiglio è: stai lontano da loopj. L'ho usato troppo a lungo, e fa schifo nel supportare SSL. È stato un bug noto da molto tempo e apparentemente non è stato corretto a causa dell'infrastruttura utilizzata nella libreria. Usa volley o retrofit/simplehttp invece. –

1

Dopo aver trascorso una giornata intera trovato loopj. Puoi seguire questo esempio di codice:

//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.."); 
      } 
     }); 

    } 
Problemi correlati