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,导致代码上传失败的问题.考虑到那个大文件是用于训 ...
随机推荐
- AWR发现TOP Event log file sequential read
对客户DB进行巡检,发现TOP EVENT是LOG FILE Sequential read 等待事件说明 https://www.xuebuyuan.com/zh-hant/1743045.html ...
- css中的宽和高
width width表示宽 height height表示高 max-width.min-width max-width表示最大宽度 min-width表示最小宽度 max-height.min-h ...
- php里的闭包函数
一个匿名函数内要获取外部的变量必须要使用use: $message = 'hello'; $example = function() use ($message){ var_dump($message ...
- vuex-persist数据持久化存储插件
Vuex 解决了多视图之间的数据共享问题.但是运用过程中又带来了一个新的问题是,Vuex 的状态存储并不能持久化.也就是说当你存储在 Vuex 中的 store 里的数据,只要一刷新页面,数据就丢失了 ...
- R 语言命令行参数处理
在unix.windows外部需要调用R脚本执行,然后又需要输入不同的参数,类似shell脚本的命令行参数输入,可以使用Rcript命令实现. 命令格式:Rscript [options] [-e e ...
- Eclipse 全部快捷一览表(具TM全)
1. 编辑快捷键 编辑快捷键 介绍 psvm + Tab 生成main方法 sout + tab 生成输出语句 Ctrl+X / Ctrl + Y 删除一行 Ctrl+D 复制一行 Ctrl+/ 或 ...
- AWVS 安全渗透扫描
1.打开软件,点击 New Scan 2.在 website url 中输入被扫描的网址,点击 next 3.在 scanning profile 中选择测试的漏洞类型,默认选择 default(默认 ...
- RF(读写 excel)
1.安装 ExcelLibrary 库:pip install robotframework-ExcelLibrary 但是 Python3.0 通过上面的命令安装 ExcelLibrary 时,会发 ...
- Nginx模块开发(5)————开发简单的HTTP过滤模块
该模块可实现如下的功能,在浏览器输入http://你的IP/lcw.text,能够读出你在根目录下创建的lcw.txt里面的内容,并在前面加上一句字符串where there is a will,th ...
- python——import日常学习记录
import为导入包,有两种方法,一个是import,一个是from ** import ** import后紧跟着的是个模块,一般是一个.py文件下的类名: from *** import *** ...