SpringMvc上传文件详细流程

1. 编写 form 表单

在 Spring MVC 项目中,大多数的文件上传功能都是通过 form 表单提交到后台服务器的。

form 表单想要具有文件上传功能,其必须满足以下 3 个条件。

  • form 表单的 method 属性必须设置为 post。
  • form 表单的 enctype 属性设置为 multipart/form-data。
  • 至少提供一个 type 属性为 file 的 input 输入框。

常见的文件上传表单示例代码如下。

<form action="files/test1" method="post" enctype="multipart/form-data">
    上传文件<input type="file" name="file"><br>
    <input type="submit"value="上传">
</form>

①.这里method 必须为post  且必须要有enctype="multipart/form-data"将文件转化为二进制形式

②input的 type属性值为file 表示上传文件

③action="files/test1" 表示上传到的路径

当 form 表单的 enctype 属性为 multipart/form-data 时,浏览器会以二进制流的方式对表单数据进行处理,由服务端对文件上传的请求进行解析和处理。

以下的多文件上传暂未实验

[在上面的代码中,除了满足文件上传表单所必须具备的 3 个条件外,<input> 标签中增加一个 multiple 属性。该属性可以让我们同时选择对个文件进行上传,即实现多文件上传功能。]

2. 在pom.xml添加依赖

<!--    文件上传-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>

3. 在SpringMvc 配置文件配置文件上传器  

                id必须设置为multipartResolver

 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 </bean>

Spring MVC 提供了一个名为 MultipartResolver 的文件解析器,来实现文件上传功能。MultipartResolver 本身是一个接口,我们需要通过它的实现类来完成对它的实例化工作。

MultipartResolver 接口共有两个实现类,如下表。

实现类说明依赖支持的Servlet版本
StandardServletMultipartResolver它是 Servlet 内置的上传功能。不需要第三方 JAR 包的支持。 仅支持 Servlet 3.0 及以上版本
CommonsMultipartResolver借助 Apache 的 commons-fileupload 来完成具体的上传操作。需要 Apache 的 commons-fileupload 等 JAR 包的支持。不仅支持 Servlet 3.0 及以上版本,还可以在比较旧的 Servlet 版本中使用。

通过 <property> 可以对 CommonsMultipartResolver 的多个属性进行配置,其中常用的属性如下表。

属性说明
defaultEncoding上传文件的默认编码格式。
maxUploadSize上传文件的最大长度(单位为字节)
maxInMemorySize读取文件到内存中的最大字节数。
resolveLazily判断是否要延迟解析文件。

例:

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

4.控制层编写代码

package com.qs.springmvc.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;

@Controller
@RequestMapping("files")
public class FileUploadController {


    @PostMapping("/test1")
    public String upfile( MultipartFile file, HttpSession session){
        //  查看是否获取到文件
        System.out.println(file);
        //  用session来获取应用域
                ServletContext servletContext = session.getServletContext();
        //  通过应用域 获取的是target/项目名的真实路径
                String reath = servletContext.getRealPath("static/img");
        //  获取上传的文件的文件名
                String filename = file.getOriginalFilename();
        //  创建目录
                File fileDir = new File(reath);
                if (!fileDir.exists()){//判断目录是否存在,不存在就创建
                    fileDir.mkdir();
                }
        //  设置上传文件真实保存路径
                String finalPath = reath + File.separator +filename;
        //  用 '文件保存的路径' 创建的一个文件
                File file_ = new File(finalPath);
        //    transferTO 将文件转移,将左边的文件内容转移到右边的文件里
        try {
            file.transferTo(file_);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "index";//返回到  index.html页面

    }
}

注:此处须在webapp下建立static/img 文件,且须在里面先放一张图片,不然idea不会加载一个空的静态文件夹

① servletContext.getRealPath("static/img"); 

         servletContext.getRealPath(“”) ; 返回的是当前项目所运行的traget包里的项目在本地的路径:如: d:\xxx\xxx\项目名\target\项目名

        servletContext.getRealPath("static/img");  返回 d:\xxx\xxx\项目名\target\项目名\static\img

② File.separator 是文件分隔符 ,便于适配不同的系统

③在该控制器方法中包含一个 org.springframework.web.multipart.MultipartFile 接口类型的形参,该参数用来封装被上传文件的信息。MultipartFile 接口是 InputStreamSource 的子接口,该接口中提供了多个不同的方法,如下表。

名称作用
byte[] getBytes()以字节数组的形式返回文件的内容。
String getContentType()返回文件的内容类型。
InputStream getInputStream()返回一个 input 流,从中读取文件的内容。
String getName()返回请求参数的名称。
String getOriginalFillename()返回客户端提交的原始文件名称。
long getSize()返回文件的大小,单位为字节。
boolean isEmpty()判断被上传文件是否为空。
void transferTo(File destination)将上传文件保存到目标目录下。

至此,文件上传成功,恭喜你年轻人

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值