spring mvc文件上传小例子
spring mvc文件上传小例子
1.jsp页面
<%@page contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<form action="mycenter/updatecenter" enctype="multipart/form-data" method="post">
<tr>
<td class="r_left" id="businessfileSpan">上传证件的扫描件:</td>
<td>
<input type="file" name="businessfile" />
<input type="hidden" name="business_file" value="${account.business_file}" /> <!-- 若为修改则将以的图片路径也带回给action以便删除或覆盖原有文件-->
<c:if test="${account.business_file != ''}">
<img src="${account.business_file}" width="30" height="30" />
</c:if>
</td>
</tr>
<input type="submit" value="确定" />
</form>
2.action方法(spring mvc 全注解)
@RequestMapping(value = "updatecenter", method = RequestMethod.POST)
public String updateUserCenter(MultipartHttpServletRequest request,
Account account, Model model) { //注这里用的是MultipartHttpServletRequest
// 获得上传证件的扫描件
MultipartFile businessFile = request.getFile("businessfile");
String flag = null;
if (null != businessFile && 0 != businessFile.getSize()) {//判断是不是空
/**
*saveCenterFile为上传文件自己写的个工具类,主要完成文件上传,并返回上传后的文件完整路径
*参数需要说明的是:(1)account.getBusiness_file(),为上次文件完整路径(修改文件时使用的)
* (2)account是新文件将要保存的文件夹拼接
*
**/
flag = FileUtil.saveCenterFile(request.getSession()
.getServletContext().getRealPath(""), businessFile,
account.getBusiness_file(),"account");
if (flag == "false") {
model.addAttribute("resultmsg",
"<font color='red'>修改失败,请上传jpg或gif格式的图片!</font>");
return "mycenter/resource_user";
} else {
account.setBusiness_file(flag); //若上传成功,则将新文件完整路径保持在model中,以便持久话到数据库
}
}
return "redirect:/mycenter/interaccount/resource_user?result=yes";
}
3.上传工具类
package com.dsg.cccs.utils;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import javax.servlet.http.HttpSession;
import org.springframework.web.multipart.MultipartFile;
/**
* @ClassName: FileUtil
* @Description: TODO
* @author proteus modoucc_gmail_com
* @date 2011-8-5 下午5:10:31
*
*/
public class FileUtil {
/**
*
* @method: saveFile
* @author: Matty.Cong(Modoucc<AT>gmail.com)
* @description: TODO
* @date: 2012-9-16
* @param fileRealPath
* 文件实际保存目录
* @param fileHttpPath
* 文件HTTP访问目录
* @param prefix
* 文件保存的前缀
* @param uploadFile
* @return
*/
public static String saveFile(HttpSession session, String prefix,
MultipartFile uploadFile) {
String fileFolder = new SimpleDateFormat("yyyyMMdd").format(new Date());
/* 文件存储在容器中的实际路径 */
String saveFilePath = session.getServletContext().getRealPath("/")
+ "/" + prefix + fileFolder + "/";
/* 构建文件目录 */
File fileDir = new File(saveFilePath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
/* 获取上传的文件名称 */
String fileNameLong = uploadFile.getOriginalFilename();
/* 获取文件扩展名 */
String extensionName = fileNameLong.substring(fileNameLong
.lastIndexOf(".") + 1);
/* 重命名文件 */
String filename = UUID.randomUUID().toString();
try {
FileOutputStream out = new FileOutputStream(saveFilePath + filename
+ "." + extensionName);
out.write(uploadFile.getBytes()); // 写入文件
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return prefix +fileFolder+"/"+ filename + "." + extensionName;
}
public static String saveFile(String fileRealPath, MultipartFile uploadFile) {
String baseDir = "/upload/account/";
String fileFolder = new SimpleDateFormat("yyyyMMdd").format(new Date());
/* 文件存储的相对路径 */
String saveDirPath = baseDir + fileFolder + "/";
/* 文件存储在容器中的绝对路径 */
// String saveFilePath
// =request.getSession().getServletContext().getRealPath(saveDirPath)+"/";
String saveFilePath = fileRealPath + saveDirPath;
System.out.println(saveFilePath);
/* 构建文件目录以及目录文件 */
File fileDir = new File(saveFilePath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
/* 获取上传的文件名称 */
String fileNameLong = uploadFile.getOriginalFilename();
/* 获取文件扩展名 */
String extensionName = fileNameLong.substring(fileNameLong
.lastIndexOf(".") + 1);
/* 重命名文件 */
String filename = UUID.randomUUID().toString();
try {
FileOutputStream out = new FileOutputStream(saveFilePath + filename
+ "." + extensionName);
out.write(uploadFile.getBytes()); // 写入文件
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return saveDirPath + filename + "." + extensionName;
}
public static String updateUserImage(String fileRealPath,
MultipartFile uploadFile, String filename) {
String baseDir = "/upload/portImages/";
/* 文件存储的相对路径 */
String saveDirPath = baseDir + "/";
/* 文件存储在容器中的绝对路径 */
String saveFilePath = fileRealPath + saveDirPath;
System.out.println(saveFilePath);
/* 构建文件目录以及目录文件 */
File fileDir = new File(saveFilePath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
/* 获取上传的文件名称 */
String fileNameLong = uploadFile.getOriginalFilename();
/* 获取文件扩展名 */
String extensionName = fileNameLong.substring(fileNameLong
.lastIndexOf(".") + 1);
if (!extensionName.equals("jpg")) {
if (!extensionName.equals("gif")) {
return "false";
}
}
try {
FileOutputStream out = new FileOutputStream(saveFilePath + filename
+ "." + extensionName);
out.write(uploadFile.getBytes()); // 写入文件
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return filename + "." + extensionName;
}
/**
* 个人中心上传注册附件,友情连接上传附件 若是修改,则将以前的文件删除
*
* @param fileRealPath
* @param uploadFile
* @param oldImageUrl
* @param fileurl
* @return
*/
public static String saveCenterFile(String fileRealPath,
MultipartFile uploadFile, String oldImageUrl, String fileurl) {
String flag = "";
try {
if (null != oldImageUrl && oldImageUrl.length() > 5) {// 这里大于5只是为了防止“”
File fileDir = new File(fileRealPath + oldImageUrl);
if (fileDir.exists()) {
fileDir.delete();
}
}
// 文件存储的相对路径
String saveDirPath = "/upload/" + fileurl + "/"
+ new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/";
String saveFilePath = fileRealPath + saveDirPath;
// 构建文件目录以及目录文件
File fileDir = new File(saveFilePath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
// 获取上传的文件名称
String fileNameLong = uploadFile.getOriginalFilename();
// 获取文件扩展名
String extensionName = fileNameLong.substring(fileNameLong
.lastIndexOf(".") + 1);
if (!extensionName.equals("jpg")) {
if (!extensionName.equals("gif")) {
return "false";
}
}
// 重命名文件
String filename = UUID.randomUUID().toString();
FileOutputStream out = new FileOutputStream(saveFilePath + filename
+ "." + extensionName);
out.write(uploadFile.getBytes()); // 写入文件
out.close();
flag = saveDirPath + filename + "." + extensionName;
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}}
转载于:https://blog.51cto.com/3131854/999475
相关文章:

解密Kernel:为什么适用任何机器学习算法?
作者 | Marin Vlastelica Pogančić译者 | 陆离编辑 | 一一出品 | AI科技大本营(ID:rgznai100)机器学习中Kernel的秘密(一)本文探讨的不是关于深度学习方面的,但可能也会涉及一点儿,主要是因为…

03-Java的基础语法
一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有&…

图像处理-仿射变换 AffineTransform
转自:http://fairywangyutang.blog.sohu.com/146834554.html AffineTransform类描述了一种二维仿射变换的功能,它是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(译注:straightness,即变…

以前初学php用的分页函数
page.php <?php /* *http://www.iiwnet.com/php/ PHP学习 * */ function _PAGEFT($totle, $displaypg 20, $url ) { global $page, $firstcount, $pagenav, $_SERVER; $GLOBALS["displaypg"] $displaypg; if (!$page) $page 1; if (!$url) { $url $_SERVER[…

深度有趣 | 27 服饰关键点定位
简介 介绍如何使用CPM(Convolutional Pose Machines)实现服饰关键点定位 原理 关键点定位是一类常见而有用的任务,某种意义上可以理解为一种特征工程 人脸关键点定位,可用于人脸识别、表情识别人体骨骼关键点定位,可用…

有答案了!一张图告诉你到底学Python还是Java!你咋看?
2019年,该学Java还是Python?不,实际上应该这样问:都9102年了,难道有谁不想成为Python程序员吗?作为“常青树大佬”Java 和“新晋大佬”Python ,经常被人拿来对比,对于刚开始起步学习…

图像二值化----otsu(最大类间方差法、大津算法)(二)
转自:http://blog.stevenwang.name/ostu-threshold-56002.html OTSU算法也称最大类间差法,有时也称之为大津算法,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图…

android同时使用多个library时的问题
剧情是这样,我的app要使用两个library,如:LibraryA,LibraryB。这两个库又都需要support.v4.jar。 由于加载的时间不同,所以两个support.v4.jar不同,出错的提示如下: [2012-09-28 16:37:22 - ] F…

C#版 - Leetcode49 - 字母异位词分组 - 题解
C#版 - Leetcode49 - 字母异位词分组 - 题解 Leetcode49.Group Anagrams 在线提交:https://leetcode.com/problems/group-anagrams/ 题目描述 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: [&quo…

来学习几个简单的Hive函数吧!
作者 | 石晓文转载自小小挖掘机(ID:wAIsjwj)咳咳,今天来介绍一下几个Hive函数吧,先放一张我登哥划水的照片,希望大家也做一只自由的鱼儿,在知识的海洋里游呀游,嘻嘻!今天我们来介绍几…

OpenCV编程案例:使用轮廓函数检测连通区域
转自:http://www.aiseminar.cn/bbs/thread-617-1-1.html 此案例位于CXCORE中cvDrawContours函数介绍部分给出。此程序首先载入一个二值图像文件,然后使用函数再次二值化确认。接着使用cvFindContours找到轮廓,然后使用填充方式绘制轮廓线内部…

[译]Web Inspector开始支持CSS区域
最近,开发人员和设计师们可以在WebKit中尝试使用CSS区域特性了,我们认为是时候给他们一些开发工具了.最新版本的Chrome Canary中的web inspector现在已经支持下面这些功能: 查找文档中所有的命名流.显示每个命名流的内容和区域链.高亮页面中的CSS区域,就像是把鼠标放在web insp…

这或许是东半球分析十大排序算法最好的一篇文章
作者 | 不该相遇在秋天转载自五分钟学算法(ID:CXYxiaowu)前言本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程。预计阅读时间 47 分钟,强烈建议先收藏然后通过电脑端进行阅读。No.1 冒泡…

opencv使用cvFindContours提取联通域
转自:http://hi.baidu.com/irmosgarden/blog/item/8ce0174c54b307fad72afcbc.html // m_imgFeature为黑白目标图像,白色为前景,黑色为背景 // 注意此函数会修改m_imgFeature内容。若其不可更改,应另建立副本 // 1. count contou…

朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素
朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 【下载文本PDF进行阅读】 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得。助你在架构评审中过五关斩六将,助你写出能让人收藏点赞的设计文档。 技…

Mail Archiving Expert电子邮件归档专家
概况作为企业往来最通用的交流工具,企业中有95%以上的文件都是通过邮件来传递与沟通,但是一旦当邮件服务罢工,影响的不仅仅是企业信息交流无法正确与及时的传达,更可能影响企业与客户之间的交易,其后果更是不堪设想&am…

C++中MessageBox的常见用法
转自:http://blog.csdn.net/qiumingbo/archive/2007/05/25/1625324.aspxMessageBox用法消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合。1.MessageBox("这是一个最简单的消息框&am…

对标Mobileye!百度Apollo公布L4级自动驾驶纯视觉解决方案Apollo Lite
美国当地时间6月16日-20日,全球计算机视觉及模式识别领域顶级学术会议CVPR 2019(Conference on Computer Vision and Pattern Recognition)于美国长滩召开。百度Apollo在CVPR 2019公开了自动驾驶纯视觉城市道路闭环解决方案--百度Apollo Lite…
后台服务项目的白盒测试之旅
本文来自阿网易云社区作者:孙婷婷白盒测试起因17年下半年我开始介入部门新项目的服务v2版本的功能测试。刚接手项目时,感到十分头疼,首先它不像我刚接触测试时做的to C端项目,主要是页面展示操作,黑盒测试足够…

【自然框架 NatureFW】里的两种“映射”方式
自然框架里面采用了两种映射关系,一个是流行的ORM,另一是非主流的“CCM ” (我自己想的,呵呵)。 先说一下ORM。ORM是O和R的映射关系。也看到很多人写关于ORM的文章,发现好像有个误区。这个误区就是&#x…

ordfilt2函数功能说明
转自:http://www.ilovematlab.cn/thread-91331-1-1.html ordfilt2函数在MATLAB图像处理工具箱中提供了二维统计顺序滤波函数ordfilt2函数。二维统计顺序滤波是中值滤波的推广,对于给定的n个数值{al ,a2,...,an},将它们…

今晚直播写代码|英伟达工程师亲授如何加速YOLO目标检测
NVIDIA TensorRT是一种高性能深度学习推理优化器和运行时加速库,可以为深度学习推理应用程序提供低延时和高吞吐量。通过TensorRT,开发者可以优化神经网络模型,以高精度校对低精度,最后将模型部署到超大规模数据中心、嵌入式平台或…

TensorFlow Lite:TensorFlow在移动设备与嵌入式设备上的轻量级跨平台解决方案 | Google 开发者大会 2018...
Google 开发者大会 (Google Developer Days,简称 GDD) 是展示 Google 最新开发者产品和平台的全球盛会,旨在帮助你快速开发优质应用,发展和留住活跃用户群,充分利用各种工具获得更多收益。2018 Google 开发者大会于 9 月 20 日和 …

热烈庆祝“mysql 集群数据库架构成功”
坚持了两周,终于在linux下把mysql集群数据库给架起来了!下面简单说明下集群数据库原理 第一:集群数据库分MGM,NDBD,SQL 其中MGM是相当于“中央政府”,维持NDBD,SQL等服务器的之间的关系的 NDBD是数据存储的分布化&…

352万帧标注图片,1400个视频,亮风台推最大单目标跟踪数据集
CVPR 2019期间,专注于AR技术,整合软硬件的人工智能公司亮风台公开大规模单目标跟踪高质量数据集LaSOT,包含超过352万帧手工标注的图片和1400个视频,这也是目前为止最大的拥有密集标注的单目标跟踪数据集。论文《LaSOT: A High-qua…

centos7中nfs文件系统的使用
需求:file01:1.1.1.1(内网ip 172.20.103.212),file02:2.2.2.2(内网ip 172.20.103.211) 这两台机器的 /dev/mapper/myvg-mylv /data 这个盘都挂载到 video01 47.254.78.171, video02 47.254.83.81 这两台机器上即将file01和file02的/data目录都挂载到vid…

在图像变换中用最小二乘法求解仿射变换参数
设原图像为f(x,y),畸变后的图像为F(X,Y),要将F(X,Y)恢复为f(x,y),就是要找到(X,Y)坐标与(x,y)坐标的转换关系,这个转换关系称为坐标变换,表示为(x,y)T(X,Y)。 景物在成像过程中产生的扭曲,会使图像的比例失…

showModalDialog关闭子窗口,并刷新父窗口
一、用法:window.showModalDialog(url,args,dialogWidth650px;scrollno;dialogHeight250px;statusno; ); 二、关闭子窗口,并刷新父窗口 想在showModalDialog打开的窗口中提交表单且不打开新窗口 只需在打开的页面的<head>中加入<base target&qu…

cvDrawContours:在图像上绘制外部和内部轮廓
转自:http://www.aiseminar.cn/html/18/t-618.html?action-uchimage 函数cvDrawContours用于在图像上绘制外部和内部轮廓。当thickness > 0 时,绘制轮廓线;否则填充由轮廓包围的部分。 void cvDrawContours( CvArr *img, CvSeq* contour,…

Python最抢手、Go最有前途,7000位程序员揭秘2019软件开发现状
作者 | 屠敏 整理报告来源 | JetBrains转载自 CSDN(ID:CSDNnews)互联网的下半场,科技公司为面对更加严峻的竞争环境,越来越重视开源节流。而对于身处其中且撑起 IT 半边天的技术人,如今如何了?从…