Rest 如何使用改型2上载空文件?

Rest 如何使用改型2上载空文件?,rest,file-upload,retrofit,Rest,File Upload,Retrofit,通过使用以下代码进行改装,我成功地将图像上传到我的REST API: File imageFile = ImagePicker.getFileFromResult(this, resultCode, data); RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), imageFile); Multip

通过使用以下代码进行改装,我成功地将图像上传到我的REST API:

        File imageFile = ImagePicker.getFileFromResult(this, resultCode, data);
        RequestBody requestFile =
                RequestBody.create(MediaType.parse("multipart/form-data"), imageFile);
        MultipartBody.Part body =
                MultipartBody.Part.createFormData("userpic", imageFile.getName(), requestFile);

        RetrofitClient.compositeSubscription.add(RetrofitClient.getService().updateProfileUserpic("Token " + RevolutionApp.getInstance().getUserToken(), body).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Profile>() {
                    @Override
                    public void onCompleted() { }

                    @Override
                    public void onError(Throwable e) { }

                    @Override
                    public void onNext(Profile profile) {
                        mProfileFragment.fetchProfileData();
                    }
                }));

不起作用

以下是最终解决方案:

更新模型的API接口方法:

public void updateProfileData(ProfilePost profile, final OnProfileUpdatedListener listener) {

    Observable<Profile> observable;
    if (profile.getUserpicPart() != null) {
        observable = RetrofitClient.getService().updateProfileData(profile.asHashMap(), profile.getUserpicPart());
    } else {
        observable = RetrofitClient.getService().updateProfileData(profile.asHashMap());
    }

    RetrofitClient.compositeSubscription.add(observable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Profile>() {
                ...
            }));
}
改装方法签名:

@PUT("/api/v1/profile/")
@Multipart
Observable<Profile> updateProfileData(@Header("Authorization") String authorization, @PartMap() Map<String, RequestBody> partMap, @Part MultipartBody.Part image);

@PUT("/api/v1/profile/")
@Multipart
Observable<Profile> updateProfileData(@Header("Authorization") String authorization, @PartMap() Map<String, RequestBody> partMap);
和模型发布:

public class ProfilePost {
    MultipartBody.Part userpicPart;

    public HashMap<String, RequestBody> asHashMap() {
        HashMap<String, RequestBody> result = new HashMap<>();
        result.put("first_name", RequestBody.create(MediaType.parse("text/plain"), this.firstName));
        result.put("last_name", RequestBody.create(MediaType.parse("text/plain"), this.lastName));
        result.put("email", RequestBody.create(MediaType.parse("text/plain"), this.email));
    }
    public void getUserpicPart() {
        if (this.userpicFile == null) {
            return null;
        }
        return MultipartBody.Part.createFormData("userpic", this.userpicFile.getName(), requestFile);
    }
}

以下是最终解决方案:

更新模型的API接口方法:

public void updateProfileData(ProfilePost profile, final OnProfileUpdatedListener listener) {

    Observable<Profile> observable;
    if (profile.getUserpicPart() != null) {
        observable = RetrofitClient.getService().updateProfileData(profile.asHashMap(), profile.getUserpicPart());
    } else {
        observable = RetrofitClient.getService().updateProfileData(profile.asHashMap());
    }

    RetrofitClient.compositeSubscription.add(observable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Profile>() {
                ...
            }));
}
改装方法签名:

@PUT("/api/v1/profile/")
@Multipart
Observable<Profile> updateProfileData(@Header("Authorization") String authorization, @PartMap() Map<String, RequestBody> partMap, @Part MultipartBody.Part image);

@PUT("/api/v1/profile/")
@Multipart
Observable<Profile> updateProfileData(@Header("Authorization") String authorization, @PartMap() Map<String, RequestBody> partMap);
和模型发布:

public class ProfilePost {
    MultipartBody.Part userpicPart;

    public HashMap<String, RequestBody> asHashMap() {
        HashMap<String, RequestBody> result = new HashMap<>();
        result.put("first_name", RequestBody.create(MediaType.parse("text/plain"), this.firstName));
        result.put("last_name", RequestBody.create(MediaType.parse("text/plain"), this.lastName));
        result.put("email", RequestBody.create(MediaType.parse("text/plain"), this.email));
    }
    public void getUserpicPart() {
        if (this.userpicFile == null) {
            return null;
        }
        return MultipartBody.Part.createFormData("userpic", this.userpicFile.getName(), requestFile);
    }
}

我不知道这是正确的方法,我试过这样做。它起作用了

MultipartBody.Part fileToUpload = null;
        if (realPath != null) {
            try {
                File file = new File(realPath);
                if (file.exists()) {
                    RequestBody requestBody = RequestBody.create(MediaType.parse("*/*"), file);
                    fileToUpload = MultipartBody.Part.createFormData("attachment", file.getName(), requestBody);
                }
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        }else{
            RequestBody attachmentEmpty = RequestBody.create(MediaType.parse("text/plain"), "");

            fileToUpload = MultipartBody.Part.createFormData("attachment", "", attachmentEmpty);
        }

注意:文件名不应为null,而应使用null或empty。

我不知道这样做是否正确,我试过这样做。它可以工作吗

MultipartBody.Part fileToUpload = null;
        if (realPath != null) {
            try {
                File file = new File(realPath);
                if (file.exists()) {
                    RequestBody requestBody = RequestBody.create(MediaType.parse("*/*"), file);
                    fileToUpload = MultipartBody.Part.createFormData("attachment", file.getName(), requestBody);
                }
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        }else{
            RequestBody attachmentEmpty = RequestBody.create(MediaType.parse("text/plain"), "");

            fileToUpload = MultipartBody.Part.createFormData("attachment", "", attachmentEmpty);
        }

注意:文件名不应为空,而应使用空。

您如何解决此问题,请告诉meAnswer在这里。您如何解决此问题,请告诉meAnswer在这里。感谢您的支持,我以不同的方式解决了此问题,请检查我的answer@Vassiliy如何在发送多个图像时发送空值。我的观点是,如果我想发送10个图像,其中一个图像是空的。那么,我如何用您的解决方案实现这一点呢。我认为这个解决方案行不通。谢谢你的支持,我用不同的方式解决了,请检查我的答案answer@Vassiliy如何在发送多个图像时发送空值。我的观点是,如果我想发送10个图像,其中一个图像是空的。那么,我如何用您的解决方案实现这一点呢。我认为这个解决办法行不通。