文章目录

  • 概述
  • Maven依赖
  • 文件上传解析器bean的配置
  • 页面
    • shopoperation.html增加上传组件
    • shopoperation.js
  • Controller层
  • Github地址

概述

关于结合Spring + Spring MVC 实现文件上传下载,之前总结了几篇

Spring MVC-09循序渐进之文件上传(基于Apache Commons FileUpload)

Spring MVC-09循序渐进之文件上传(基于Servlet3.0+内置功能)

Spring MVC-09循序渐进之文件上传(基于Servlet3.0+Html5客户端上传文件)

Spring MVC-10循序渐进之文件下载

这里我们选择使用基于Apache Commons FileUpload的方式


Maven依赖

 <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.2</version></dependency>

文件上传解析器bean的配置

/o2o/src/main/resources/spring/spring-web.xml

 <!-- 文件上传解析器 --><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="defaultEncoding" value="utf-8"></property><property name="maxUploadSize" value="10485760000"></property><!-- 最大上传文件大小 --><property name="maxInMemorySize" value="10960"></property></bean>

页面

shopoperation.html增加上传组件

/o2o/src/main/webapp/WEB-INF/html/shop/shopoperation.html

type=“file” ,并且设置id,方便js中操作

<!-- 商铺图片  上传组件--><li class="item-content"><div class="item-inner"><div class="item-inner"><div class="item-title label">商铺图片</div><div class="item-input"><input type="file" id="shop-img"></div></div></div></li>

html尾部引入shopoperation.js

 <!-- 加载自定义的JS --><script type='text/javascript'src='../resources/js/shop/shopoperation.js' charset='utf-8'></script>

shopoperation.js

/o2o/src/main/webapp/resources/js/shop/shopoperation.js

