首先是定义接口部分:
public interface MyApi{
@Multipart
@POST("renovation/uploadImg")
Observable<HttpResult> upLoadsImg(@PartMap Map<String, RequestBody> params, @Part("content")RequestBody content);
}
注意 这里使用
@Multipart
注解,参数这里使用@PartMap
和@Part
,他们是用来上传文件用的。 这里需要注意的是,使用了@Multipart
注解,参数的类型都应该是RequestBody
,不然上传的图片的时候会报JSON must start with an array or an object
错误。上传多张图片就使用@PartMap Map<String, RequestBody>
public interface MyApi{
@Multipart
@POST("renovation/uploadSingleImg")
Observable<HttpResult> upLoadsImg(@Part MultipartBody.Part photo);
}
单图上传就用
@Part MultipartBody.Part
其次就是具体实现部分(以多图上传为例):
Observer<HttpResult> observer = new Observer<HttpResult>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
progressUtils.dismiss();
e.printStackTrace();
}
@Override
public void onNext(HttpResult httpResult) {
//处理返回结果
if (httpResult.isStatus()) {
Toast.makeText(mContext, "上传成功", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(mContext, "上传失败", Toast.LENGTH_SHORT).show();
}
progressUtils.dismiss();
}
};
private void submitData() {
//图片压缩
compressUtils();
Map<String, RequestBody> photos = new HashMap<>();
//mPhotoList是选择图片后的返回路径
if (mPhotoList.size() > 0) {
for (int i = 0; i < mPhotoList.size(); i++) {
File file = new File(mPhotoList.get(i).getPhotoPath());
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
// RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpg"), file);
//这里前面一部分是服务器要求你传的key,加上一个i,就可以动态设置key的长度
photos.put("AttachmentKey"+i+"\"; filename=\""+file.getName(),requestFile);
}
}
subscription = Network.getMyApi().upLoadsImg(photos,RequestBody.create(null,content))
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
这里详细解释已经在代码中有注释说明,我按照这个方法上传是没有问题的。相册选机器我推荐使用 GalleryFinal里面的功能很详细,实现了拍照、图片选择(单选/多选)、 裁剪(单/多裁剪)、旋转等功能,具体链接里面有介绍。
网友评论