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,导致代码上传失败的问题.考虑到那个大文件是用于训 ...
随机推荐
- 让Vagrant在Windwos下支持使用NFS/SMB共享文件夹从而解决目录共享IO缓慢的问题
此问题是在拥有相同配置的环境中,项目在win10跑的慢而在win7就正常的情况下发现的,一步步调试之后发现是文件操作的相关行为变的很慢,于是考虑到可能是系统问题,后来在如下链接找到了解决办法:http ...
- docker-compose简介及安装
一.简介 Compose是用于定义和运行多容器Docker应用程序的工具,是docker的服务编排工具,主要应用于构建基于Docker的复杂应用,compose通过一个配置文件来管理多个docker容 ...
- 基于Atlas实现mysql读写分离
一.实验环境 主机名IP地址 master192.168.200.111 slave192.168.200.112 atlas192.168.200.113 主从复制不再赘述,链接地址:授权Atlas ...
- nginx与keepalived实现高可用+Apache实现负载均衡
nginx与keepalived实现高可用 本实验使用了四台虚拟机 两台需要安装nginx及keepalived 两台安装Apache nginx可以源码安装也可以用yum安装nginx yum安装n ...
- 预测球队比赛结果及利用pyinstaller打包文件
一.预测乒乓球球队比赛成绩 1.乒乓球比赛规则 一局比赛:在一局比赛中,先得11分的一方为胜方:10平后,先多得2分的一方为胜方. 一场比赛:单打的淘汰赛采用七局四胜制,双打淘汰赛和团体赛采用五局三胜 ...
- 回顾2016年最火热的IT技术 科技发展让人惊叹!
编者按: 科技的发展速度总是让人们惊诧,仅从2016年来看,不仅有新涌现出来的技术和概念,还有很多甚至十年前出现的技术在今年呈现爆发性扩张.在这篇文章中,笔者将2016年最火热的IT技术尽收囊中,与各 ...
- centos 编码问题 编码转换 cd到对应目录 执行 中文解压
2019独角兽企业重金招聘Python工程师标准>>> **unzip -O CP936 xxx.zip (用GBK, GB18030也可以)** find -type f -nam ...
- Django 内置分页的简单使用
1, 文档 https://docs.djangoproject.com/en/1.11.1/topics/pagination/ 2,视图 from django.core.paginator im ...
- 在CentOS 7中安装配置JDK8
为什么80%的码农都做不了架构师?>>> ###说明 参考博客:http://blog.csdn.net/czmchen/article/details/41047187 系统环 ...
- 02-线性结构3 Reversing Linked List
02-线性结构3 Reversing Linked List (25分) 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:陈越 单位:浙江大学 http ...