当前位置: 首页 > article >正文

Spring MVC文件上传

Spring MVC文件上传

Spring MVC 框架的文件上传基于 commons-fileupload 组件,并在该组件上做了进一步的封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。

1. MultipartResolver接口

在 Spring MVC 中实现文件上传十分容易,它为文件上传提供了直接支持,即 MultpartiResolver 接口
MultipartResolver 用于处理上传请求,将上传请求包装成可以直接获取文件的数据,从而方便操作

MultpartiResolver 接口有以下两个实现类:

  • StandardServletMultipartResolver: 使用了 Servlet 3.0 标准的上传方式

  • CommonsMultipartResolver: 使用了 Apache 的 commons-fileupload 来完成具体的上传操作

MultpartiResolver 接口具有以下方法

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

使用 CommonsMultipartResolver 来完成文件上传,
分为单文件上传多文件上传两部分介绍

2. 文件上传

2.1 maven引入

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

2.2 配置 MultipartResolver

使用 CommonsMultipartReslover 配置 MultipartResolver 解析器,在 springmvc.xml 中添加代码如下:multipartResolver

<!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver -->
<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="5000000" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>

二选一

    @Bean("multipartResolver") //名称为固定multipartResolver
    public CommonsMultipartResolver  multipartResolver2(){
        CommonsMultipartResolver resolver  = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
        resolver.setMaxUploadSize(500000);
        return resolver;
    }
  • defaultEncoding: 请求的编码格式,默认为 ISO-8859-1,此处设置为 UTF-8
    (注:defaultEncoding 必须和 JSP 中的 pageEncoding 一致,以便正确读取表单的内容)
  • maxUploadSize: 上传文件大小上限,单位为字节

2.3 编写文件上传表单页面

负责文件上传表单的编码类型必须是“multipart/form-data”类型。

2.4 上传页面

   <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   <form action="/upload" method="post" enctype="multipart/form-data">
       <input type="file" name="file01"><br/>
       <input type="submit" value="上传">
   </form>
</body>
</html>

2.5 编写控制器

测试:

@Controller
public class UploadController {
    @GetMapping("/upload")
    public String  get(){
        return "upload";
    }
    @PostMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file01, HttpServletRequest req) throws IOException {
        //String Path = req.getRealPath(".");
        //找到文件存储的位置
        String path = req.getSession().getServletContext().getRealPath(".");
  
        return "ok";
    }
}

debug测试: 测试运行试一下:

存储文件:controller中编写

@PostMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file01, HttpServletRequest req) throws IOException {
        //String Path = req.getRealPath(".");
        //找到文件存储的位置
        String path = req.getSession().getServletContext().getRealPath(".");
        //获取文件名字
        String name=file01.getOriginalFilename();
        //transferTo方法将上传文件写到服务器上指定的文件;
        file01.transferTo(new File(path,name));
        return "ok";
    }

也可以把路径写死:

 file01.transferTo(new File("D:\\206",name));

在这里插入图片描述

加入图片uuid随机生成名字:

 String name= IdUtil.fastSimpleUUID()+"-"+file01.getOriginalFilename();

加入判断防止用户恶意测试:

if(file01.isEmpty()){
            return "请选择文件";
        }

代码修改:

@PostMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile file01, HttpServletRequest req) throws IOException {
      if(file.isEmpty()){
            return  "请选择文件";
        }
         //String Path = req.getRealPath(".");
        //找到文件存储的位置
        String path = req.getSession().getServletContext().getRealPath(".");
        //获取文件名字
        String name = IdUtil.fastSimpleUUID()+"_"+ file.getOriginalFilename();
        //transferTo方法将上传文件写到服务器上指定的文件;
        file01.transferTo(new File(path,name));
        return "ok";
    }

配置类中配置:

@Bean
    public CommonsMultipartResolver multipartResolver(){
        CommonsMultipartResolver resolver=new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
        resolver.setMaxUploadSize(5000000);
        return resolver;
    }


http://www.kler.cn/a/38007.html

相关文章:

  • 编写Pthreads程序实现直方图统计
  • Java设计模式之创建型-原型模式(UML类图+案例分析)
  • Ansible 自动化运维工具(完善版)
  • 让白嫖来的阿里云服务器来跑jupyter
  • Flutter ValueNotifier 监听数据变化
  • 论文阅读 HighlightMe: Detecting Highlights from Human-Centric Videos
  • wordpress仿站常用功能代码
  • HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(四)
  • Java Vue物联网系统
  • vagrant和vitrulBox创建虚拟机后使用xshell连接
  • Android 中利用多个Button组合实现选项切换效果
  • layui入门
  • AI辅助瞄准系统开发与实战(二)
  • 二级分销小程序怎么做
  • 【自我提升】JPA从搭建到CRUD快速入门(IDEA+MAVEN)
  • 【Linux系列P6】自动化构建工具-make/Makefile详解
  • 【跨平台开发】Uni-app原理分析
  • 安全启动相关命令使用
  • 网页无插件播放265/264视频/监控大屏/GPU解码
  • Win32 汇编在对话框上画线