2013-04-12 14 views
15

Jest to prosty sposób publikowania plików z systemu Android.Przesyłanie plików i innych danych z Androida za pośrednictwem żądania HTTP POST

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

Co chcę zrobić, to dodać więcej zmiennych POST do mojej prośby. Jak mogę to zrobić? Podczas przesyłania zwykłych ciągów znaków na żądanie POST używamy URLEncodedFormEntity.

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

Podczas gdy przesyłamy pliki, używamy InputStreamEntity.

Ponadto, w jaki sposób mogę przesłać ten plik konkretnie pod numer $_FILES['myfilename']?

+0

spróbuj asynctask..you można użyć HashMap jeśli chcesz przesłać różne typy zmiennych –

+0

oczywiście użyję asynctask. i tak zwykle hashmap dla par wartości nazw służy do wysyłania wielu zmiennych. Ale typy encji dla String i File są różne. To mnie myli. – shiladitya

+1

użyj zgłoszenia wieloczęściowego – njzk2

Odpowiedz

0

kilka sposobów dla Ciebie:

  • make 2 żądania pOST: pierwszy z obrazu pliku. Serwer zwraca identyfikator obrazu, a przy drugim żądaniu dołączasz do tego id twoich parametrów.

  • lub, zamiast rozwiązania "2 żądanie", można użyć żądania MultipartEntity. Look here for more datails

+0

Nie polecam Pierwsza sugestia Jeśli wykonasz dwie prośby i jedna z nich się nie powiedzie, może to oznaczać katastrofę dla twoich danych – chrisbjr

+0

tak, nie polecam też, ale jest takie rozwiązanie.Użyłem drugiej, o wiele lepiej – validcat

1

Ponieważ chcesz plików wysyłania z aplikacji, tutaj jest dobry poradnik dla Ciebie:

Uploading files to HTTP server using POST on Android.

Jeśli chcesz przesłać ciągi jak dobrze, myślę, że wiesz już rozwiązanie:)

+0

hej Akash! Dziękuję za odpowiedź, ale wciąż nie odpowiedziałem na moje pytanie. Jeśli nie masz wątpliwości, to pytanie jest dokładnie takie samo. http://stackoverflow.com/questions/11598457/android-how-to-send-song-file-to-server-throught-httppost-along-with-other-vari?rq=1 niestety to też nie jest rozwiązane :( – shiladitya

+0

ok, mam to tutaj są niektóre pytania z odpowiedziami dla twojego rodzaju problemu:

1

najskuteczniejszą metodą jest użycie android-async-http

Można użyć tego kodu, aby przesłać plik:



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

+0

mogę przesyłać pliki dowolnego rodzaju za pomocą tej biblioteki i nie muszę określać mi e type –

+1

Tak. Możesz przesyłać pliki dowolnego rodzaju. –

+0

Moja rada: trzymaj się z dala od loopj. Użyłem go zbyt długo i to jest bardzo pomocne w obsłudze SSL. Jest to znany błąd od dawna i najwyraźniej nie można go naprawić z powodu infrastruktury używanej w bibliotece. Zamiast tego użyj opcji volley lub retrofit/simplehttp. –

1

Po spędzeniu cały dzień znaleziono loopj. Możesz śledzić ten przykładowy kod:

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

    } 
Powiązane problemy