SpringMVC多文件上传

2023-11-06

一、文件上传

1.1 导入pom依赖

 <commons-fileupload.version>1.3.3</commons-fileupload.version>
   
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>${commons-fileupload.version}</version>
    </dependency>

1.2 配置文件上传解析器

在spring-mvc.xml文件中添加文件上传解析器。

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 -->
    <property name="defaultEncoding" value="UTF-8"></property>
    <!-- 文件最大大小(字节) 1024*1024*50=50M-->
    <property name="maxUploadSize" value="52428800"></property>
    <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常-->
    <property name="resolveLazily" value="true"/>
</bean>

这段代码是一个Spring框架的配置,用于处理文件上传功能。它定义了一个名为multipartResolver的Bean,使用org.springframework.web.multipart.commons.CommonsMultipartResolver类来处理文件上传。其中设置了默认的编码方式为UTF-8,文件的最大大小为50MB,并启用了懒解析模式。这段代码的作用是配置文件上传的相关参数。

1.3 设置文件上传表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="${pageContext.request.contextPath }">
    <title>文件上传</title>
</head>
<body>
<form action="/file/upload" method="post" enctype="multipart/form-data">
    <label>编号:</label><input type="text" name="id" readonly="readonly" value="${param.id}"/><br/>
    <label>图片:</label><input type="file" name="imgFile"/><br/>
    <input type="submit" value="上传图片"/>
</form>
</body>
</html>

1.4 实现文件上传

(1) 设计表
在这里插入图片描述
(2) 配置generatorConfig.xml,并生成代码

   <table schema="" tableName="file_upload" domainObjectName="UploadFile"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
        </table>



(3) 创建业务层

(4) 配置resource.properties

#本地路径
dir=D:/upload/
#服务器路径
server=/upload/

(5) 配置文件读取工具类

package com.xqx.utils;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
 

public class PropertiesUtil {
 
    public static String getValue(String key) throws IOException {
        Properties p = new Properties();
        InputStream in = PropertiesUtil.class.getResourceAsStream("/resource.properties");
        p.load(in);
        return p.getProperty(key);
    }
}

(6) 配置项目与映射地址
在这里插入图片描述
(7) 编写控制器

package com.xqx.web;
 
import com.xqx.biz.UploadFileBiz;
import com.xqx.model.UploadFile;
import com.xqx.utils.PageBean;
import com.xqx.utils.PropertiesUtil;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
 
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;
 

@Controller
@RequestMapping("/file")
public class UploadFileController {
    @Autowired
    private UploadFileBiz UploadFileBiz;
 
    /*新增方法*/
    @RequestMapping("/add")
    public String save(UploadFile UploadFile, HttpServletRequest request) {
        UploadFileBiz.insertSelective(UploadFile);
        return "redirect:list";
    }
 
    /*删除方法*/
    @RequestMapping("/del/{id}")
    public String del(@PathVariable("id") Integer id) {
        UploadFileBiz.deleteByPrimaryKey(id);
        return "redirect:/file/list";
    }
 
    /*修改方法*/
    @RequestMapping("/edit")
    public String edit(UploadFile UploadFile, HttpServletRequest request) {
        UploadFileBiz.updateByPrimaryKeySelective(UploadFile);
        return "redirect:list";
    }
 
    /*查询方法*/
    @RequestMapping("/list")
    public String list(UploadFile UploadFile, HttpServletRequest request) {
        PageBean pageBean = new PageBean();
        pageBean.setRequest(request);
        List<UploadFile> UploadFiles = UploadFileBiz.listPager(UploadFile, pageBean);
//        ModelAndView modelAndView = new ModelAndView();
//        modelAndView.addObject("UploadFiles", UploadFiles);
//        modelAndView.addObject("pageBean", pageBean);
//        modelAndView.setViewName("UploadFile/list");
        request.setAttribute("UploadFiles", UploadFiles);
        request.setAttribute("pageBean", pageBean);
        return "file/list";
    }
 
    /*数据回显*/
    @RequestMapping("/preSave")
    public String preSave(UploadFile UploadFile, HttpServletRequest request) {
        if (UploadFile != null && UploadFile.getId() != null && UploadFile.getId() != 0) {
            UploadFile img = UploadFileBiz.selectByPrimaryKey(UploadFile.getId());
            request.setAttribute("img", img);
        }
        return "file/edit";
    }
 
    /*图片上传*/
    @RequestMapping("upload")
    public String upload(UploadFile img,MultipartFile imgFile) throws IOException {
        //读取配置文夹本地路径和服务器路径
        String dir = PropertiesUtil.getValue("dir");
        String server = PropertiesUtil.getValue("server");
 
        //利用MultipartFile类接受前端传递到后台的文件
        System.out.println("文件名:"+imgFile.getOriginalFilename());
        System.out.println("文件类型:"+imgFile.getContentType());
 
        //将文件转成流写入到服务器
        FileUtils.copyInputStreamToFile(imgFile.getInputStream(),new File(dir+imgFile.getOriginalFilename()));
 
        //通过对象将图片保存到数据库
        img.setImg(server+imgFile.getOriginalFilename());
        UploadFileBiz.updateByPrimaryKeySelective(img);
 
        return "redirect:list";
    }
}

