Springmvc file多附件上传 显示 删除操作
之前项目需求要做一个多附件上传 并显示上传文件 带删除操作 一筹莫展之际搜到某个兄弟发的博客感觉非常好用被我copy下来了此贴算是改良版 再次感谢(忘记叫什么了时间也有点久没有历史记录了)先上图

基于springmvc附件上传 所需jar包
commons.fileupload-1.2.0.jar
commons.io-1.4.0.jar
这个是我使用的jar包有需要的可以直接百度网盘下载 里面有好几个版本 自行选择 放在lib下面 使用的话maven 直接下载也可以
链接:https://pan.baidu.com/s/1gs0BBZZmh_-s-xIT7zm56g
提取码:86ne
jar包配置完成之后
1.在spring-mvc.xml配置文件下加入
<!-- 文件上传支持 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="100000000"/>//上传文件大小最大限制 <property name="maxInMemorySize" value="1000000"/>//</bean>
2.前端jsp页面
<form id="deviation" method="post"> <div> <a href="javascript:void(0)">附件上传'<input type="file" class="iptFile" name="files" onchange="upFile(this)"></a> <span class="no_file"></span> <ul class="upload-enclosure-ul"> <%-- 根据上传的文件生成 每个 li--%> </ul> </div> <input type="button" value="提交" onclick="UpladFile()"></form>
3.js
function upFile(a) { var flag = $(a); if (!flag[0].files || !flag[0].files[0]) { return; } var name = flag[0].files[0].name;//文件名 var suffix = suffixName(name)[0].toLowerCase(); //后缀名 var size = flag[0].files[0].size; //文件大小 var fr = new FileReader(); // 这个FileReader应该对应于每一个读取的文件都需要重新new一个 var files = flag[0].files[0]; // files可以获取当前文件输入框中选择的所有文件,返回列表 fr.readAsDataURL(files); // 读取的内容是加密以后的本地文件路径 fr.onload = function (e) { // 数据读取完成时触发onload对应的响应函数 var timeStamp = Math.floor(Math.random() * 10000); //自定义一个随机数 $(flag).parent().addClass('li' + timeStamp).hide(); //每次隐藏之前添加一个Class var html = '<a href="javascript:void(0)" >附件上传\n' + '<input type="file" class="iptFile" name="files" onchange="upFile(this)">\n' + '</a>';
$('.no_file').before(html);//每次生成一个input file 插入到节点 var li = display(suffix, files, timeStamp, name); if ($('.upload-enclosure-ul li').length < 10) { //判断不能超过10个 可自行写入多少 $('.upload-enclosure-ul').append(li);
} else { layer.alert("对不起,最多能选择10个附件!", 16, true); }
};}
function display(suffix, files, timeStamp, name) { var li; if (suffix == '.jpg' || suffix == '.jpeg' || suffix == '.png' || suffix == '.bmp' || suffix == '.gif') { //图片格式 li = '<li> <span><i class="fa fa-file-image-o"> </i>' + name + '</span> <span class="size">(' + parseInt(files.size / 1000) + 'kb)</span> <span class="remove" data-class="li' + timeStamp + '" onclick="deleteLi(this)">删除</span> </li>'; } else if (suffix == '.doc' || suffix == '.docx') {//word格式 li = '<li><span><i class="fa fa-file-word-o"> </i>' + name + '</span> <span class="size">(' + parseInt(files.size / 1000) + 'kb)</span> <span class="remove" data-class="li' + timeStamp + '" onclick="deleteLi(this)">删除</span> </li>'; } else if (suffix == '.xls' || suffix == '.xlsx') {//excel格式 li = '<li><span><i class="fa fa-file-excel-o"> </i>' + name + '</span> <span class="size">(' + parseInt(files.size / 1000) + 'kb)</span> <span class="remove" data-class="li' + timeStamp + '" onclick="deleteLi(this)">删除</span> </li>'; } else if (suffix == '.ppt' || suffix == '.pptx') {//PPT格式 li = '<li><span><i class="fa fa-file-pdf-o"> </i>' + name + '</span> <span class="size">(' + parseInt(files.size / 1000) + 'kb)</span> <span class="remove" data-class="li' + timeStamp + '" onclick="deleteLi(this)">删除</span> </li>'; } else if (suffix == '.ppt' || suffix == '.pdf') {//PDF格式 li = '<li><span><i class="fa fa-file-pdf-o"> </i>' + name + '</span> <span class="size">(' + parseInt(files.size / 1000) + 'kb)</span> <span class="remove" data-class="li' + timeStamp + '" onclick="deleteLi(this)">删除</span> </li>'; } else if (suffix == '.zip' || suffix == '.rar' || suffix == '.7z') {//压缩格式 li = '<li><span><i class="fa fa-file-excel-o"> </i>' + name + '</span> <span class="size">(' + parseInt(files.size / 1000) + 'kb)</span> <span class="remove" data-class="li' + timeStamp + '" onclick="deleteLi(this)">删除</span> </li>'; } else if (suffix == '.wav' || suffix == '.mp3' || suffix == '.aac' || suffix == '.wma') {//声音格式 li = '<li><span><i class="fa fa-file-video-o"> </i>' + name + '</span> <span class="size">(' + parseInt(files.size / 1000) + 'kb)</span> <span class="remove" data-class="li' + timeStamp + '" onclick="deleteLi(this)">删除</span> </li>'; } else if (suffix == '.avi' || suffix == '.mp4' || suffix == '.mov' || suffix == '.mkv' || suffix == '.rm' || suffix == '.rmvb' || suffix == '.mpg' || suffix == '.mpeg') {//视频格式 li = '<li><span><i class="fa fa-file-video-o"> </i>' + name + '</span> <span class="size">(' + parseInt(files.size / 1000) + 'kb)</span> <span class="remove" data-class="li' + timeStamp + '" onclick="deleteLi(this)">删除</span> </li>'; } else if (suffix == '.txt') {//文本格式 li = '<li><span><i class="fa fa-file-text-o"> </i>' + name + '</span> <span class="size">(' + parseInt(files.size / 1000) + 'kb)</span> <span class="remove" data-class="li' + timeStamp + '" onclick="deleteLi(this)">删除</span> </li>'; } else { li = '<li><span><i class="fa fa-file-o"> </i>' + name + '</span> <span class="size">(' + parseInt(files.size / 1000) + 'kb)</span> <span class="remove" data-class="li' + timeStamp + '" onclick="deleteLi(this)">删除</span> </li>'; } return li;}
function deleteLi(a) { $(a).parent().remove(); var attr = "." + $(a).attr('data-class'); $(attr).remove(); //删除对应 input file if ($('.li').length != 0) { // 显示隐藏 未选择文件字眼 $('.no_file').hide(); } else { $('.no_file').show(); }}
function suffixName(file_name) { var result = /\.[^\.]+/.exec(file_name); return result;}
/* 附件上传 */function UpladFile() { var formData = new FormData($("#deviation")[0]); $.ajax({ type: 'POST', url: '<c:url value="/product/deviation/action.do?method=upload"/>',//自己后台controller路径 data: formData, contentType: false, cache: false, processData: false, contentType: false }).success(function (data) {
}).error(function () { alert("上传失败"); });}
4.后端java
@Controller@RequestMapping(value = "/product/deviation/action.do")public class ActionController {
/*多附件上传 */@RequestMapping(params = {"method=upload"}, method = RequestMethod.POST)@ResponseBodypublic void fileupload(@RequestParam("files") MultipartFile[] files, HttpServletRequest request) throws IOException { //获取服务器中保存文件的路径 String path = request.getSession().getServletContext().getRealPath("") + "\\enclosure\\"; System.out.println(path); for (int i = 0; i < files.length; i++) { MultipartFile file = files[i]; //保存文件 try { if (!file.isEmpty()) { File filepath = new File(path); if (!filepath.exists()) //判断如果没有enclosure文件夹自动创建 filepath.mkdirs(); // 文件保存路径 String savePath = path + file.getOriginalFilename(); // 转存文件 file.transferTo(new File(savePath)); //附件上传成功后 将 name url 保存到数据库中
} } catch (Exception e) { e.printStackTrace(); } }
}
} 5.我是根据ajax提交 也可以直接form表单提交 java代码不变前端form加上 enctype="multipart/form-data"就ok了
<form id="deviation" method="post" enctype="multipart/form-data">
希望对你们有点帮助 有问题可以在下面留言 我看到了会及时回复
Springmvc file多附件上传 显示 删除操作的更多相关文章
- java操作FTP,实现文件上传下载删除操作
上传文件到FTP服务器: /** * Description: 向FTP服务器上传文件 * @param url FTP服务器hostname * @param port FTP服务器端口,如果默认端 ...
- file 多次上传附件功能完善
之前解决了一个页面中的单个附件上传问题,使用的是 id 定位.但是一个页面中,可能存在多个附件上传的地方,这时候如果继续使用 id,会出问题. 我依旧会上传一个附件.附件链接地址: https://f ...
- input type=file实现图片上传,预览以及图片删除
背景 前两天在做一个PC网站的意见反馈,其中涉及到了图片上传功能,要求可以上传多张图片,并且支持图片上传预览及图片删除, 图片上传这一块以前没怎么搞过,而且一般也很少会碰到这样的需求,所以在做这个功能 ...
- jQuery EasyUI/TopJUI上传多个附件并可以进行删除操作
jQuery EasyUI/TopJUI上传多个附件并可以进行删除操作 html <table data-toggle="topjui-datagrid" data-opti ...
- dedecms 5.7文章编辑器附件上传图标不显示
我最近发现在使用dedecms 5.7文章编辑器附件上传图标不显示了,以前是没有问题的,这个更新系统就出来问题了,下面我来给大家分享此问题解决办法. 问题bug:在dedecms 5.7中发现了一 ...
- NuGetTools:批量上传、删除和显示NuGet包
快照 前言 NuGet是.NET开发必不可少的包管理工具,在日常更新版本过程中,可能需要批量发布 NuGet 包,也不可避免需要发布一些测试的包,后期想将这些测试或者过期的包删除掉.nuget.org ...
- asp.net结合uploadify实现多附件上传
1.说明 uploadify是一款优秀jQuery插件,主要功能是批量上传文件.大多数同学对多附件上传感到棘手,现将asp.net结合uploadfiy如何实现批量上传附件给大家讲解一下,有什么不对的 ...
- 使用plupload做一个类似qq邮箱附件上传的效果
公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可 ...
- EBS开发附件上传和下载功能(转)
原文地址: EBS开发附件上传和下载功能 上传 Oracle ERP二次开发中使用的方式有两种,一是通过标准功能,在系统管理员中定义即可,不用写代码,就可以使几乎任何Form具有附件功能,具体参考系统 ...
随机推荐
- Django-03视图层
5.1 视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片 ...
- java数据库学习
//编写db类/* a加载驱动 驱动类要全路径 包名+类名 suround with try/catch * b设置参数url user pwd * c.连接数据库(import 'Connectio ...
- 【OCP-12c】CUUG最新考试原题整理及答案(071-11)
11.(5-8) choose the best answer: Examine the structure of the BOOKS_TRANSACTIONS table. You want to ...
- iframe嵌套页面的跳转方式
一.背景A,B,C,D都是jsp,D是C的iframe,C是B的iframe,B是A的iframe,在D中跳转页面的写法区别如下. 二.JS跳转window.location.href.locatio ...
- iis7下站点日志默认位置
在iis6时,通过iis管理器的日志配置可以找到站点日志存储的位置. 但是在iis7下,iis管理器下的日志配置只能找到iis日志配置的主目录,但到底在哪个子目录,则无法直接获知. 后来在主日 ...
- 极光大数据告诉你,程序员们都在"愁"些啥?
有言道:隔行如隔山.面对不甚熟悉的人群和岗位,我们很容易在固有印象的干扰下,作出一些偏离实际的解读.比如在很多外行人眼中,程序员群体的固有形象是性格木讷,生活方式通常也比较宅.他们最大的爱好就是玩游戏 ...
- POJ3074 Sudoku
POJ3074 Sudoku 与POJ2676相比,这一题搜索时每一步都找到最好确定的点进行枚举 对于每行.每列.每个九宫格,都分别用一个9位二进制数保存还有那些数还可以填 对于每个位置,将其所在行. ...
- 【Alpha】Scrum Meeting 0&1
前言 第0次会议和第1次会议分别在4月1日和4月2日21:00由PM在大运村一公寓3层召开. 第0次时长50min,主要明确了接下来的任务,对工作进行了分配. 第1次会议时长20min,调研了当日工作 ...
- Runas命令巧用
Runas,从字面上看就知道,以谁的身份去run一个程序,那么他就是在当前登陆的Windows帐号下,以本地或者是域中的其他帐号的身份去运行一个程序.简明语法如下: Runas /user:usern ...
- Regini命令的使用和参数讲解
Regini程序操作系统自带的,从XP开始就有,主要是用于修改注册表及注册表权限.我们就从这两方面介绍regini的用法.Regini必须要指定操作脚本,也就是,提前将你要操作的内容写在一个文本文件中 ...