在 multipart/form-data 上使用 Spring @RequestParam

2024-02-28

在开始我的问题之前,英语不准确,因为我是韩国人。

我使用 Spring Boot 1.5.14。

我正在使用 FormData 实现文件上传,并发生 400 错误。

1.Javascript

    var formData = new FormData();
    formData.append('autoSelect', 'autoSelect');
    formData.append('file', fileObj);

    $.ajax({
        url: '/api/portfolios/' + pofolNo + '/main-image',
        type: 'PUT',
        enctype: 'multipart/form-data',
        processData: false,
        contentType: false,
        data: formData,
        async: false,
    });

2. Spring控制器(未工作)

    @PutMapping("{pofolNo}/main-image")
    public CommonApiResponse changePortfolioMainImage(
        @PathVariable("pofolNo") Integer pofolNo,
        @RequestParam("autoSelect") String autoSelect,
        @RequestParam("mainImage") MultipartFile mainImage) {

        log.debug("check : {} / {} / {}", pofolNo, autoSelect, mainImage);
        return ok(null);
    }

上面的代码会导致 400 错误,表明 autoSelect 参数不存在。

所以我检查HttpServletRequest.getParameter("autoSelect")像这样。

3. Spring控制器(已工作)

    @PutMapping("{pofolNo}/main-image")
    public CommonApiResponse changePortfolioMainImage(
        @PathVariable("pofolNo") Integer pofolNo,
        HttpServletRequest request,
        @RequestParam("mainImage") MultipartFile mainImage) {

        log.debug("check : {} / {} / {}", pofolNo, request.getParameter("autoSelect"), mainImage);
        return ok(null);
    }

上面的代码结果是成功的。

有什么不同?我不明白@RequestParam没有工作但与HttpServletRequest.


第二个不起作用,因为它要求 @RequestParam("autoSelect") String autoSelect 不为 null;

除非您必须提供默认值或 require=false

第三个总是有效,因为它只注入 HttpServletRequest。但请注意,该值可能仍然为空。

如何获取 multipart/form-data 中的参数值有很大不同,具体取决于您的 servlet api 版本。

关于 multipart 和 servlet api 版本的更清晰解释:

如何使用JSP/Servlet上传文件到服务器? https://stackoverflow.com/questions/2422468/how-to-upload-files-to-server-using-jsp-servlet/2424824#2424824

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 multipart/form-data 上使用 Spring @RequestParam 的相关文章

随机推荐