(8) 编写jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="w" uri="http://jsp.xqx.cn" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link
            href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
            rel="stylesheet">
    <script
            src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
    <base href="${pageContext.request.contextPath }">
    <title></title>
    <style type="text/css">
        .page-item input {
            padding: 0;
            width: 40px;
            height: 100%;
            text-align: center;
            margin: 0 6px;
        }
 
        .page-item input, .page-item b {
            line-height: 38px;
            float: left;
            font-weight: 400;
        }
 
        .page-item.go-input {
            margin: 0 10px;
        }
    </style>
</head>
<body>
<form class="form-inline"
      action="/file/list" method="post">
    <div class="form-group mb-2">
        <input type="text" class="form-control-plaintext" name="name"
               placeholder="请输入用户名称">
    </div>
    <button type="submit" class="btn btn-primary mb-2">查询</button>
    <a class="btn btn-primary mb-2" href="/file/preSave">新增</a>
</form>
 
<table class="table table-striped">
    <thead>
    <tr>
        <th scope="col">ID</th>
        <th scope="col">用户</th>
        <th scope="col">图片</th>
    </tr>
    </thead>
    <tbody>
    <c:forEach var="i" items="${uploadImgs }">
        <tr>
            <td>${i.id }</td>
            <td>${i.name }</td>
            <td>
                <img src="${i.img }" style="width: 200px;height: 100px;">
            </td>
            <td>
                <a href="/file/preSave?id=${i.id}">修改</a>
                <a href="/file/del/${i.id}">删除</a>
                <a href="/page/file/upload?id=${i.id}">图片上传</a>
                <a href="/file/download?id=${i.id}">图片下载</a>
            </td>
        </tr>
    </c:forEach>
    </tbody>
</table>
<!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
<w:page pageBean="${pageBean }"></w:page>
 
</body>
</html>

在这里插入图片描述

二、文件下载

