SpringMVC多文件上传

news2025/1/11 14:16:36

文章目录

  • 一、文件上传
    • 1.1 导入pom依赖
    • 1.2 配置文件上传解析器
    • 1.3 设置文件上传表单
    • 1.4 实现文件上传
  • 二、文件下载
  • 三、多文件上传
  • 四、JRebel的使用

一、文件上传

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的使用

下载
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/999294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot第40集:架构师写的代码,那叫一个优雅

事务的隔离性上&#xff0c;从低到高可能产生的读现象分别是&#xff1a;脏读、不可重复读、幻读。 脏读指读到了未提交的数据。 不可重复读指一次事务内的多次相同查询&#xff0c;读取到了不同的结果。 幻读师不可重复读的特殊场景。一次事务内的多次范围查询得到了不同的结果…

系统测试AC5. AC6. IAR和GCC调试效果,MDK AC6不开优化调试乱跳,甚至倒序执行

首先感谢大家对上一个视频的点评回复&#xff0c;非常有意义的讨论&#xff0c;这次AC6的表现更新惊呆&#xff0c;不开优化都可以乱跳。 【实验目的】 同样的程序代码&#xff0c;目的是测试C环境的调试现象。 【实验版本】 IAR版本 &#xff1a;9.3x MDK版本&#xff1a;5…

开赛啦!第六届“中国法研杯”司法人工智能挑战赛精彩启幕

9月9日&#xff0c;第六届“中国法研杯”司法人工智能挑战赛&#xff08;简写为“LAIC2023”&#xff09;在福建厦门正式拉开帷幕&#xff0c;主办方中国司法大数据研究院&#xff08;以下简称“中国法研”&#xff09;以及厦门市思明区政府、厦门海丝办有关领导共同参加了启动…

No1.详解【2023年全国大学生数学建模竞赛】C题——蔬菜类商品的自动定价与补货决策(代码 + 详细输出 + 数据集代码 下载)

时间告诉你什么叫衰老,回忆告诉你什么叫幼稚。不要总在过去的回忆里纠缠,昨天的太阳,晒不干今天的衣裳。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客…

Java低代码核心引擎:jvs-list(列表)按钮配置与数据权限配置

一、列表页按钮配置 按钮类型 A、表级按钮&#xff1b;B、行级按钮&#xff0c;表级按钮往往用作新增或者是整体性的操作&#xff0c;行级按钮主要用于对单行数据的操作。行级按钮超过3个自动折叠。 按钮增减 系统内置了 新增、删除、修改、详情、导入、导出、模板下载这几个…

DBeaver Community抢先体验版下载

https://dbeaver.io/files/ea/ 根据自己使用的平台&#xff0c;按需下载。

分享一下鲜花店怎么在小程序上做商城功能

随着互联网的普及和移动支付的便捷性&#xff0c;越来越多的人选择在线上购物。对于鲜花店来说&#xff0c;通过开发小程序上的商城功能&#xff0c;可以拓宽销售渠道、提高用户体验&#xff0c;同时提升品牌知名度。本文将探讨如何为鲜花店在小程序上实现商城功能。 对于鲜花店…

第2次实验:Ethernet

目的&#xff1a; 要探索以太网帧的细节。以太网是一种流行的链路层协议&#xff0c;在你的课文的第4.3节中有介绍&#xff1b;现代计算机连接到以太网交换机&#xff08;第4.3.4节&#xff09;&#xff0c;而不是使用经典的以太网&#xff08;第4.3.2节&#xff09;。在做这个…

细说GNSS模拟器的RTK功能(三)应用实例01——运行和分析模拟

在上期文章中我们介绍了基于RTCM插件来模拟RTCM使用的硬件和软件设置&#xff0c;本期文章我们将继续进行运行和分析模拟。 使用RTCM插件 运行和分析模拟 连接Ublox接收器 虽然采用了Novatel接收器进行模拟来获得更好的位置精度&#xff0c;但也同样适用于Ublox接收器。要将…

管理类联考——数学——汇总篇——知识点突破——应用题——植树

