2013-04-12 27 views
15

Đây là cách đơn giản để đăng tệp từ Android.Tải tệp lên và các dữ liệu khác từ Android thông qua yêu cầu BÀI ĐĂNG

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

Điều tôi muốn làm là thêm thêm POST biến vào yêu cầu của tôi. Làm thế nào để làm điều đó? Trong khi tải lên các chuỗi đơn giản trong yêu cầu POST, chúng tôi sử dụng URLEncodedFormEntity.

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

Trong khi tải lên tệp, chúng tôi sử dụng InputStreamEntity.

Ngoài ra, làm cách nào để tải cụ thể tệp này lên $_FILES['myfilename']?

+0

thử sử dụng asynctask..bạn có thể sử dụng hashmap nếu bạn muốn tải lên các loại biến khác nhau –

+0

rõ ràng là tôi sẽ sử dụng asynctask. và có thường hashmap của cặp giá trị tên được sử dụng để gửi nhiều biến. Tuy nhiên, các loại thực thể cho chuỗi và tệp khác nhau. Điều đó làm tôi bối rối. – shiladitya

+1

sử dụng yêu cầu nhiều phần – njzk2

Trả lời

0

Một vài cách để bạn có:

  • làm 2 bài yêu cầu: thứ nhất với hình ảnh file. Máy chủ trả về một id hình ảnh, và với yêu cầu thứ hai bạn đính kèm với id này params của bạn.

  • hoặc, thay vì giải pháp '2 yêu cầu', bạn có thể sử dụng yêu cầu MultipartEntity. Look here for more datails

+0

Tôi sẽ không đề xuất Nếu bạn thực hiện hai yêu cầu và một trong hai yêu cầu đó không thành công, nó có thể gây ra thảm họa cho dữ liệu của bạn – chrisbjr

+0

vâng, tôi cũng không đề xuất, nhưng có giải pháp như vậy.Tôi đã sử dụng thứ hai, tốt hơn nhiều là – validcat

1

Vì bạn muốn file upload từ ứng dụng của bạn, đây là một hướng dẫn tốt cho bạn:

Uploading files to HTTP server using POST on Android.

Nếu bạn muốn tải lên dây là tốt, tôi nghĩ rằng bạn đã biết các giải pháp:)

+0

hey Akash! cảm ơn câu trả lời của bạn nhưng nó vẫn không trả lời được câu hỏi của tôi. Nếu bạn không nhận được sự nghi ngờ của tôi, câu hỏi này là chính xác như nhau. http://stackoverflow.com/questions/11598457/android-how-to-send-song-file-to-server-throught-httppost-along-with-other-vari?rq=1 không may điều này cũng chưa được giải quyết :( – shiladitya

+0

okay tôi nhận nó ở đây là một số câu hỏi với câu trả lời cho loại vấn đề của bạn:

1

phương pháp hiệu quả nhất là sử dụng android-async-http

Bạn có thể sử dụng mã này để tải lên tập tin:



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

+0

tôi có thể tải lên bất kỳ loại tệp nào bằng Thư viện này và không phải chỉ định loại mi e –

+1

Có. YOu có thể tải lên bất kỳ loại tệp nào –

+0

Lời khuyên của tôi là: tránh xa loopj. Tôi đã sử dụng nó quá lâu và rất thiếu hỗ trợ SSL. Nó đã được biết đến một lỗi trong một thời gian dài và dường như nó không thể được cố định do cơ sở hạ tầng được sử dụng trong thư viện. Sử dụng cú volley hoặc trang bị thêm/simplehttp để thay thế. –

1

Sau khi dành trọn một ngày tìm thấy loopj. Bạn có thể làm theo mẫu mã này:

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

    }