普通寫法:
//創建表單的普通字段
public static RequestBody createFormBody(String content) { RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), content); return body; }
//創建Multipart, fieldName為表單字段名 public static MultipartBody.Part createFilePart(String fieldName, File file) { RequestBody requestFile = RequestBody.create(MediaType.parse("application/otcet-stream"), file); MultipartBody.Part body = MultipartBody.Part.createFormData(fieldName, file.getName(), requestFile); return body; }
//Service方法, 普通form表單使用RequestBody, 並且@Part注解要寫表單字段名 //文件用MultipartBody.Part @Multipart @POST(API.VIDEO_MODULE_UPLOAD_VIDEO) Call<Object> uploadImage(@Part MultipartBody.Part imagePicFile, @Part MultipartBody.Part videoFile, @Part("videoDescription") RequestBody desc, @Part("videoPicWidth") RequestBody videoPicWidth, @Part("videoPicHeight") RequestBody videoPicHeight);
//上傳 getService(VideoService.class).uploadVideo( createFilePart("videoPicFile",new File(mCoverPath)), createFilePart("videoFile",new File(mPath)), createFormBody(etVideoDesc.getText().toString().trim()), createFormBody(width), createFormBody(height)) .enqueue(new JsonResultCallback<Object>(context()) { @Override public void onSuccess(Call<Object> call, Object data) { super.onSuccess(call, data); //..... } @Override public void onFinish(Call<Object> call) { //... } });
注意: 如果你使用了 GsonRequestBodyConverter 或類似的RequestBodyConverter, 一定記得要略過@Multipart 標注的Service方法, 否則你的File會被轉為文件路徑的字符串, 這是一個坑
另一種, 自定義FileRequestBodyConverter:
未完待續...
相關鏈接, 這里有實現
