前两天做项目用到了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上传图片及表单提交(单文件+实体类参数提交)的更多相关文章

  1. 5.7 Liquibase:与具体数据库独立的追踪、管理和应用数据库Scheme变化的工具。-mybatis-generator将数据库表反向生成对应的实体类及基于mybatis的mapper接口和xml映射文件(类似代码生成器)

    一. liquibase 使用说明 功能概述:通过xml文件规范化维护数据库表结构及初始化数据. 1.配置不同环境下的数据库信息 (1)创建不同环境的数据库. (2)在resource/liquiba ...

  2. 在线数据库表(sql语句)生成java实体类工具

    相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设 ...

  3. KO ------- 表中字段名和实体类属性名不一致

    -----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就 ...

  4. 数据库的表的字段名称与实体类(pojo)不对应解决方案

    数据库的表的字段名称与实体类(pojo)不对应解决方案 数据库表 ![image-20200429130200825](C:%5CUsers%5C%E6%9E%97%E6%AD%A3%E6%98%8E ...

  5. 高速创建和mysql表相应的java domain实体类

    今天创建了一个表有十几个字段,创建完之后必定要写一个与之相应的java domain实体类. 这不是反复的工作吗?为什么不先把这个表的全部的字段查出来,然后放到linux环境下,用sed工具在每一行的 ...

  6. JPA使用nativequery多表关联查询返回自定义实体类

    本文为JPA的学习采坑,如有问题欢迎指正. JPA官方推荐的多表关联查询使用不便,接触的有些项目可能会使用JPA 做简单查询,Mybaits做复杂查询.所以想要寻找一种好用的解决方案. JPA多表关联 ...

  7. 解决一个通过 WebReference 调用 WCF 时自定义 DataContract 类参数提交的问题

    先看一下VS2013自动创建默认的IService1.vb,注意自定义的数据契约 CompositeType ' 注意: 使用上下文菜单上的“重命名”命令可以同时更改代码和配置文件中的接口名“ISer ...

  8. mybatis 多表联查,多个实体类,如何返回一个List?(表太多,字段太多的问题)

    原文:https://ask.csdn.net/questions/674166 自己重新定义一个实体类 把查询结果放到这个实体类中,实体类包含所有的查询结果的字段 一个更好的办法,我发现你这关联表所 ...

  9. Git删除已提交的文件

    Git删除已提交的文件 Git删除已提交的文件 定位文件 删除文件 参考链接 昨天通过Git Bash提交代码的时候遇到了由于单个文件大小超过100M,导致代码上传失败的问题.考虑到那个大文件是用于训 ...

随机推荐

  1. Javascript-异步详解

  2. 尤雨溪在直播中讲到的Vue3.0 Beta的那些特性,快记笔记了

    前言 在那天风雨交加的夜晚,Vue的创作者尤雨溪尤大大在b站直播分享了Vue.js 3.0 Beta最新进展.我对直播的内容进行了一下整理.整整用了三天的空余时间赶上了 1. 全新文档RFCs Vue ...

  3. 关于暴力破解的一些学习笔记(pikachu)

    这几天的笔记都懒得发博客都写在本地了,随缘搬上来 什么是暴力破解 就是在攻击者不知道目标账号密码情况下的,对目标系统的常识性登陆 一般会采用一些工具+特定的字典 来实现高效的连续的尝试性登陆 一个有效 ...

  4. 曹工力荐:调试 jdk 中 rt.jar 包部分的源码(可自由增加注释,修改代码并debug)

    背景 大家知道,jdk安装的目录下,一般会有个src.zip包,这个包基本对应了rt.jar这个包.rt.jar这个包里面,就放了jdk中,jdk采用java实现的那部分类库代码,比如java.lan ...

  5. spark系列-2、Spark 核心数据结构:弹性分布式数据集 RDD

    一.RDD(弹性分布式数据集) RDD 是 Spark 最核心的数据结构,RDD(Resilient Distributed Dataset)全称为弹性分布式数据集,是 Spark 对数据的核心抽象, ...

  6. muduo网络库源码学习————无界队列和有界队列

    muduo库里实现了两个队列模板类:无界队列为BlockingQueue.h,有界队列为BoundedBlockingQueue.h,两个测试程序实现了生产者和消费者模型.(这里以无界队列为例,有界队 ...

  7. 学习HTML

    前端三剑客:HTML.CSS.JavaScript.现在就开始学习HTML啦. 学习资源:http://www.freecodecamp.cn/ 学习笔记: h1,head1,一级标题 <h1& ...

  8. Jmeter系列(9)- jmeter插件入门篇

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 jmeter4.0以上,如现在最 ...

  9. Spring源码阅读 之 bean的注册

    在前面我们已经学习了配置的加载,读取,解析.现在我们已经能够将一份配置转变成对应的一个个beandefinition了,我们知道Spring是一个IOC的容器,那么我们如何将这个一个个beandefi ...

  10. python学习之如何一次性输出多个变量的值

    如果要输出多个结果 ,中间使用逗号隔开,且引用变量为%(变量1,变量2,变量3)例如