带文件的表单上传,目前使用过两种方式:
@POST("SSS/SSS")
Observable<XXXBaseEntity> savePhotoIncident(@Body MultipartBody body);
@Multipart
@POST("user/sss")
Observable<BaseEntity<Empty>> upload(@PartMap() Map<String, RequestBody> partMap, @Part MultipartBody.Part file);
方式一:
MultipartBody body = RetrofitUtils.createMultipartBody(params, incident.getAppphotoincidents(), "appphotoincident");
方式二:
Map<String, RequestBody> params = new HashMap<>();
params.put(UserParkingSpaces.ADDRESS, RetrofitUtils.createPartFromString(parkingSpaces.getAddress()));
params.put(UserParkingSpaces.CATEGORYNO, RetrofitUtils.createPartFromString(parkingSpaces.getCategoryno()));
MultipartBody.Part body = RetrofitUtils.createFilePart("photo", new File(parkingSpaces.getPhoto()));
Network.getApis().uploadUserParkingSpace(params, body)
.compose(context.bindToLifecycle())
.compose(Network.check())
.compose(Network.nullableCheck())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
public class RetrofitUtils {
private static final String MULTIPART_FORM_DATA = "multipart/form-data";
public static RequestBody createPartFromString(String descriptionString) {
return RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), descriptionString);
}
public static MultipartBody.Part createFilePart(String partName, File file) {
RequestBody requestFile = RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), file);
return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}
public static MultipartBody createMultipartBody(Map<String, String> params, List<String> pic, String keyName) {
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
for (String key : params.keySet()) {
builder.addFormDataPart(key, params.get(key));
}
if (pic.size() > 0) {
for (String image : pic) {
File file = new File(image);
if (file.exists()) {
String fileName = (file.getName().endsWith(".cnt") ? file.getName() + ".jpg" : file.getName());
builder.addFormDataPart(keyName, fileName, RequestBody.create(MediaType.parse("image/png"), file));
}
}
}
return builder.build();
}
}