基于SSM框架的多文件上传Controller类编写

2023-11-19

前端代码
<form id="fileupload" action="/rest/pic/upload" method="POST" enctype="multipart/form-data">
        <!-- Redirect browsers with JavaScript disabled to the origin page -->
        <noscript><input type="hidden" name="redirect" value="https://blueimp.github.io/jQuery-File-Upload/"></noscript>
        <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
        <div class="row fileupload-buttonbar">
            <div class="col-lg-7">
                <!-- The fileinput-button span is used to style the file input field as button -->
                <span class="btn btn-success fileinput-button">
                    <i class="glyphicon glyphicon-plus"></i>
                    <span>选择文件(多选)</span>
                    <input type="file" name="uploadFile" multiple="multiple">
                </span>
                <button type="submit" class="btn btn-primary start">
                    <i class="glyphicon glyphicon-upload"></i>
                    <span>开始上传</span>
                </button>
                <button type="reset" class="btn btn-warning cancel">
                    <i class="glyphicon glyphicon-ban-circle"></i>
                    <span>取消上传</span>
                </button>
                <button type="button" class="btn btn-danger delete">
                    <i class="glyphicon glyphicon-trash"></i>
                    <span>删除</span>
                </button> 
                <input type="checkbox" class="toggle" title="全选">
                <!-- The global file processing state -->
                <span class="fileupload-process"></span>
            </div>
            <!-- The global progress state -->
            <div class="col-lg-5 fileupload-progress fade">
                <!-- The global progress bar -->
                <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100">
                    <div class="progress-bar progress-bar-success" style="width:0%;"></div>
                </div>
                <!-- The extended global progress state -->
                <div class="progress-extended"> </div>
            </div>
        </div>
        <!-- The table listing the files available for upload/download -->
        <table role="presentation" class="table table-striped"><tbody class="files"></tbody></table>
    </form>

Controller类

@Controller
@RequestMapping("pic")
public class FileUploadUtil{
	
	private static final Logger LOGGER = Logger.getLogger(FileUploadUtil.class);
	   @Value(value = "${IMAGE_BASE_URL}")
		private String IMAGE_BASE_URL;
		private String REPOSITORY_PATH;
		private static final ObjectMapper mapper = new ObjectMapper();

		@Autowired
		private ExportService exportService;
		// 允许上传的格式
		private static final String[] IMAGE_TYPE = new String[] { ".bmp", ".jpg", ".jpeg", ".gif", ".png" };

