关于form表单提交文件file后台controller中参数获取不到的解决办法

本文详细介绍了在SSM框架中实现文件上传的具体步骤,包括在前端JSP页面设置form表单,后端Controller中处理上传请求,以及如何配置Spring MVC以支持文件上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ssm
前台jsp的form表单里

<form class="avatar-form" action="upload/uploadPhoto.do" enctype="multipart/form-data" method="post">
...
<input type="file" class="avatar-input" id="avatarInput" name="avatar_file" >
...
</form>

然后提交表单,然后controller中直接把File当成参数,获取不到,

/**
     * 上传图片
     * @param avatar_file
     */
    @RequestMapping("/uploadPhoto.do")
    public void uploadPhoto(MultipartFile avatar_file){
        System.out.println("我进来了");
    }

所以想具体看看request是怎么封装的,后台controller中这样写。

/**
     * 上传图片
     *
     */
    @RequestMapping("/uploadPhoto.do")
    public void uploadPhoto(HttpServletRequest request){
        System.out.println("我进来了");
    }

观察到request中的parameterMap是空 size为0
于是度娘走起,说要加@RequestParam

/**
     * 上传图片
     *
     */
    @RequestMapping("/uploadPhoto.do")
    public void uploadPhoto(@RequestParam MultipartFile avatar_file){
        System.out.println("我进来了");
    }

然后启动项目,报错了

java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?……

然后继续度娘,说要在springmvc配置文件中加上MultipartResolver 的配置,pom文件加上commons-upload,这个1.3版本的包括了commons-io了,不要再导commons-io了,容易冲突。
那就加吧!于是乎:

<!-- 定义文件上传解析器 -->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设定默认编码 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 设定文件上传的最大值5MB,5*1024*1024 -->
        <property name="maxUploadSize" value="5242880"></property>
    </bean>
<!-- 文件上传所需jar包 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

然后发现其实不用加@RequestParam注解就可以获取了呢,所以改回

/**
     * 上传图片
     * @param avatar_file
     */
    @RequestMapping("/uploadPhoto.do")
    public void uploadPhoto(MultipartFile avatar_file){
        System.out.println("我进来了");
    }

然后,就可以启动了哈哈哈哈哈哈,也能获取到了!
希望给和我遇到同样问题的小伙伴提供点经验。

### Form 表单提交的代码示例及 Controller 实现 #### HTML 部分 HTML 中通过 `<form>` 标签定义表单,并设置 `action` 和 `method` 属性来指定请求的目标地址和方法。 ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Form 提交示例</title> </head> <body> <form id="myForm" action="/submitForm" method="post"> 用户名: <input type="text" name="username"><br><br> 密码: <input type="password" name="password"><br><br> 年龄: <input type="number" name="age"><br><br> <input type="submit" value="提交"> </form> </body> </html> ``` 此代码片段展示了如何创建一个简单的 HTML 表单,其中包含用户名、密码和年龄字段[^3]。 --- #### JavaScript (可选 AJAX 提交) 如果希望使用 AJAX 提交表单,则可以借助 jQuery 的 `.ajax()` 方法完成异步操作: ```javascript function submitFormAjax() { $.ajax({ url: "/submitForm", type: "POST", data: $("#myForm").serialize(), success: function(response) { alert("成功:" + response); }, error: function(xhr, status, error) { console.error("错误:" + error); } }); } ``` 在此代码中,`$("#myForm").serialize()` 将表单数据序列化为键值对字符串并发送到服务器端[^2]。 --- #### Spring MVC Controller 实现 以下是基于 SSM 框架的一个简单 Controller 示例,用于接收前端传来的表单数据: ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class FormController { @PostMapping("/submitForm") @ResponseBody public String handleFormSubmission( @RequestParam(name = "username") String username, @RequestParam(name = "password") String password, @RequestParam(name = "age", required = false) Integer age) { StringBuilder result = new StringBuilder(); result.append("接收到的数据如下:\n"); result.append("Username: ").append(username).append("\n"); result.append("Password: ").append(password).append("\n"); if (age != null) { result.append("Age: ").append(age.toString()).append("\n"); } else { result.append("Age not provided.\n"); } return result.toString(); } } ``` 该 Controller 使用了 `@PostMapping` 注解绑定 POST 请求路径 `/submitForm`,并通过 `@RequestParam` 获取表单中的参数。返回的结果是一个简单的字符串响应[^4]。 --- #### 文件上传扩展(可选) 对于文件上传场景,需调整表单配置以及 Controller 处理逻辑。以下是一个支持文件上传的例子: ##### 前端部分 ```html <form id="fileUploadForm" action="/uploadFile" method="post" enctype="multipart/form-data"> 选择文件: <input type="file" name="file"><br><br> 描述: <textarea name="description"></textarea><br><br> <input type="submit" value="上传"> </form> ``` 注意此处设置了 `enctype="multipart/form-data"` 来允许文件传输[^5]。 ##### 后端部分 ```java import org.springframework.web.multipart.MultipartFile; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/file") public class FileUploadController { @PostMapping("/uploadFile") public String uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("description") String description) { if (!file.isEmpty()) { try { byte[] bytes = file.getBytes(); // 可保存至数据库或磁盘 System.out.println("描述信息: " + description); return "文件上传成功!"; } catch (Exception e) { return "文件处理失败: " + e.getMessage(); } } else { return "未检测到任何文件."; } } } ``` 这段代码实现了基本的文件上传功能,能够读取文件内容及其附加说明[^5]。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值