2014-06-11 17 views
8

Tôi muốn thực hiện yêu cầu PUT với phần JSON này (chứa ảnh) và với Retrofit. Tôi đang sử dụng nó trong Android:Tải lên dữ liệu hình ảnh nhiều phần trong JSON bằng Retrofit?

{ 
    "Request": { 
     "data": { 
      "Key": "keydata", 
      "param": { 
       "title": "Testingpostmultipartimageupload", 
       "photo": **"IMAGE BYTE DATA"** 
      } 
     } 
    } 
} 

Bất kỳ manh mối nào?

+0

Tôi gặp một vấn đề khi làm điều này trong retrofit 2. Tôi có thể biết làm thế nào để làm điều này trong retrofit 2. – Nivedh

+0

Tôi đã sử dụng trang bị thêm 1.6. Tôi sẽ kiểm tra tối nay để trang bị thêm 2. – Patrick

+0

cảm ơn bạn @Patrick. nó sẽ hữu ích cho tôi. – Nivedh

Trả lời

17

Ok, tôi tìm thấy một giải pháp sử dụng nhiều phần dữ liệu, somethings như thế:

@Multipart 
@PUT("https://stackoverflow.com/users/{id}") 
void modifyPic(
    @Header("auth_token") String token, 
    @Path("id") int userid, 
    @Part("request[data][param][title]") String title, 
    @Part("request[data][param][Photo]") TypedFile avatar, 
    Callback<User> cb 
); 
+0

Làm cách nào để bạn điền vào các trường khác của đối tượng? (tiêu đề chẳng hạn) – Labe

+1

bạn chỉ cần thêm @Part ("yêu cầu [dữ liệu] [param] [tiêu đề]") Tiêu đề chuỗi. Tôi sẽ chỉnh sửa câu trả lời của mình để đặt câu trả lời hoàn chỉnh. – Patrick

+0

Cảm ơn bạn vì điều đó! Nó có phải là một chú thích @Part cho các trường khác ngoài các tệp không? – Labe

0

Bạn cần đặt dữ liệu hình ảnh vào byte bằng cách sử dụng dữ liệu biểu mẫu nhiều phần.

try { 
    HttpPost httppost = new HttpPost("some url"); 
    MultipartEntity multipartEntity = 
     new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
    multipartEntity.addPart("Image", new FileBody(image)); 
    httppost.setEntity(multipartEntity); 
    mHttpClient.execute(httppost, new YOURHANDLER()); 
} catch (Exception e) { 
    Log.e(ServerCommunication.class.getName(), e.getLocalizedMessage(), e); 
} 

Để gửi bài yêu cầu sử dụng thông số

HttpPost httpPost = new HttpPost(url); 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

if (values != null) { 
    for (Map.Entry<String, String> entry : values.entrySet()) { 
     nameValuePairs.add(
      new BasicNameValuePair(entry.getKey(), entry.getValue())); 
    } 
    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); 
} 
+0

Cảm ơn. Làm thế nào để bạn thêm vào toàn bộ đối tượng json? Nhân đây, tôi đang cố gắng làm điều này bằng cách sử dụng Librofrofrof. – Patrick

+0

bạn không thể gửi đối tượng json cho đến khi và trừ khi bạn máy chủ chấp nhận chuỗi json và phân tích nó thành đối tượng. Thông thường, các yêu cầu gửi được gửi với các cặp giá trị khóa. xem câu trả lời cập nhật của tôi –

+0

@MurtazaHussain Tôi cần sự giúp đỡ của bạn Tôi có chuỗi JSON và tôi cần phải thêm PHOTO được chọn để tải lên nó với nó có thể. tôi có thể nhận được thư cho bạn không? – Chlebta

0

Retrofit chỉ mất nhiều phần dữ liệu và requestbody cho nhiều phần dữ liệu của nó.

Call<SubmitLevel1Part2IconResp> loadLevel1halfIconswithImage(@Part("headerdata[relation][icon_type]") RequestBody icon_type, @Part("headerdata[relation][name]") RequestBody name, @Part MultipartBody.Part file); 

Và sau đó trong java

// MultipartBody.Part is used to send also the actual filename 
MultipartBody.Part body = MultipartBody.Part.createFormData("headerdata[relation][relative_image]", fileUpload.getName(), requestFile); 



call = service.loadLevel1halfIconswithImage(icon_type, name, body); 
Các vấn đề liên quan