Rest 如何使用改型2上载空文件?
通过使用以下代码进行改装,我成功地将图像上传到我的REST API: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
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个图像,其中一个图像是空的。那么,我如何用您的解决方案实现这一点呢。我认为这个解决办法行不通。