		@RequestMapping(value = "/upload", method = RequestMethod.POST)
		@ResponseBody
		public String upload(@RequestParam("uploadFile") MultipartFile[] uploadFile , HttpServletRequest request,HttpServletResponse response) throws Exception {
			REPOSITORY_PATH = request.getSession().getServletContext().getRealPath("upload");
			MultipartFile multipartFile = null;
			boolean isLegal = false;
			List<PicUploadResult> fileUploadResult = new ArrayList<>();
			PicUploadResult pic = null;
			ExportExcelConfig eec = new ExportExcelConfig();
			String urls = "";
			for (int i = 0; i < uploadFile.length; i++) {
				multipartFile = uploadFile[i];
				// 校验图片格式
				for (String type : IMAGE_TYPE) {
					if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
						isLegal = true;
						break;
					}
				}

				// 封装Result对象,并且将文件的byte数组放置到result对象中
				pic = new PicUploadResult();

				// 状态
				pic.setError(isLegal ? 0 : 1);

				// 文件新路径
				String filePath = getFilePath(multipartFile.getOriginalFilename());

				if (LOGGER.isDebugEnabled()) {
					LOGGER.debug("Pic file upload .[{}] to [{}] ."+multipartFile.getOriginalFilename());
				}

				// 生成图片的绝对引用地址
				String picUrl = StringUtils.replace(StringUtils.substringAfter(filePath,REPOSITORY_PATH), "\\", "/");
				pic.setUrl(IMAGE_BASE_URL + picUrl);

				File newFile = new File(filePath);

				// 写文件到磁盘
				multipartFile.transferTo(newFile);

				// 校验图片是否合法
				isLegal = false;
				try {
					BufferedImage image = ImageIO.read(newFile);
					if (image != null) {
						pic.setWidth(image.getWidth() + "");
						pic.setHeight(image.getHeight() + "");
						isLegal = true;
					}
				} catch (IOException e) {
				}

				// 状态
				pic.setError(isLegal ? 0 : 1);
				if(pic.getError()==0){
					urls+=pic.getUrl();
					if(i<2)
					urls+=",";
				}
				if (!isLegal) {
					// 不合法,将磁盘上的文件删除
					newFile.delete();
				}
				fileUploadResult.add(pic);
			} 
			eec.setUrl(urls);
			eec.setCreateTime(new Date());
			exportService.addConfigInfo(eec);
			response.setContentType(MediaType.TEXT_HTML_VALUE);
			return mapper.writeValueAsString(fileUploadResult);
		}

		private String getFilePath(String sourceFileName) {
			String baseFolder = REPOSITORY_PATH;
			Date nowDate = new Date();
			// yyyy/MM/dd
			String fileFolder = baseFolder + File.separator + new DateTime(nowDate).toString("yyyy") + File.separator + new DateTime(nowDate).toString("MM") + File.separator
					+ new DateTime(nowDate).toString("dd");
			File file = new File(fileFolder);
			if (!file.isDirectory()) {
				// 如果目录不存在,则创建目录
				file.mkdirs();
			}
			// 生成新的文件名
			String fileName = new DateTime(nowDate).toString("yyyyMMddhhmmssSSSS") + RandomUtils.nextInt(100, 9999) + "." + StringUtils.substringAfterLast(sourceFileName, ".");
			return fileFolder + File.separator + fileName;
		}
}



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

基于SSM框架的多文件上传Controller类编写 的相关文章

