使用Retrofit1.X版本上传文件是这样的:
public interface ApiManager {
@Multipart
@POST("/user/addCarInfo")
void addCarInfo(@QueryMap Map<String, Object> options, @Part("file") TypedFile file, Callback<JsonElement> response);
}
然而在2.X版本中,TypedFile被隐藏了,所以无法使用,那么可以使用PartMap上传一个或多个文件。
一.上传一个文件
1.定义接口:
@Multipart
@POST("vi/read")
Observable<String> upload(@PartMap Map<String, RequestBody> params);
2.上传文件:
//上传图片
Map<String, RequestBody> map = new HashMap<String, RequestBody>();
//根据文件扩展名获得MimeType
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(file.getAbsolutePath()));
//创建RequestBody
RequestBody requestBody = RequestBody.create(MediaType.parse(mimeType), file);
map.put(Constant.UPLOAD_FILE_KEY + file.getName(), requestBody);
MyLog.d("Image Path : " + file.getAbsolutePath());
UCService.createUCService().upload(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String response) {
MyLog.d("upload image response : " + response);
if (!TextUtils.isEmpty(response)) {
handleParseVinResults(response);
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
MyLog.d("upload image error : " + throwable.getMessage());
}
});
二.上传多个文件
//文件路径
String path= Environment.getExternalStorageDirectory().getAbsolutePath();
File file1 = new File(rootPath + "/test1.docx");
File file2 = new File(rootPath + "/test2.rar");
//获取文件mimetype
Map<String, RequestBody> params = new HashMap<>();
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(file1.getPath()));
String mimeType2 = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(file2.getPath()));
//创建RequestBody
RequestBody fileBody1 = RequestBody.create(MediaType.parse(mimeType), file1);
RequestBody fileBody2 = RequestBody.create(MediaType.parse(mimeType2), file2);
params.put("file\"; filename=\"" + file1.getName() + "", fileBody1);
params.put("file\"; filename=\"" + file2.getName() + "", fileBody2);
//请求
UCService.createUCService().upload(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String response) {
MyLog.d("upload image response : " + response);
if (!TextUtils.isEmpty(response)) {
handleParseVinResults(response);
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
MyLog.d("upload image error : " + throwable.getMessage());
}
});