前两天做项目用到了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. Caused by: java.lang.ClassCastException: class java.lang.Double cannot be cast to class org.apache.hadoop.io.WritableComparable

    错误: Caused by: java.lang.ClassCastException: class java.lang.Double cannot be cast to class org.apac ...

  2. 在 Azure CentOS VM 中配置 SQL Server 2019 AG - (上)

    前文 假定您对Azure和SQL Server HA具有基础知识 假定您对Azure Cli具有基础知识 目标是在Azure Linux VM上创建一个具有三个副本的可用性组,并实现侦听器和Fenci ...

  3. Mac安装Nginx、Mysql、PHP、Redis

    安装xcode命令行工具的命令 xcode-select --install   安装homebrew: ruby -e "$(curl -fsSL https://raw.githubus ...

  4. 关于小程序中textarea内的字体浮动问题

    因为map.canvas.video.textarea 是由客户端创建的原生组件,原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上. 原生组件暂时还无 ...

  5. session开启慢的原因及解决办法

    做微信开发的时候发现微信回复特别慢,发个消息要好几秒才回复,发现不正常后就赶紧找答案,到最后发现是session_start()开启很慢,这是因为session缓存文件过多,默认缓存文件在:win:w ...

  6. (转)对 Linux 专家非常有用的 20 个命令

    谢谢你你给了我们在这篇文章前两个部分的喜欢,美言和支持.在第一部分文章中我们讨论了那些都只是切换到 Linux 和linux新手所需的必要知识的用户的命令. 对 Linux 新手非常有用的 20 个命 ...

  7. java中CompletionService的使用

    java中CompletionService的使用 之前的文章中我们讲到了ExecutorService,通过ExecutorService我们可以提交一个个的task,并且返回Future,然后通过 ...

  8. Mina Basics 02-基础

    基础 在第1章中,我们简要介绍了Apache MINA.在本章中,我们将了解客户端/服务器体系结构以及有关基于MINA的服务器和客户端的详细信息. 我们还将基于TCP和UDP公开一些非常简单的服务器和 ...

  9. 机器学习之分类回归树(python实现CART)

    之前有文章介绍过决策树(ID3).简单回顾一下:ID3每次选取最佳特征来分割数据,这个最佳特征的判断原则是通过信息增益来实现的.按照某种特征切分数据后,该特征在以后切分数据集时就不再使用,因此存在切分 ...

  10. Ubuntu Install Chinese Input Method

    为了提高在Linux系统使用中文输入的体验,安装搜狗拼音输入法. 确保键盘输入系统选中fcitx. 搜狗拼音输入法基于fcitx(Free Chinese Input Toy for X)框架,所以要 ...