随机推荐

  • Servlet3.0基础

    一 要求 1 MyEclipse10 0或以上版本 2 发布到Tomcat7 0或以上版本 二 步骤 1 创建javaEE6 0应用 三 概述 注解代替web xml配置文件 异步处理 对上传的支持 四 注解代替配置文件 1 删除web x
  • 【java篇】线程安全问题(大总结)

    哎嘿 CSDN的大佬您来啦 这来都来了 浅浅的给个赞呗 系列文章目录 线程的创建与主要方法分析和其他基础知识点 可以参考以下文章 线程知识点总结 南斋孤鹤的博客 CSDN博客 线程知识 超全 线程知识点 及线程方面的一些理解性问题https
  • Haproxy+keepalived(高可用集群部署)

    Haproxy keepalived Haproxy定义 Haproxy应用 Haproxy支持的调度算法 Haproxy配置文件详解 haproxy keepalived优点 项目环境 主服务器配置 1 haproxy配置 2 keepa
  • js制作简单的轮播图

    实现原理 首先定义一个div 设置width和height 然后在这个div里面再定义一个div2 该div的宽度为父div的宽度的n倍 其中n表示图片的张数 在这个div2里面放置需要进行轮播的所有图片 设置每张图片的宽度为一个最外层父类
  • eclipse javaweb 项目报错 The type javax.servlet.http.HttpServletRequest cannot be resolved.

    问题 把一个项目 copy 到自己电脑上后 图片 javaweb 项目 各种红 报错 jsp 页面也报错 Description Resource Path Location Type The type javax servlet http
  • 多益网络校招 —— 二面hr面

    11月27号晚上技术面试 12月6号才收到hr面试通知 12月8号hr面 整轮hr面试只有15分钟 一开始是做自我介绍 然后问了以下问题 1 我父母对我的职业有什么看法 2 之前有没有拿到满意的offer 3 为什么学前端 4 未来职业规划
  • docker 安装wiki.js 和wekan

    wiki js https blog csdn net vegas lee article details 122356646 wekan http t zoukankan com caihemm p 14446937 html
  • 用python实现英文字母和相应序数转换

    用python实现英文字母和相应序数转换 第一步 字母转数字 英文字母转对应数字相对简单 可以在命令行输入一行需要转换的英文字母 然后对每一个字母在整个字母表中匹配 并返回相应的位数 然后累加这些位数即可 过程中 为了使结果更有可读性 输出
  • Linux USB摄像头使用

    Linux USB摄像头使用 一 使用V4l2工具调试摄像头 1 v4l2 ctl 常用操作 安装V4l2工具包 sudo apt install v4l utils 通过v4l2查看摄像头设备 sudo v4l2 ctl list dev
  • 在Java中产生随机数的两个方法

    一 利用random方法来生成随机数 在Java语言中生成随 机数相对来说比较简单 因为有一个现成的方法可以使用 在Math类中 Java语言提供了一个叫做random的方法 通过这个方法可以让系统产生随机 数 不过默认情况下 其产生的随机
  • C语言多级指针含义归纳

    前言 今天在实习二叉排序树的结点删除时 用到了三级指针 一下子有些困惑了 一番思考 才觉得对指针的理解更透彻了 条理地总结一下 从多个角度来分析 可以让思路更清晰 不同角度的含义单独来看不复杂 但是组合在一起就容易使我们陷入困惑 理解了各个
  • ctfshow_web175

    此文章是为了记录本人对知识理解 如有错误望敬请指出并谅解 打开场景可以看到在本题中 页面的拦截方式做了改变 检查结果是否有flag if preg match x00 x7f i json encode ret ret msg 查询成功 x
  • C语言写游戏——扫雷

    实现效果比较简陋 如图 写游戏需要不同的文件构成 首先看一下资源管理器清楚框架结构 在test c文件里编写整个游戏的运行逻辑 具体代码 define CRT SECURE NO WARNINGS 1 include game h 测试游戏
  • 数据决定AIGC的高度,什么又决定着数据的深度?

    有人曾言 数据决定人工智能发展的天花板 深以为然 随着ChatGPT等AIGC应用所展现出的强大能力 人们意识到通用人工智能的奇点正在来临 越来越多的企业开始涌入这条赛道 在AIGC浪潮席卷全球之际 数据的重要性也愈发被业界所认同 之所以会
  • Linux-挖矿木马清理

    一 什么是挖矿木马 挖矿木马会占用CPU进行超频运算 从而占用主机大量的CPU资源 严重影响服务器上的其他应用的正常运行 黑客为了得到更多的算力资源 一般都会对全网进行无差别扫描 同时利用SSH爆破和漏洞利用等手段攻击主机 部分挖矿木马还具
  • ConstraintLayout系列:ConstraintLayout实现左右均分布局

    效果图 关键代码 android layout width 0dp 0dp在ConstraintLayout中的含义是match constraint 完整代码
  • CTex的基本用法

    主要内容 Latex简介 命令和环境 文档排版和组织 普通文本编辑 数学公式编辑 图形 插图 表格 文献等的编辑 一 Latex简介 1 概述 首先要从TEX介绍起 TEX是斯坦福大学的教授Donald E Knuth 图灵奖获得者 开发的
  • django.db.utils.DataError: (1406, “Data too long for column ‘name‘ at row 1“)

    报错现象 django db utils DataError 1406 Data too long for column name at row 1 排除故障 当时第一反应是上网百度 结果搜出来的结果都是改字符集 但明显我这个和字符集关系不
  • 单片机语音识别原理

    语音识别是一门交叉学科 近二十年来 语音识别技术取得显著进步 开始从实验室走向市场 人们预计 未来10年内 语音识别技术将进入工业 家电 通信 汽车电子 医疗 家庭服务 消费电子产品等各个领域 语音识别听写机在一些领域的应用被美国新闻界评为
  • 基于SSM框架的多文件上传Controller类编写

    前端代码