@Multipart @POST(WebServices.UPLOAD_SURVEY) Call uploadSurvey(@Part MultipartBody.Part surveyImage, @Part MultipartBody.Part propertyImage, @Part("DRA") RequestBody dra);

以下是上传文件的方法。

 private void requestUploadSurvey() {
        File propertyImageFile = new File(surveyModel.getPropertyImagePath());
        RequestBody propertyImage = RequestBody.create(MediaType.parse("image/*"), propertyImageFile);
        MultipartBody.Part propertyImagePart = MultipartBody.Part.createFormData("PropertyImage", propertyImageFile.getName(), propertyImage);
        JSONObject requestBody = getRequestBody();
        RequestBody draBody = null;
        try {
            draBody = RequestBody.create(MediaType.parse("text/plain"), requestBody.toString(1));
            Log.d(TAG, "requestUploadSurvey: RequestBody : " + requestBody.toString(1));
        } catch (JSONException e) {
            e.printStackTrace();
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        MultipartBody surveyImage = null;
            for (SurveyModel.PictureModel model : surveyModel.getPicturesList()) {
                File file = new File(model.getImagePath());
                builder.addFormDataPart("SurveyImage", file.getName(),
                        RequestBody.create(MediaType.parse("image/*"), file));
            surveyImage = builder.build();
        final WebServicesAPI webServicesAPI = RetrofitManager.getInstance().getRetrofit().create(WebServicesAPI.class);
        Call<UploadSurveyResponseModel> surveyResponse = null;
            surveyResponse = webServicesAPI.uploadSurvey(MultipartBody.Part.createFormData("SurveyImage", "SurveyImage", surveyImage), propertyImagePart, draBody);
        surveyResponse.enqueue(this);
        Log.d(TAG, "requestUploadSurvey: sent the request");

请帮助我解决这个问题。

android
multipartform-data
retrofit2
okhttp
Kartheek
Kartheek
发布于 2016-10-05
4 个回答
Kartheek
Kartheek
发布于 2021-12-25
已采纳
0 人赞同

我们可以使用MultipartBody.Part数组,将一个数组的图片上传到一个键上。 以下是解决方案
网络服务API

@Multipart
@POST(WebServices.UPLOAD_SURVEY)
Call<UploadSurveyResponseModel> uploadSurvey(@Part MultipartBody.Part[] surveyImage,
                                             @Part MultipartBody.Part propertyImage,
                                             @Part("DRA") RequestBody dra);

以下是上传文件的方法。

private void requestUploadSurvey () {
    File propertyImageFile = new File(surveyModel.getPropertyImagePath());
    RequestBody propertyImage = RequestBody.create(MediaType.parse("image/*"),
                                                   propertyImageFile);
    MultipartBody.Part propertyImagePart = MultipartBody.Part.createFormData("PropertyImage",
                                                                             propertyImageFile.getName(),
                                                                             propertyImage);
    MultipartBody.Part[] surveyImagesParts = new MultipartBody.Part[surveyModel.getPicturesList()
                                                                               .size()];
    for (int index = 0; index <
                        surveyModel.getPicturesList()
                                   .size(); index++) {
        Log.d(TAG,
              "requestUploadSurvey: survey image " +
              index +
              "  " +
              surveyModel.getPicturesList()
                         .get(index)
                         .getImagePath());
        File file = new File(surveyModel.getPicturesList()
                                        .get(index)
                                        .getImagePath());
        RequestBody surveyBody = RequestBody.create(MediaType.parse("image/*"),
                                                    file);
        surveyImagesParts[index] = MultipartBody.Part.createFormData("SurveyImage",
                                                                     file.getName(),
                                                                     surveyBody);
    final WebServicesAPI webServicesAPI = RetrofitManager.getInstance()
                                                         .getRetrofit()
                                                         .create(WebServicesAPI.class);
    Call<UploadSurveyResponseModel> surveyResponse = null;
    if (surveyImagesParts != null) {
        surveyResponse = webServicesAPI.uploadSurvey(surveyImagesParts,
                                                     propertyImagePart,
                                                     draBody);
    surveyResponse.enqueue(this);
    
我不能用MultipartBody.Part []上传多张图片,它总是只上传数组中的最后一张图片。你能清楚地说明你到底在哪里使用图片数组的键吗?谢谢。
确保你只创建一个对数组的引用,并将所有图片添加到该数组中。查看WebServicesAPI中的uploadSurvey方法以获得参考。
总是得到以下错误 @Part注解必须提供一个名称或使用MultipartBody.Part参数类型。
only upload first image MultipartBody.Part[] surveyImagesParts = new MultipartBody.Part[MySharedPreferences.all_sharedprefrenceaddimage.size()]; for (int i=0;i<MySharedPreferences.all_sharedprefrenceaddimage.size();i++){ File file = new File(MySharedPreferences.all_sharedprefrenceaddimage.get(i)); RequestBody surveyBody = RequestBody.create(MediaType.parse("image"), file); surveyImagesParts[i] = MultipartBody.Part.createFormData("photos[]", file.getName(), surveyBody); }
在createFormData的第一个参数中的字符串末尾添加[],解决了只上传1张图片的问题 【替换代码0
Imran Samed
Imran Samed
发布于 2021-12-25
0 人赞同

我在已接受的答案上浪费了很多时间,但在我的案例中并不奏效。 因此,经过大量的搜索,我找到了这个。它在我的案例中100%地起作用。

private void uploadMultiFile() {
    ArrayList<String> filePaths = new ArrayList<>();
    filePaths.add("storage/emulated/0/DCIM/Camera/IMG_20170802_111432.jpg");
    filePaths.add("storage/emulated/0/Pictures/WeLoveChat/587c4178e4b0060e66732576_294204376.jpg");
    filePaths.add("storage/emulated/0/Pictures/WeLoveChat/594a2ea4e4b0d6df9153028d_265511791.jpg");
    MultipartBody.Builder builder = new MultipartBody.Builder();
    builder.setType(MultipartBody.FORM);
    builder.addFormDataPart("user_name", "Robert");
    builder.addFormDataPart("email", "mobile.apps.pro.vn@gmail.com");
    // Map is used to multipart the file using okhttp3.RequestBody
    // Multiple Images
    for (int i = 0; i < filePaths.size(); i++) {
        File file = new File(filePaths.get(i));
        builder.addFormDataPart("file[]", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file));
    MultipartBody requestBody = builder.build();
    Call<ResponseBody> call = uploadService.uploadMultiFile(requestBody);
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            Toast.makeText(MainActivity.this, "Success " + response.message(), Toast.LENGTH_LONG).show();
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.d(TAG, "Error " + t.getMessage());

而这是接口

@POST("/upload_multi_files/MultiPartUpload.php")
Call<ResponseBody> uploadMultiFile(@Body RequestBody file);
    
@Body参数不能与表单或多部分编码一起使用。得到这个错误。
再试一次,就好了......。 @Ali_Waris 我有时也会遇到这个错误,但后来就好了。
@ImranSamed 它是一个异常,使我的应用程序崩溃。我需要避免它。
@Ali_Waris 你有没有成功地尝试避免这个错误?我也遇到了同样的错误。- Taynã Bonaldo 7 secs ago edit
@Ali_Waris I solved this error by passing "requestBody.parts()" to method instead requestBody object. Then in the Retrofit API interface I change "@Body RequestBody file" to "@Part List<MultipartBody.Part> file". I hope it help.
Shofiullah Babor
Shofiullah Babor
发布于 2021-12-25
0 人赞同

我曾尝试过的最好的解决方案

ApiInterface。

@Multipart
    @POST("person/img")
    Call<ResponseBody> upImageMany(@Part List<MultipartBody.Part> file);
List<MultipartBody.Part> parts = new ArrayList<>();
for (int i=0; i < upFileList.size(); i++){
    parts.add(prepareFilePart("my_file["+i+"]", upFileList.get(i)));
private MultipartBody.Part prepareFilePart(String partName, Uri fileUri){
        File file = new File(getPath(fileUri));
        RequestBody requestBody = RequestBody.create(MediaType.parse(getContentResolver().getType(fileUri)), file);
        return MultipartBody.Part.createFormData(partName, file.getName(),requestBody);
    
@PriyankaSingh 我能为你做些什么?
iamnaran
iamnaran
发布于 2021-12-25
0 人赞同

对于一个单键,你可以使用。

  @POST("upload/images")
  Observable<YourBaseResponse>
  uploadMultipleImages(@Body RequestBody imagesBody);

你可以按以下方式创建RequestBody。

 public static MultipartBody buildMultipartForMultipleImages(Context context, List<MediaPreviewModel> allAddMediaImages) {
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        for (int index = 0; index < allAddMediaImages.size(); index++) {
                builder.addFormDataPart("images", "image" + index, getRequestBodyForImages(context, allAddMediaImages.get(index).getUri()));
        return builder.build();

where 媒体预览模型(MediaPreviewModel是一个包含图像细节(URI、文件名、扩展名、大小等)的POJO。

创建请求主体为

  public static RequestBody getRequestBodyForImages(Context context, Uri uri) {
        File file = null;
        try {
            file = getFile(context, uri);
        } catch (IOException e) {
            e.printStackTrace();
        File file1 = CompressFile.getCompressedImageFile(file, context);
        RequestBody imageReqBody;
        if (file1 != null) {
            imageReqBody = RequestBody.create(file1, MediaType.parse("image/jpg"));
        } else {
            assert file != null;