SpringMvc上传图片及表单提交(单文件+实体类参数提交)
前两天做项目用到了Springmvc的文件上传来上传图片,由于和这个普通的Java文件上传处理流程不太一样,所以做的时候碰了壁,一顿百度,博客,要不就是一部分代码,要不就是看不懂,用不会的代码,
下面来放上我理解到的,代码量还可以。欢迎批评改正
1.需要的炸包儿
commons-io-1.3.2.jar
commons-lang-2.6.jar
commons-fileupload-1.2.1.jar
2.定义springmvc配置文件的上传文件的bean:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<!--上传文件最大值,单位byte-->
<property name="maxUploadSize" value="104857600"></property>
</bean>
3.前台必须的form表单,post提交,enctype="multipart/form-data",表单框框name还是实体类字段
注意:file文件域的name值不能和实体类相同,因为controller要使用@RequestParam(value = "up_file", required = false) MultipartFile multipartFile单独接收 明显能看出前台file文件域的name属性要是和实体类属性名不可能封装到一起,所以单拎出来使用MultipartFile 接收。
4.Controller里定义一个变量接收file的文件名赋值给实体类然后传给数据库
//准备变量放入实体类 放入数据库
String filename = null;
5.使用isEmpty判断刚才接收的file文件是否为空 if (!multipartFile.isEmpty())
6.准备上传工作,
//1.定义上传的目标路径"static" + File.separator + "upload" 静态资源文件夹 分隔符 存放img的文件夹
String path = request.getSession().getServletContext().getRealPath("static" + File.separator + "ProductImg");
//2.获取源文件名
String oldFileName = multipartFile.getOriginalFilename();
//3.获取源文件的后缀 FilenameUtils工具类的getExtension方法
String suffix = FilenameUtils.getExtension(oldFileName);
//4.获取源文件的大小
long size = multipartFile.getSize();
7.判断上传的文件是否大于配置文件里定义的大小和定义及判断文件后缀名
if (size > 454000) {
request.setAttribute("uploadFileError", "上传文件大小不能超过500kb");
return "ProductAdd";
}else if (suffix.equalsIgnoreCase("jpg") ||
suffix.equalsIgnoreCase("png") || //判断 这些是符合要求的图片格式
suffix.equalsIgnoreCase("jpeg") ||
suffix.equalsIgnoreCase("pneg"))
8.防止用户上传的图片文件名一样,处理文件名:
String NewFileName = System.currentTimeMillis() + RandomUtils.nextInt(100000) + "." + suffix;
9.开始上传:
File targetFile = new File(path, NewFileName);
if (!targetFile.exists()) {
targetFile.mkdirs(); //判断这个文件是否存在
}
//写入 上传
try {
multipartFile.transferTo(targetFile);
} catch (IOException e) {
e.printStackTrace();
request.setAttribute("uploadFileError", "上传失败了! 哦,谢特~");
return "ProductAdd";
}
filename = NewFileName; //将处理好的上传的文件的名字传入变量存进数据库
} else {
//大小可以 格式不符合
request.setAttribute("uploadFileError", "上传文件的格式不正确");
return "ProductAdd";
}
}
10.将一开始定义的存放文件名的变量的值赋值给实体类:
xx.setFileName(filename);
11.处理你form表单的其他字段的信息调用业务方法增删改,然后返回view
最注意的一点:前台file文件域的name属性值 不能和实体类名一致
整体代码:
@RequestMapping(value = "FileAdd", produces = {"text/html;charset=UTF-8;"})
public String AddPRo(ProDuct product, @RequestParam(value = "up_file", required = false) MultipartFile multipartFile,
HttpServletRequest request) {
//准备变量放入实体类 放入数据库
String filename = null;
/*上传文件*/
if (!multipartFile.isEmpty()) {
//四步准备
//1.定义上传的目标路径"static" + File.separator + "upload"
String path = request.getSession().getServletContext().getRealPath("static" + File.separator + "ProductImg");
//2.获取源文件名
String oldFileName = multipartFile.getOriginalFilename();
//3.获取源文件的后缀 FilenameUtils工具类的getExtension方法
String suffix = FilenameUtils.getExtension(oldFileName);
//4.获取源文件的大小
long size = multipartFile.getSize();
if (size > 454000) {
request.setAttribute("uploadFileError", "上传文件大小不能超过500kb");
return "ProductAdd";
} else if (suffix.equalsIgnoreCase("jpg") ||
suffix.equalsIgnoreCase("png") || //判断 这些是符合要求的图片格式
suffix.equalsIgnoreCase("jpeg") ||
suffix.equalsIgnoreCase("pneg")) {
//定义上传的文件名
String NewFileName = System.currentTimeMillis() + RandomUtils.nextInt(100000) + "." + suffix;
//将即将上传的文件定义
File targetFile = new File(path, NewFileName);
if (!targetFile.exists()) {
targetFile.mkdirs(); //判断这个文件是否存在
}
//写入 上传
try {
multipartFile.transferTo(targetFile);
} catch (IOException e) {
e.printStackTrace();
request.setAttribute("uploadFileError", "上传失败了! 哦,谢特~");
return "ProductAdd";
}
filename = NewFileName; //将处理好的上传的文件的名字传入变量存进数据库
} else {
//大小可以 格式不符合
request.setAttribute("uploadFileError", "上传文件的格式不正确");
return "ProductAdd";
}
}
product.setFilename(filename);
if (productService.addProduct(product)) {
request.setAttribute("ProList", "Ok");
return "redirect:product/ProAdd";
//* return map.put("OkShowProduct", ProDuct);*//*
} else {
request.setAttribute("ProList", "No");
return "redirect:product/ProAdd";
}
}
SpringMvc上传图片及表单提交(单文件+实体类参数提交)的更多相关文章
- 5.7 Liquibase:与具体数据库独立的追踪、管理和应用数据库Scheme变化的工具。-mybatis-generator将数据库表反向生成对应的实体类及基于mybatis的mapper接口和xml映射文件(类似代码生成器)
一. liquibase 使用说明 功能概述:通过xml文件规范化维护数据库表结构及初始化数据. 1.配置不同环境下的数据库信息 (1)创建不同环境的数据库. (2)在resource/liquiba ...
- 在线数据库表(sql语句)生成java实体类工具
相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设 ...
- KO ------- 表中字段名和实体类属性名不一致
-----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就 ...
- 数据库的表的字段名称与实体类(pojo)不对应解决方案
数据库的表的字段名称与实体类(pojo)不对应解决方案 数据库表 
原文:https://ask.csdn.net/questions/674166 自己重新定义一个实体类 把查询结果放到这个实体类中,实体类包含所有的查询结果的字段 一个更好的办法,我发现你这关联表所 ...
- Git删除已提交的文件
Git删除已提交的文件 Git删除已提交的文件 定位文件 删除文件 参考链接 昨天通过Git Bash提交代码的时候遇到了由于单个文件大小超过100M,导致代码上传失败的问题.考虑到那个大文件是用于训 ...
随机推荐
- python学习01python入门一
在正式开启python代码的学习之旅之前,先来了解一下有关python语言的一些内容吧. python的命名,起源等等,大家自行百度了解,此处不再赘述. python是一种解释型语言,具有强调代码可读 ...
- Inno setup: check for new updates
Since you've decided to use a common version string pattern, you'll need a function which will parse ...
- 备忘录模式 (c++实现)
模式定义 备忘录(Memento): 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 模式动机 备忘录模式比较适用于功能比较复 ...
- Java第一阶段作业总结
目录 0.前言 1.作业过程总结 2.OO设计心得 3.测试的理解与实践 4.课程收获 5.对课程的建议 前言 本次博客针对第一阶段的三次作业发表总结,作业要求主要是初学者对于Java的基本语法.用法 ...
- opencv-9-图像噪声以及评估指标 PSNR 与SSIM
开始之前 我们在将 opencv 的图像显示在了 qt 的label 上, 我们能够将图显示在label 上, 用于显示我们的算法, 我们在 opencv 上一篇文章中介绍了 opencv 的核操作, ...
- 构建密钥验证ssh
1.需要两个虚拟机,每一个创建一个用户登录到用户根下 2.每个用户都要创建密钥对 3.把两个用户的公用密钥用ssh-copy-id -i 命令将公用的密钥复制到另一个用户中 4.在客户端开 ...
- springmvc @ResponseBody HttpMediaTypeNotAcceptableException
2019独角兽企业重金招聘Python工程师标准>>> [ERROR]org.springframework.web.HttpMediaTypeNotAcceptableExcept ...
- Shiro(二):Spring-boot如何集成Shiro(上)
这篇文章主要介绍了spring-boot是如何集成shiro的authentication流程的. 从shiro-spring-boot-web-starter说起 shiro-spring-boot ...
- Clickhosue 强大的函数,argMin() 和argMax()函数
说实话,我喜欢Clickhouse 的函数,简单操作,功能强大.今天需要给大家介绍两个函数,argMin(),argMax() 1.argMax():计算 ‘arg’ 最大值 ‘val’ 价值. 如果 ...
- OpenRASP管理后台安装记录
OpenRASP项目地址https://rasp.baidu.com/ 一.安装java 在CentOS中安装ElasticSearch需要Java1.8.0,可执行命令java -version查看 ...