⛲️ 一、考点讲解 开放型植树 植树数量 总长 间隔 1 植树数量\frac{总长}{间隔}1 植树数量间隔总长​1封闭型植树 植树数量 总长 间距 植树数量\frac{总长}{间距} 植树数量间距总长​ 二、考试解读 本考点要注意开放型与封闭型植树公式的区别。本考点的难点在于变间距…

为什么要反复讲EasyAVFilter这个东西,真能替代ffmpeg吗?

最近我写了不少关于EasyAVfilter的东西&#xff0c;有rtsp转mp4、MP4转HLS、rtsp转rtmp&#xff0c;就简简单单几行代码&#xff0c;就能解决很多技术上的问题&#xff0c;而且就算是音视频开发的小白&#xff0c;也可以用EasyAVfilter开发出一个音视频后端出来&#xff0c;他既…

VIOOVI深度发问:精益思想是什么?

精益思想是什么&#xff1f; 精益思想最早是从丰田生产体系中得到启发的&#xff0c;通俗来说就是用最小的投入去创造最大的价值&#xff1a;通过消除浪费&#xff0c;减少资源投入&#xff0c;加上人力资源上的优化、设备管理上的改善和一些小的地方创新&#xff0c;尽可能多…

element-plus点击菜单栏全部展开问题解决

这是由子菜单项的index属性引起的&#xff0c;子菜单项的index属性添加相同的值时就会出现这种情况。所以为每个子菜单项添加不同的index属性值就可解决。

2023年9月DAMA-CDGA/CDGP数据治理认证这里靠谱

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

调用微信公众号创建会员卡接口报错48001

调用文档&#xff1a;1.新版会员卡介绍 | 微信开放文档 接口地址&#xff1a; HTTP请求方式: POSTURL:https://api.weixin.qq.com/card/create?access_tokenACCESS_TOKEN 错误描述&#xff1a;48001 {"errcode":48001,"errmsg":"api unauthorized hi…

vue3中的吸顶导航交互实现 | VueUse插件

目的&#xff1a;浏览器上下滚动时&#xff0c;若距离顶部的滚动距离大于78px&#xff0c;吸顶导航显示&#xff0c;小于78px隐藏。使用vueuse插件中的useScroll方法​​​​​​​和动态类名控制进行实现 1. 安装 npm i vueuse/core 2. 获得滚动距离 项目中导入&#xff0…

深度学习在医疗保健领域的应用:从图像识别到疾病预测

文章目录 深度学习在医学影像识别中的应用1. 癌症检测2. 病理学图像分析3. 医学图像分割 深度学习在疾病预测中的应用1. 疾病风险预测2. 疾病诊断辅助3. 药物研发 深度学习在个性化治疗中的应用1. 基因组学分析2. 临床数据集成 深度学习在医疗保健中的挑战和未来数据隐私和安全…

C语言经典100例题(55)--从一个整数a中把从右端开始的4-7位取出来

目录 题目 问题分析 右移操作符 左移操作符 方法一 方法二 运行结果 题目 用c语言从一个整数a中把从右端开始的4-7位取出来 问题分析 右移操作符 右移操作符是一种位运算符&#xff0c;用于将二进制数向右移动指定的位数。它通常用符号" >> "表示…

【哈士奇赠书活动 - 36期】- 〖Django Web 开发实例精解〗

文章目录 ⭐️ 赠书 - 《Django Web开发实例精解》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《Django Web开发实例精解》 ⭐️ 内容简介 《Django Web开发实例精解》详细阐述了与Django相关的基本解决方案&#xff0c;主要包括模型和数据…

期权赚的钱从哪儿来的?期权怎么盈利?

期权盈利通过买入期权获利&#xff0c;和卖出期权获利&#xff0c;2种方式&#xff0c;简单理解就是做期权买方和卖方来盈利和赚钱&#xff0c;下文为大家揭秘期权赚的钱从哪儿来的&#xff1f;期权怎么盈利&#xff1f;本文来自&#xff1a;期权酱 一、买入期权利润计算。 1、…