SpringBoot MultipartFile 上传文件时携带参数+SpringBoot 如何进行参数校验

一、在使用MultipartFile接收上传的文件时,一般会有接收其他请求参数的需求

  • 当请求参数过多时,通常情况下会将请求参数封装为body上传,文件用单独的 MultipartFile 接收,但是这样写后端一直无法接收成功

问题

@PostMapping("/save")
public Result<?> pushMoment(HttpServletRequest request,
                            @RequestBody ContentVo contentVo,
                            @RequestParam(value = "contentParam") MultipartFile contentParam){
    //...
}

HTTP请求分为了消息头和消息体,头信息里面的Content-Type字段定义了消息体的请求格式,接口里面声明 @RequestBody 的参数只能设置为 "Content-Type: application/json",而 MultipartFile 参数只能设置为"Content-Type: multipart/form-data",上述两种格式并不是兼容的,那问题就来了,前端请求的时候 Content-Type 怎么设置,无论哪种格式都是错的。

body最终不能和MultipartFile同时存在


解决方案

前端统一格式"Content-Type: multipart/form-data",结构体在前端传递的时候统一转成json字符串,后端接收以后用Gson转成结构体

@PostMapping("/save")
public Result<?> pushMoment(@RequestPart MultipartFile fileUrl,@RequestParam(value = "contentParam") String contentParam ) {
    log.info("拿到的文件--->  ={}",fileUrl.getOriginalFilename());
    Gson gson = new Gson();
    ContentUpload contentUpload = gson.fromJson(contentParam, ContentUpload.class);
}
<body>
<input id="file" type="file"/>
<br>
<button>post 请求</button>

<script>

    const btns = document.querySelectorAll("button");
    let contentUpload = {
     //....
    };
    let a = JSON.stringify(contentUpload)//将对象转为 JSON
    console.log(a);

    
    btns[0].onclick = () => {
        const file = document.getElementById("file").files[0];
        console.log(file)
        let fileUrl = new FormData();
        fileUrl.append("fileUrl", file, file.name);
        axios({
            //请求类型
            method: 'POST',

            //URL
            url: 'http://localhost:9999/content/save',

            headers: {
                "Content-Type": "multipart/form-data;boundary=" + new Date().getTime()
            },
            data: fileUrl,//上传的文件
            params: {
                contentParam: a
            }
        }).then(res => {
            console.log(res)
        })
    }
</script>
</body>

 二、SpringBoot 如何进行参数校验

SpringBoot 如何进行参数校验,老鸟们都这么玩的!_飘渺Jam的博客-CSDN博客_springboot参数校验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值