使用Okhttp实现上传文件+参数请求接口form-data

 更新时间:2024年10月23日 14:38:35   作者:JMzz  
在进行接口对接时,常遇到需要传递多种类型参数及文件上传的情况,解决此问题的关键在于参数传递和文件上传的正确处理,在Service层和Controller层的传参,可以通过@RequestParam标注或直接使用请求实体类,但若结合文件上传,则不应使用@RequestBody注解

Okhttp实现上传文件+参数请求接口form-data

有时候需要对接一些接口,而且接口传参不仅需要各种类型的参数,甚至还要上传文件,所以遇到挺多坑,用postman的生成代码也不好用,于是就有了这篇文章。

话不多说,我们直接上代码

首先是service层

    /**
     * 写注释是个好习惯
     *
     * @param mFile
     * @param accountIndex
     * @param exportType
     * @param clear
     * @param email
     * @param dimensions
     * @return
     * @throws IOException
     */
    public String upload(MultipartFile mFile, Integer accountIndex, String exportType,
                         Boolean clear, String email, String dimensions) throws IOException {
        // 这里是MultipartFile转File的过程
        File file = new File(Objects.requireNonNull(mFile.getOriginalFilename()));
        FileUtils.copyInputStreamToFile(mFile.getInputStream(), file);
        // url接口路径
        String url = "http://localhost:8080/upload";
        // file是要上传的文件 File()  这边我上传的是excel,其他类型可以自己改这个parse
        RequestBody fileBody = RequestBody.create(MediaType.parse("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"), file);//这边是把file写进来,也有写路径的,但我这边是写file文件,parse不行的话可以直接改这个"multipart/form-data"
        // 创建OkHttpClient实例,设置超时时间
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(60L, TimeUnit.SECONDS)
                .writeTimeout(60L, TimeUnit.SECONDS)
                .readTimeout(60L, TimeUnit.SECONDS)
                .build();
        // 不仅可以支持传文件,还可以在传文件的同时,传参数
        MultipartBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM) // 设置传参为form-data格式
                .addFormDataPart("account_index", String.valueOf(accountIndex))
                .addFormDataPart("export_type", exportType)
                .addFormDataPart("clear", String.valueOf(clear))
                .addFormDataPart("email", email)
                .addFormDataPart("dimensions", dimensions)
                .addFormDataPart("file", file.getName(), fileBody) // 中间参数为文件名
                .build();

        // 构建request请求体,有需要传请求头自己加
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();
        Response response = null;
        String result = "";
        try {
            // 发送请求
            response = okHttpClient.newCall(request).execute();
            result = response.body().string();
            log.info(url + "发送请求结果:" + result);
            if (!response.isSuccessful()) {
                log.info("请求失败");
                return "请求失败";
            }
            response.body().close();
        } catch (IOException e) {
            log.error(e.getMessage());
        }
        // 会在本地产生临时文件,用完后需要删除
        if (file.exists()) {
            file.delete();
        }
        return result;
    }

然后controller层的传参需要用@RequestParam或者直接一个请求的实体类

如果使用实体类,千万不要加@RequestBody,不然结合上传文件会失效,上传文件使用

@RequestPart("file") MultipartFile file进行传参

(@RequestPart("file") MultipartFile file,
@RequestParam("accountIndex") Integer accountIndex,
@RequestParam("exportType") String exportType,
@RequestParam(value = "clear", required = false) Boolean clear,
@RequestParam("email") String email,
@RequestParam(value = "dimensions", required = false) String dimensions)

示例如上,或者

(@RequestPart("file") MultipartFile file, RequestVo req)

请求成功,问题解决。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JAVA基于Slack实现异常日志报警详解

    JAVA基于Slack实现异常日志报警详解

    这篇文章主要为大家介绍了JAVA基于Slack实现异常日志报警详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 基于IDEA创建SpringMVC项目流程图解

    基于IDEA创建SpringMVC项目流程图解

    这篇文章主要介绍了基于IDEA创建SpringMVC项目流程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • SpringCloud之@FeignClient()注解的使用方式

    SpringCloud之@FeignClient()注解的使用方式

    这篇文章主要介绍了SpringCloud之@FeignClient()注解的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • JAVA中wait()和notify()如何使用详解

    JAVA中wait()和notify()如何使用详解

    这篇文章主要介绍了JAVA中wait()和notify()如何使用的相关资料,wait和notify必须在同步方法或同步块中使用,并且调用对象必须一致,wait和sleep都可被interrupt唤醒,但wait会释放锁,而sleep不会,需要的朋友可以参考下
    2025-05-05
  • SpringSecurity request过滤问题示例小结

    SpringSecurity request过滤问题示例小结

    这篇文章主要介绍了SpringSecurity request过滤问题示例小结,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-02-02
  • Java之SM4加密解密的实现

    Java之SM4加密解密的实现

    这篇文章主要介绍了Java之SM4加密解密的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Spring Cloud中配置客户端示例详解

    Spring Cloud中配置客户端示例详解

    这篇文章主要介绍了Spring Cloud中配置客户端的相关知识,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Java创建Excel数据透视表(Pivot Table)的完整实战教程

    Java创建Excel数据透视表(Pivot Table)的完整实战教程

    在日常的数据分析开发中,我们经常需要对大量原始数据进行汇总、分类和统计,本文将介绍如何在 Java 中创建 Excel 数据透视表,并给出一个实用示例,有需要的小伙伴可以了解下
    2026-03-03
  • Java中RedissonClient基本使用指南

    Java中RedissonClient基本使用指南

    RedissonClient 是一个强大的 Redis 客户端,提供了丰富的功能和简单的 API,本文就来介绍一下Java中RedissonClient基本使用指南,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 测量Java对象所占内存大小方式

    测量Java对象所占内存大小方式

    这篇文章主要介绍了测量Java对象所占内存大小方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论