美文网首页
Retrofit2上传文件

Retrofit2上传文件

作者: jxtx | 来源:发表于2020-08-14 11:03 被阅读0次

1.单个文件

//接口
@Multipart
    @POST(ApiConstant.FILE_UPLOAD)
    Call<BaseResponse<String>> fileUpload(@Part MultipartBody.Part file);


  //构建要上传的文件
        File file = new File(androidQToPath);

        MultipartBody.Part part = RequestFileUtil.uploadFile("file",file);

2.多个文件
RequestFileUtil工具类:

package com.mbzj.ykt_student.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;

/**
 * @author David
 * @description: 上传文件帮助工具
 * @date :2020/8/10 19:17
 */
public class RequestFileUtil {


    /**
     * 上传单个文件
     * @param fileName
     * @param file 为参数字段名
     * @return
     */
    public static MultipartBody.Part uploadFile(String fileName,File file){
//        RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data;charset=UTF-8"), file); 过时
        RequestBody requestBody = getRequestBody(file);
        MultipartBody.Part part = MultipartBody.Part.createFormData(fileName, file.getName(), requestBody);

        return part;
    }



    public static RequestBody getRequestBody(File file){
        MediaType mediaType=MediaType.Companion.parse("text/x-markdown; charset=utf-8");
        RequestBody fileBody=RequestBody.Companion.create(file,mediaType);

        return fileBody;
    }


    /**
     * 上传多个文件
     * @param files
     * @return
     */
    public static List<MultipartBody.Part> filesToMultipartBodyParts(List<File> files) {
        List<MultipartBody.Part> parts = new ArrayList<>(files.size());
        for (File file : files) {
//            RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data;charset=UTF-8"), file);
            RequestBody requestBody = getRequestBody(file);
            MultipartBody.Part part = MultipartBody.Part.createFormData("multipartFiles", file.getName(), requestBody);
            parts.add(part);
        }
        return parts;
    }


    /**
     * 请求参数转化为RequestBody
     * @param value
     * @return
     */
    public static RequestBody toRequestBody(String value) {
//        RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), value);
        MediaType mediaType=MediaType.Companion.parse("application/json;charset=utf-8");
        RequestBody requestBody = RequestBody.Companion.create(value,mediaType);
        return requestBody;
    }


}

a.文件加文字
第一种:亲自测试可以,服务端使用form-data方式

//接口
@POST(ApiConstant.QUESTION_PUBLISH)
    Call<BaseResponse> publishQuestion(@Body RequestBody Body);

 MultipartBody.Builder builder = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("subjectId", publishQuestionBody.getSubjectId())
                .addFormDataPart("content", publishQuestionBody.getContent())
                .addFormDataPart("teacherUserId",publishQuestionBody.getTeacherUserId());

        //音频
        if (!TextUtils.isEmpty(publishQuestionBody.getAudioUrl())){
            builder.addFormDataPart("audioDuration", publishQuestionBody.getAudioDuration()+"");
            File file = new File(publishQuestionBody.getAudioUrl());
            builder.addFormDataPart("audioFile",file.getName(), RequestFileUtil.getRequestBody(file));
        }

        //图片
        for (String imgPath : publishQuestionBody.getImages()) {
            File file = new File(imgPath);
            builder.addFormDataPart("imageFileList",file.getName(),RequestFileUtil.getRequestBody(file));
        }

        RequestBody Body = builder.build();

第二种:亲测不行,不清楚原因(待完善)

//接口
@Multipart
    @POST(ApiConstant.QUESTION_PUBLISH)
    Call<BaseResponse> publishQuestion(@PartMap Map<String, RequestBody> params);




Map<String, RequestBody> params=new HashMap<>();

        params.put("subjectId",RequestFileUtil.toRequestBody(publishQuestionBody.getSubjectId()));
        params.put("content",RequestFileUtil.toRequestBody(publishQuestionBody.getContent()));
        params.put("teacherUserId",RequestFileUtil.toRequestBody(publishQuestionBody.getTeacherUserId()));

        //音频
        if (!TextUtils.isEmpty(publishQuestionBody.getAudioUrl())){
            params.put("audioDuration", RequestFileUtil.toRequestBody(publishQuestionBody.getAudioDuration() + ""));
            params.put("audioFile", RequestFileUtil.getRequestBody(new File(publishQuestionBody.getAudioUrl())));
        }

        //图片
//        if (publishQuestionBody.getImages().size()>0){
//            params.put("imageFileList",RequestFileUtil.filesToMultipartBodyParts(new File()));
//        }
        for (String imgPath : publishQuestionBody.getImages()) {
            params.put("imageFileList",RequestFileUtil.getRequestBody(new File(imgPath)));
        }

参考:1.使用 Retrofit 2.X 上传多文件,多表单
2.android retrofit2 如何多文件上传

相关文章

网友评论

      本文标题:Retrofit2上传文件

      本文链接:https://www.haomeiwen.com/subject/gfcgdktx.html