根据传入的文件id查询对应的文件信息,然后根据文件路径读取文件内容,并将文件内容和设置好的HTTP头信息封装成一个ResponseEntity对象,最后返回给客户端进行文件下载。

   @RequestMapping("/download")
    public ResponseEntity<byte[]> download(UploadImg uploadImg, HttpServletRequest req){
        try {
            //先根据文件id查询对应图片信息
            UploadImg img = this.uploadImgBiz.selectByPrimaryKey(uploadImg.getId());
            String diskPath = PropertiesUtil.getValue("dir");
            String reqPath = PropertiesUtil.getValue("server");
            //上面获取的数据库地址,需要转换才能下载成本地路径
            String realPath = img.getImg().replace(reqPath,diskPath);
            String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
            //下载关键代码
            File file=new File(realPath);
            HttpHeaders headers = new HttpHeaders();//http头信息
            String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
            headers.setContentDispositionFormData("attachment", downloadFileName);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

三、多文件上传

//多文件上传
    @RequestMapping("/uploads")
    public String uploads(HttpServletRequest req, Music music, MultipartFile[] files){
        try {
            StringBuffer sb = new StringBuffer();
            for (MultipartFile cfile : files) {
                //思路:
                //1) 将上传图片保存到服务器中的指定位置
                String dir = PropertiesUtil.getValue("dir");
                String server = PropertiesUtil.getValue("server");
                String filename = cfile.getOriginalFilename();
                FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));
                sb.append(filename).append(",");
            }
            System.out.println(sb.toString());
 
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }

在这里插入图片描述

四、JRebel的使用

下载
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC多文件上传 的相关文章

随机推荐

  • 2013年11月25日星期一(DEMO5-3计算参数化直线和平面交点)

    今天 以3D为主 仍然一步步地进行 首先加了个3D参数化直线 类似于参数化2D直线 参数化D直线 typedef struct PARMLINE3D TYP POINT3D p0 起点 POINT3D p1 终点 VECTOR3D v 方向
  • 黑苹果Catalina 15.x USB定制(Asrock Z370)

    文章目录 黑苹果Catalina 15 x USB定制 Asrock Z370 所需软件 一 安装驱动和usb端口限制补丁 检测是否正常工作 1 复制 USBInjectAll kext 到 引导分区 EFI CLOVER kexts Ot
  • linux上怎么安装svn客户端,Linux下安装SVN客户端

    1 下载 maintain HM16 213 software wget maintain HM16 213 software wget 2 解压 maintain HM16 213 software tar jxvf subversion
  • C语言经典100例题(48)--宏#define命令练习(3)

    目录 题目 问题分析 代码 运行结果 题目 宏 define命令练习 3 问题分析 define宏定义运算符 define LAG gt define SMA lt define EQ 代码 define LAG gt define SMA
  • Linux服务器权限管理实践——添加用户只访问某些文件目录

    自己的项目开发是多个人一起开发 前端那边有一些小问题在线上改比较方便 就像给他们搭FTP让他们自己上传修改 但比较棘手的就是权限问题 团队有好几个成员 每个人负责不同的站点模块 如何让各自都不干扰别人 不能进入别人的目录 下面解决这个问题
  • C语言变参函数解析

    1 函数声明 首先 要实现类似printf 的变参函数 函数的最后一个参数要用 表示 如 int log char arg1 这样编译器才能知道这个函数是变参函数 这个参数与变参函数的内部实现完全没有关系 只是让编译器在编译调用此类函数的语
  • Smbsm初步实现

    SMBMS 项目流程图如下 数据库 数据库相应的代码 smbms address CREATE TABLE smbms address id BIGINT 20 NOT NULL AUTO INCREMENT COMMENT 主键 cont
  • 安装完jdk在cmd输入Java没有反应的解决办法

    问题原因 在安装完JDK后 配置环境变量 参考 https www cnblogs com cnwutianhao p 5487758 html 这篇文章 出错就处在配置Path的时候 直接 点击了新建 然后复制了 Java Home bi
  • 百度飞桨7日训练营技术复盘笔记(vonvan)

    和学术研究不同 将深度学习技术运用到实际项目实践中需要考虑诸多不同的因素 如何确定哪些任务可以用人工智能完成 如何划分数据集 模型性能不佳时如何判断问题所在 如何判断某个改进思路的可行性 深度学习项目通常需要消耗大量的资源 与其投入一两个月
  • SPSS实现神经网络(多层感知器)

    目录 1 选用数据集 2 SPSS实现神经网络 1 产生随机数来选择样本数据集 2 生成多层感知器 3 用bankloan sav数据集进行实验 对数据集个体分类 是 否违约 1 选用数据集 实验选用SPSS自带数据集 bankloan s
  • flink uv计算方案

    1 flink去重 doris uv计算方案 流定义1day的窗口时间 在窗口中维护一个RoaringBitmap状态 自定义trigger为countTrigger 来一个数据触发一次 之后如果user id在状态中存在则不往下游发送 最
  • linux中文件描述符、文件操作(open/read/write/close/lseek)、虚拟空间地址、IO缓冲区

    一 文件描述符 文件描述符的概念 在linux系统中打开文件就会获得文件描述符 它是个很小的正整数 每个进程在PCB 进程控制块 中保存着一份文件描述符表 文件描述符就是这个表的索引 每个表项都有一个指向已打开文件的指针 文件描述符生成 o
  • 三极管放大电路参数计算

    有时候去面试 偶尔会遇到一些考官喜欢考一些基础性的知识 其中三极管放大电路参数计算 是他们津津乐道的题目 在实际设计中 很少用到三极管放大电路 多数是用在开关电路上 不清楚是什么原因 他们就喜欢考 下面就讲一下三极管放大电路参数计算 已知三
  • 【满分】【华为OD机试真题2023 JS】信号发射和接收

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 信号发射和接收 知识点数组栈单调栈 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 有一个二维的天线矩阵 每根天线可以向其他天线发射信号也能接收其他天线的信号 为
  • iframe ajax post请求,使用Jquery和IFrame的跨子域请求(GET,POST,...)

    我正在尝试在我的主域 http foo com 和我的API http api foo com 之间开发请求 为了绕过关于跨子域内容的限制 我在主页 http foo com main html 上使用iframe 指向iframe htm
  • 数据结构与算法 ---- 冒泡排序算法

    冒泡排序是一种简单的排序算法 它也是一种稳定排序算法 其实现原理是重复扫描待排序序列 并比较每一对相邻的元素 当该对元素顺序不正确时进行交换 一直重复这个过程 直到没有任何两个相邻元素可以交换 就表明完成了排序 假设待排序序列为 5 1 4
  • Centos各个版本下载地址

    CentOS7 6 下载地址 CentOS 7 x86 64 DVD 1810 iso CentOS 7 6 DVD 版 4G http mirrors 163 com centos 7 6 1810 isos x86 64 CentOS
  • Mysql 表字符集变更

    背景 线上有几张表的字符集是 latin1 要求换成utf8mb4 至于操作的时机则需要自行判断 1 查看库中所有字符集为latin1的所有表 SELECT DISTINCT table schema table name collatio
  • Spring事件传播行为和隔离级别

    spring特有的事务传播行为 spring支持7种事务传播行为 确定客户端和被调用端的事务边界 说得通俗一点就是多个具有事务控制的service的相互调用时所形成的复杂的事务边界控制 下图所示为7钟事务传播机制 传播行为 含义 PROPA
  • SpringMVC多文件上传

    文章目录 一 文件上传 1 1 导入pom依赖 1 2 配置文件上传解析器 1 3 设置文件上传表单 1 4 实现文件上传 二 文件下载 三 多文件上传 四 JRebel的使用 一 文件上传 1 1 导入pom依赖