获取shopImg ,(因为只能上传一张图片,所以$(’#shop-img’)[0].files[0]) ,添加到formData中,使用ajax提交到后台

/*** submit按钮触发的操作*/$('#submit').click(function() {// 获取页面的值省略....省略....// 图片var shopImg = $('#shop-img')[0].files[0];// 接收数据var formData = new FormData();// 和后端约定好,利用shopImg和 shopStr接收 shop图片信息和shop信息formData.append('shopImg',shopImg);// 转成JSON格式,后端收到后将JSON转为实体类formData.append('shopStr',JSON.stringify(shop));// 将数据封装到formData发送到后台formData.append('verifyCodeActual',verifyCodeActual);// 利用ajax提交$.ajax({url:registerShopUrl,type:'POST',data:formData,contentType:false,processData:false,cache:false,success:function(data){if(data.success){$.toast('提示信息:'+data.errMsg);}else{$.toast('提示信息:' + data.errMsg);}// 点击提交后 不管成功失败都更换验证码,防止重复提交$('#kaptcha_img').click();}});});

Controller层

/o2o/src/main/java/com/artisan/o2o/web/shopadmin/ShopController#registerShop方法

控制层的方法接收到前端的请求后,从MultipartHttpServletRequest 中获取到CommonsMultipartFile类型的 shopImg,同时为了简化Controller层调用Service层的难度,这里我们对Service的addShop做了改造,这样就避免了将CommonsMultipartFile转换为File,而是通过CommonsMultipartFile的getInputStream()方法,以流的形式作为入参(因为Thumbnail也可以处理流)。

控制层调用Service层,Service层addShop方法根据入参获取到文件的后缀名后,写入shop的基本信息,然后调用工具类获取文件的存储路径,将图片打上水印存入对应的文件目录,最后更新到tb_shop。具体见 实战SSM_O2O商铺_10【商铺注册】Service层的实现

@RequestMapping(value = "/registshop", method = RequestMethod.POST)@ResponseBodypublic Map<String, Object> registerShop(HttpServletRequest request) {Map<String, Object> modelMap = new HashMap<String, Object>();// 0. 验证码校验省略......// 1. 接收并转换相应的参数,包括shop信息和图片信息省略......// 1.2 图片信息 基于Apache Commons FileUpload的文件上传// Spring MVC中的 图片存在CommonsMultipartFile中CommonsMultipartFile shopImg = null;// 从request的本次会话中的上线文中获取图片的相关内容CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());if (commonsMultipartResolver.isMultipart(request)) {MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;// shopImg是和前端约定好的变量名shopImg = (CommonsMultipartFile) multipartRequest.getFile("shopImg");} else {// 将错误信息返回给前台modelMap.put("success", false);modelMap.put("errMsg", "图片信息为空");return modelMap;}// 2. 注册店铺if (shop != null && shopImg != null) {// Session TODO// 店主persionInfo的信息,肯定要登录才能注册店铺。// 所以这部分信息我们从session中获取,尽量不依赖前端,这里暂时时不具备条件,后续改造,先硬编码,方便单元测试PersonInfo personInfo = new PersonInfo();personInfo.setUserId(1L);shop.setOwner(personInfo);// 注册店铺// se = shopService.addShop(shop, shopImg); 改造前的调用方式// 这个时候,我们从前端获取到的shopImg是CommonsMultipartFile类型的,如何将CommonsMultipartFile转换为file.// 网上也有将CommonsMultipartFile转换为File的方法,并通过maxInMemorySize的设置尽量不产生临时文件// 这里我们换个思路,因为CommonsMultipartFile可以获取InputStream,Thumbnailator又可以直接处理输入流// 因为InputStream中我们无法得到文件的名称,而thumbnail中需要根据文件名来获取扩展名,所以还要再加一个参数String类型的fileName// 既然第二个和第三个参数都是通过shopImg获取的,为什么不直接传入一个shopImg呢?// 主要是为了service层单元测测试的方便,因为service层很难实例化出一个CommonsMultipartFile类型的实例ShopExecution se = null;;try {se = shopService.addShop(shop, shopImg.getInputStream(), shopImg.getOriginalFilename());if (se.getState() == ShopStateEnum.CHECK.getState()) {modelMap.put("success", true);modelMap.put("errMsg", "注册成功");} else {modelMap.put("success", false);modelMap.put("errMsg", se.getStateInfo());}} catch (IOException e) {e.printStackTrace();modelMap.put("success", false);modelMap.put("errMsg", "addShop Error");}} else {// 将错误信息返回给前台modelMap.put("success", false);modelMap.put("errMsg", "请输入店铺信息");}return modelMap;}

处理成功后,返回前台JSON数据,给用户提示


Github地址

代码地址: https://github.com/yangshangwei/o2o

实战SSM_O2O商铺_15【商铺注册】View层+Controller层之图片上传相关推荐

  1. 【VUE项目实战】54、商品添加功能(四)-商品图片上传模块

    接上篇<53.商品添加功能(三)-商品参数及属性模块> 上一篇我们完成了商品参数和商品属性面板的开发,本篇我们来完成商品图片上传模块的开发. 一.要实现的效果 我们在商品图片页签,需要放置 ...

  2. 商城项目笔记一:搭建Maven工程,利用Dubbo实现SOA面向服务框架,部署zookeeper注册中心,FastDFS框架实现图片上传,部署nginx服务器。

    文章目录 1. 商城项目总结笔记: 1.1. 第一天工作记录:搭建Maven工程 1.2. 第二天工作记录:创建SOA面向服务架构,通过工具类实现分页技术 1.3. 第三天工作记录:部署nginx服务 ...

  3. java 框架 Dao层 Mapper层 controller层 service层 model层 entity层 简介

    目录 简介 entity层 mapper层 service层 controller层 简介 SSM是sping+springMVC+mybatis集成的框架. MVC即model view contr ...

  4. Vue项目实战之人力资源平台系统(十)图片上传和打印员工信息

    前言 目录 前言 一.配置腾讯云空间存储图片 1.1 配置步骤 二.图片上传流程解析 三.实现文件上传组件 3.1 安装依赖 3.2 上传图片组件的基本布局 3.3 全局注册组件 3.4 点击图片进行 ...

  5. 富文本编辑器Ueditor实战(二)-图片上传

    本文接前文富文本编辑器Ueditor实战(一),前文留了一个问题,就是图片上传功能无法使用,报后台配置错误的问题.那么应该如何配置图片上传功能呢?本文将使用jsp+tomcat的方式进行说明如何动态配 ...

  6. Extjs 扩展Htmleditor,支持 图片上传 文件上传 插入flash 插入多媒体 插入层 插入横线等功能...

    去年对Extjs的富文本框编辑器htmleditor做过扩展,扩展成图片上传和文件上传功能,感觉功能还是不够,原文如下: http://hi.baidu.com/jackvoilet/blog/ite ...

  7. Extjs 扩展Htmleditor,支持 图片上传 文件上传 插入flash 插入多媒体 插入层 插入横线等功能

    最近在做项目的时候感觉还是不完美,于是在此基础上又进行了扩展,目前CJ_StarHtmlEditor支持: 图片上传 文件上传 插入flash 插入多媒体 插入层 插入横线等功能,基本上能够满足要求了 ...

  8. 如何注册阿里云申请图片上传

    该案例是实际开发中注册阿里云实现图片上传 1.在阿里云官网(https://www.aliyun.com/)注册账号: 2. 注册成功后登录阿里云: 3.登录成功后点击右上角"控制台&quo ...

  9. 如何注册京东云申请图片上传

    该案例是实际开发中注册京东云实现图片上传 1.在京东云官网(https://www.jcloud.com/index)注册账号: 2. 注册成功后登录京东云: 3.登录成功后点击右上角"控制 ...

最新文章

  1. MySql技巧个人笔记
  2. 1049. Counting Ones (30)
  3. 《java多线程编程实战指南 核心篇》读书笔记三
  4. iOS面试用到的知识点和技术点--第二章
  5. 常见网络命令介绍及使用
  6. Android SQLite详解
  7. 母版中menu控件上传后出现脚本错误
  8. 微软著名程序员、歌手、NBA球队老板保罗·艾伦逝世,盖茨、库克等大佬发文悼念...
  9. 【jQuery笔记Part4】04-jQuery案例-轮播图
  10. git如何合并指定文件内容_Git合并指定文件到另一个分支
  11. 总结《An Introduction to Ray Tracing》
  12. 智能机器人建房子后房价走势_日本房价走势分析:房产投资是否“未来可期”?...
  13. H3C Comware的作用
  14. python英语单词 扇贝英语安卓下载_扇贝单词英语版下载-扇贝单词英语版手机客户端APP 3.4.503 安卓版-我游网...
  15. android 播放滴一声
  16. c++11线程池的实现原理及回调函数的使用
  17. 边缘计算:新瓶装旧酒?
  18. 从程序员到项目经理(5):程序员加油站 -- 不是人人都懂的学习要点--------转自西西吹雪...
  19. Win7的77个小知识不容错过
  20. 大工21秋《道桥工程实验(二)》大作业离线作业

热门文章

  1. Ubuntu nginx 配置实例
  2. tf.dynamic_stitch 和  tf.dynamic_partition
  3. spark读取hbase数据
  4. 深度学习的基础知识(机器学习、损失函数、梯度下降、反向传播、基础模型一网打尽)
  5. MATLAB从入门到精通-欧拉法与梯形法求解微分方程(含MATLAB源码)
  6. 在Tableau中去除选择高亮效果
  7. 深度学习100例 | 第51天-目标检测算法(YOLOv5)(入门篇)
  8. Python编程基础:第三十四节 文件移动Move a File
  9. Excel打开csv文件显示乱码问题解决方法
  10. linux下source insight安装以及打开