SpringMVC文件上传

  在SpringMVC上传文件变得更加方便,解析request中的文件项已经交给了SpringMVC去做,先来说一下SpringMVC上传文件的原理

在这里插入图片描述
通过上图来了解原理:

  1. 所有的请求都会先经过前端控制器,前端控制器会将请求分发给各个组件,文件上传请求也是一样,我们需要配置一个文件解析器,首先请求会经过文件解析器
  2. 文件解析器会对request请求做解析,具体就是对请求正文中的文件项做处理,然后将文件项返回给前端控制器
  3. 前端控制器会将文件项以参数绑定的形式转交给处理器进行处理,中间的过程就不说了,处理器通过拿到参数,就可以对文件项进行上传操作
  4. 需要注意的是,参数绑定的类型是spring实现的一个类——MultipartFile,而且参数名称需要和表单中的名称保持一致

下面看一下具体演示:

首先需要在前端页面写一个文件上传拿的表单

    <form action="/mvc/file/testFile" enctype="multipart/form-data" method="post">
        选择文件:<input type="file" name="upload"><br/>
        <input type="submit" value="上传">
    </form>

注意表单的类型,以及方法的类型

这时请求会首先经过前端控制器,前端控制器会将请求转发给文件解析器,所以我们需要配置文件解析器,在springmvc的配置文件中配置如下bean

    <!--配置文件解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize">
            <value>5242880</value>
        </property>
    </bean>

需要注意的是,springmvc框架本身去调用该文件解析器的id固定为multipartResolver,所以id是固定的,不可以变

这时,我们去配置映射Controller类以及映射方法

@Controller
@RequestMapping("/file")
public class FileController {
    @RequestMapping("/testFile")
    public String testFile(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("testFile 执行了 ...");
        //使用fileupload组件完成文件上传
        //上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        File file = new File(path);
        if(!file.exists()) {
            file.mkdirs();
        }
        //springmvc完成文件的解析过程,通过参数绑定已经到upload变量上

        String fileName = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replace("-", "");
        fileName = uuid + "_" + fileName;
        //完成文件上传
        upload.transferTo(new File(path,fileName));
        return "success";
    }
}
  1. 通过注释发现,解析过程确实交给了spring
  2. 拿到文件的名称,是通过方法:getOriginalFilename
  3. 上传文件通过方法:transferTo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值