Spring MVC实现高效文件上传及优化案例

前言

SpringMVC本身提高了便捷的文件上传方式,接下来我将演示如何在SpringMVC中实现文件上传的相关操作。以下案例是基于SSM框架整合的基础上实现的文件上传功能,如何进行SSM整合,可以参考我以往的博客。

第一步:添加依赖

pom.xml

XML 复制代码
    <!-- 文件上传与下载-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>

第二步:创建springmvc配置文件,添加文件上传配置

spring-mvc.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   
            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd      
            http://www.springframework.org/schema/context   
            http://www.springframework.org/schema/context/spring-context-4.1.xsd      
            http://www.springframework.org/schema/mvc   
            http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd      
            http://www.springframework.org/schema/util   
            http://www.springframework.org/schema/util/spring-util-4.1.xsd">

    <context:component-scan base-package="com.csx"/>

    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp"/>

    <!--文件上传 2.加配置,注意id-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="104857600"/>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

</beans>   
  • 开启扫描

  • 开启注解

  • 配置视图解析器

  • 配置文件上传相关配置

    • 一定要配置id,不能省略,否则报错(底层根据id加载这个bean)

第三步:创建文件上传页面

up.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--文件上传 3.写页面-->
<form action="/user/up.do" method="post" enctype="multipart/form-data">
    文件:<input type="file" name="file"> <br/>
    <input type="submit" value="提交">
</form>
</body>
</html>
  • 请求方式只能是post
  • 注意添加enctype属性
  • 文件上传的type为file,注意name属性值要与controller层的参数名一致

第四步:写controller,上传到指定文件夹

UserController

java 复制代码
package com.csx.controller;

import com.csx.entity.User;
import com.csx.service.UserService;
import com.csx.util.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;


    /*文件上传 4.写controller,上传至指定文件夹*/
    @RequestMapping("/up")
    public String fileUpload(MultipartFile file, HttpServletRequest request) throws IOException {
        //创建文件夹,上传文件
        //获得完整路径
        String realPath = request.getSession().getServletContext().getRealPath("/upload");
        System.out.println("realPath===" + realPath);

        //创建文件夹
        File f = new File(realPath);
        //如果文件夹不存在,就创建
        if (!f.exists()) {
            f.mkdirs();
        }
        //拿到上传的文件名
        String fileName = file.getOriginalFilename();
        //将UUID和文件名拼接,防止文件名重名而覆盖
        fileName = UUID.randomUUID() + "_" + fileName;
        //创建空文件
        File newFile = new File(f, fileName);
        //将文件内容写入
        file.transferTo(newFile);
        return "index";

    }


}

代码解析

  • 文件上传,controller使用MultipartFile 类型进行接收,并且参数名与页面的属性值保持一致
复制代码
String realPath = request.getSession().getServletContext().getRealPath("/upload");
System.out.println("realPath===" + realPath);
  • 获取完整路径,指定是绝对路径,包括盘符的字符串
复制代码
//创建文件夹
File f = new File(realPath);
//如果文件夹不存在,就创建
if (!f.exists()) {
    f.mkdirs();
}
  • 如果文件夹不存在,则创建文件夹upload
复制代码
//拿到上传的文件名
String fileName = file.getOriginalFilename();
//将UUID和文件名拼接,防止文件名重名而覆盖
fileName = UUID.randomUUID() + "_" + fileName;
  • 拿到原始文件名,并且使用UUID进行覆盖,防止上传同名文件导致文件覆盖
复制代码
//创建空文件
File newFile = new File(f, fileName);
//将文件内容写入
file.transferTo(newFile);
return "index";
  • 创建空文件,写入内容,返回Json格式数据

演示效果

地址栏输入http://localhost:8080/up.html

点击选择文件,选择第5.jpg

点击提交

返回index,就是我们return的String数据,表示上传成功,查看upload文件夹

文件上传成功!

相关推荐
曾令胜1 小时前
excel导出使用arthas动态追踪方法调用耗时后性能优化的过程
spring·性能优化·excel
.格子衫.1 小时前
Spring Boot 原理篇
java·spring boot·后端
多云几多1 小时前
Yudao单体项目 springboot Admin安全验证开启
java·spring boot·spring·springbootadmin
摇滚侠3 小时前
Spring Boot 3零基础教程,Spring Intializer,笔记05
spring boot·笔记·spring
Jabes.yang3 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
聪明的笨猪猪3 小时前
Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
兮动人4 小时前
Spring Bean耗时分析工具
java·后端·spring·bean耗时分析工具
MESSIR224 小时前
Spring IOC(控制反转)中常用注解
java·spring
摇滚侠4 小时前
Spring Boot 3零基础教程,Demo小结,笔记04
java·spring boot·笔记
笨手笨脚の5 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式·行为型设计模式