Retrofit2学习之七:上传多个文件

上传多个文件有两种方案:

  • 使用多个域,每个域上传一个文件
  • 使用一个域,在该域名称下上传多个文件

使用多个域上传多个文件

创建业务请求接口

public interface Api {

    /**
     * 上传多个文件:一个域对应一个文件
     * @param description
     * @param file1
     * @param file2
     * @return
     */
    @Multipart
    @POST("upload/multiple")
    Call<ResponseBody> uploadMultipleFiles(@Part("description") RequestBody description,
                                           @Part MultipartBody.Part file1,
                                           @Part MultipartBody.Part file2);

}

创建一个Retrofit的实例,然后利用Retrofit实例创建接口对象和调用接口方法

public static final String MULTIPART_FORM_DATA = "multipart/form-data";

@NonNull
private RequestBody prepareFromPart(String description) {
    return RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), description);
}

/**
 * 一个域对应一个文件
 * @param partName
 * @param filePath
 * @return
 */
private MultipartBody.Part prepareFilePart(String partName, String filePath) {
    File file = new File(filePath);
    // 为file建立RequestBody实例
    RequestBody requestFile = RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), file);
    // MultipartBody.Part借助文件名完成最终的上传
    return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}

public void uploadMultipleFiles(View view) {
    String file1Path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.gif";
    String file2Path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "source.gif";

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(SERVER_ADDRESS)
            .build();

    api = retrofit.create(Api.class);

    // 添加Form的part
    RequestBody description = prepareFromPart("hello, this is description speaking");

    // 创建文件的part (photo, video, ...)
    MultipartBody.Part file1Body = prepareFilePart("file", file1Path);
    MultipartBody.Part file2Body = prepareFilePart("file", file2Path);

    api.uploadMultipleFiles(description, file1Body, file2Body).enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            //在UI主线程运行
            if (response.isSuccessful()) {
                Log.i(TAG, "上传成功");
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.i(TAG, "上传失败: " + t.getLocalizedMessage());
        }
    });
}

使用一个域上传多个文件

创建业务请求接口

public interface Api {

    /**
     * 上传多个文件:一个域对应多个文件
     * @param description
     * @param parts
     * @return
     */
    @Multipart
    @POST("upload/multiples")
    Call<ResponseBody> uploadMultipleFiles(@Part("description") RequestBody description,
                                           @Part List<MultipartBody.Part> parts);

}

创建一个Retrofit的实例,然后利用Retrofit实例创建接口对象和调用接口方法

public static final String MULTIPART_FORM_DATA = "multipart/form-data";

@NonNull
private RequestBody prepareFromPart(String description) {
    return RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), description);
}

/**
 * 一个域对应多个文件
 * @param partName
 * @param filePathList
 * @return
 */
private List<MultipartBody.Part> prepareFilesPart(String partName, List<String> filePathList) {
    List<MultipartBody.Part> parts = new ArrayList<>(filePathList.size());
    for (String filePath : filePathList) {
        Log.i(TAG, "prepareFilesPart: " + filePath);
        File file = new File(filePath);
        RequestBody requestFile = RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), file);
        MultipartBody.Part part = MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
        parts.add(part);
    }
    return parts;
}

public void uploadMultipleFiles(View view) {
    String file1Path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.gif";
    String file2Path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "source.gif";
    List<String> filePathList = new ArrayList<>();
    filePathList.add(file1Path);
    filePathList.add(file2Path);

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(SERVER_ADDRESS)
            .build();

    api = retrofit.create(Api.class);

    // 添加Form的part
    RequestBody description = prepareFromPart("hello, this is description speaking");

    // 创建文件的part (photo, video, ...)
    List<MultipartBody.Part> fileBody = prepareFilesPart("file", filePathList);

    api.uploadMultipleFiles(description, fileBody).enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            //在UI主线程运行
            if (response.isSuccessful()) {
                Log.i(TAG, "上传成功");
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.i(TAG, "上传失败: " + t.getLocalizedMessage());
        }
    });
}
上一篇 Retrofit2学习之六:上传单个文件
下一篇 Retrofit2学习之八:服务端上传文件设计
目录
文章列表
1 解决Vagrant中的CentOS主机无法ssh远程连接的问题
解决Vagrant中的CentOS主机无法ssh远程连接的问题
2
第三方支付公司及插件文档
第三方支付公司及插件文档
3
Windows下安装Redis
Windows下安装Redis
4
Android开发安全设置
Android开发安全设置
5
Spring Security OAuth2 Redis 模式下认证服务器
Spring Security OAuth2 Redis 模式下认证服务器
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。