form、iframe实现异步上传文件
转载自:http://blog.csdn.net/sunjing21/article/details/4779321
实现主要功能:
- 页面提供一个上传图片的input file选择框,用于上传某一类型的数张图片
- 每次选择完本地图片后,图片便异步存储到后台的文件夹中;
- 并将路径信息存储到数据库中;
- 页面上显示此图的缩略图,并在旁边显示一个删除标记,当点击时,将此图片从页面、数据库、后台的文件夹中删除
- input file选择框清空,再点击用于上传下一张图片;
JSP页面编写如下:
<div>
<form action="uploadWaiguanImage.do" id="waiguan_form" name="waiguan_form"
enctype="multipart/form-data" method="post" target="waiguan_hidden_frame">
<span>
<label>外观图</label>
<img src="data:images/addImage.JPG">
<input type="file" id="waiguan_add" name="waiguan_add"/>
</span>
<iframe name="waiguan_hidden_frame" id="waiguan_hidden_frame" style="display:none"></iframe>
<c:forEach var="x" begin="1" end="3" step="1">
<span>
<img id="waiguan_image${x }" style="visibility:hidden" src="" width="100" alt="外观图${x }"/>
<img id="waiguan_delete_image${x }" style="visibility:hidden;cursor: pointer" src="data:images/deleteImage.JPG"/>
</span>
</c:forEach>
</form>
</div>
让form的target值为iframe,当form提交的时候,是异步iframe进行提交,不会影响页面的其他部分。
c:forEach部分是首先隐藏了上传后显示的图片标签和删除标签(这里最大可以上传三张)
相应的JS代码:采用的是JQuery写的,不过写的很啰嗦,有点像是原始JS操作
/**
* 页面加载时完成操作
*/
$(document).ready(function() {
// 设置上传外观图
$("#waiguan_add").bind("change", function() {
submitImage("waiguan", 3);
});
} /**
* 上传图片
*
* @param {}
* para_name 图片所属属性名
* @param {}
* number 此类图片的总数量
*/
function submitImage(para_name, number) {
var para_form = para_name + "_form";
var para_image = para_name + "_image"; // alert(para_image); for (var i = 1; i <= number; i++) {
var srcValue = $("#" + para_image + i).attr("src");
// alert(srcValue);
// alert(srcValue.length);
if (srcValue == "" || srcValue.length == 0) {
// alert("break");
break;
}
} if (i > number) {
alert("已超过了此类图的上传最大限");
// 重置上传按钮,使之为空
resetUploadBotton(para_name + "_add");
} else { $("#" + para_form).submit();
}
} /**
* iframe上传外观图片的返回操作
*
* @param {}
* msg 返回的图片所在地址
*/
function callbackWaiguan(msg) { if (msg != "error") {
for (var i = 1; i <= 3; i++) {
var srcValue = $("#waiguan_image" + i).attr("src");
// alert(srcValue);
if (srcValue == "" || srcValue.length == 0) {
$("#waiguan_image" + i).attr("src", msg);
$("#waiguan_image" + i).css("visibility", "visible");
$("#waiguan_delete_image" + i).css("visibility", "visible");
$("#waiguan_delete_image" + i).click(function() { deleteImage("waiguan", i); });
break;
}
}
} else {
alert("上传图片失败,后台程序出现问题!");
} // 重置上传按钮,使之为空
resetUploadBotton("waiguan_add");
} /**
* 删除某个图片时的异步操作
*
* @param {}
* para_name
* @param {}
* number
*/
function deleteImage(para_name, number) {
var delete_image_id = para_name + "_image" + number;
var imagePathName = $("#" + delete_image_id).attr("src"); if (para_name == "waiguan") { $.get("deleteWaiguanImage.do", {
deleteFile : imagePathName,
t : Math.random()
}, function(tag) { alert(tag);
if (tag == "true") {
$("#" + delete_image_id).attr("src", "");
$("#" + delete_image_id).css("visibility", "hidden");
$("#" + para_name + "_delete_image" + number).css("visibility",
"hidden");
} else {
alert("连接数据库失败,无法删除该图片!");
}
});
}
} /**
* 重置上传按钮,使之为空
*
* @param {}
* para_name_add
*/
function resetUploadBotton(para_name_add) {
var form = document.createElement("form");
var span = document.createElement("span");
var para_image_file = document.getElementById(para_name_add);
para_image_file.parentNode.insertBefore(span, para_image_file);
form.appendChild(para_image_file);
form.reset();
span.parentNode.insertBefore(para_image_file, span);
span.parentNode.removeChild(span);
form.parentNode.removeChild(form); }
上传图片采用的是定义的form的submit()提交,iframe的异步提交。
返回操作将image的src的值,置为刚upload的图片在webroot中的位置,这样就能显示图片了。
删除图片时,利用Ajax将要删除的图片路径发送到后台,进行删除,删除成功时,将页面html中image的src值置为空。
后台处理的方法如下:
/**
* 初始化SmartUpload类,用于上传文件
*
* @param servlet
* @return SmartUpload
* @throws ServletException
* @throws IOException
* @throws SQLException
*/
public SmartUpload initSmartUpload(ActionServlet servlet)
throws ServletException, IOException, SQLException {
// 新建一个SmartUpload对象
SmartUpload su = new SmartUpload(); javax.servlet.jsp.PageContext pageContext = JspFactory
.getDefaultFactory().getPageContext(servlet, request, response,
null, true, 8192, true);
// 上传初始化
su.initialize(pageContext); // 设定上传限制
// 1.限制每个上传文件的最大长度。
su.setMaxFileSize(10000000); // 2.限制总上传数据的长度。
su.setTotalMaxFileSize(20000000); // 3.设定允许上传的文件
su.setAllowedFilesList("jpg,gif,bmp,pcx,"
+ "tiff,jpeg,tga,exif,fpx,cad"); // 4.设定禁止上传的文件
su.setDeniedFilesList("exe,bat,jsp,htm,html"); return su;
} /**
* 异步上传外观图
*
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward uploadWaiguanImage(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception { SeriesService seriesService = ServiceFactory.getSeriesService(request,
response); String filePathName = null; boolean tag= true;
try {
//初始化SmartUpload对象
SmartUpload su = seriesService.initSmartUpload(this.getServlet());
//上传外观图,将文件存储在filePath中,遍历系列对象的外观图属性,将图片的位置存储在某一空的属性中
filePathName = "upload/" + seriesService.addWaiguanImage(su); } catch (Exception e) {
e.printStackTrace();
tag = false;
} PrintWriter out = response.getWriter();
if (tag == true) {
out.println("<script>parent.callbackWaiguan('" + filePathName
+ "')</script>");
} else {
out.println("<script>parent.callbackWaiguan('error')</script>");
} return null;
} /**
* 异步删除某个外观图
*
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward deleteWaiguanImage(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
Integer seriesID = (Integer) request.getSession().getAttribute(
"seriesID");
String filePathName = (String) request.getParameter("deleteFile"); SeriesService seriesService = ServiceFactory.getSeriesService(request,
response);
boolean tag = true;
try {
//从数据库中和文件路径中删除外观图
tag = seriesService.deleteWaiguanImage(filePathName, seriesID);
} catch (Exception e) {
e.printStackTrace();
tag = false;
} PrintWriter out = response.getWriter(); out.write(new Boolean(tag).toString()); return null;
}
这样,便完成了要实现的功能。
form、iframe实现异步上传文件的更多相关文章
- 利用jquery.form实现异步上传文件
实现原理 目前需要在一个页面实现多个地方调用上传控件上传文件,并且必须是异步上传.思考半天,想到通过创建动态表单包裹上传文件域,利用jquery.form实现异步提交表单,从而达到异步上传的目的,在上 ...
- Asp.Net Mvc异步上传文件的方式
今天试了下mvc自带的ajax,发现上传文件时后端action接收不到文件, Request.Files和HttpPostedFileBase都接收不到.....后来搜索了下才知道mvc自带的Ajax ...
- jquery ajaxFileUpload异步上传文件
ajaxFileUpload.js 很多同名的,因为做出来一个很容易. 我用的是这个:https://github.com/carlcarl/AjaxFileUpload 下载地址在这里:http:/ ...
- Jquery异步上传文件
我想通过jQuery异步上传文件,这是我的HTML: 1 2 3 <span>File</span> <input type="file" id=&q ...
- Servlet异步上传文件
这里需要用到插件ajaxfileupload.js,jar包:commons-fileupload-1.3.2.jar,commons-io-2.5.jar 注意红色部分的字!!!! 1.创建一个we ...
- struts2 jquery ajaxFileUpload 异步上传文件
网上搜集的,整理一下. 一.ajaxFileUpload 实现异步上传文件利用到了ajaxFileUpload.js这个文件,这是别人开发的一个jquery的插件,可以实现文件的上传并能够和strut ...
- 关于js异步上传文件
好久没登录博客园了,今天来一发分享. 最近项目里有个需求,上传文件(好吧,这种需求很常见,这也不是第一次遇到了).当时第一想法就是直接用form表单提交(原谅我以前就是这么干的),不过表单里不仅有文件 ...
- 【转】JQuery插件ajaxFileUpload 异步上传文件(PHP版)
前几天想在手机端做个异步上传图片的功能,平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错,但是由于手机不支持flash,所以不得不再找一个文件上传插件来用了.后来发现a ...
- 异步上传文件,ajax上传文件,jQuery插件之ajaxFileUpload
http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html 一.ajaxFileUpload是一个异步上传文件的jQuery插件. ...
随机推荐
- 大熊君大话NodeJS之------Stream模块
一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流是可读,可写或兼具两者的. 最早接触Stream是从早期的un ...
- 2015年11月30日 spring初级知识讲解(一)装配Bean
序,Spring的依赖注入是学习spring的基础.IOC为控制反转,意思是需要的时候就由spring生成一个,而不是先生成再使用. 写在前面 Spring提供面向接口编程,面向接口编程与依赖注入协作 ...
- jQuery属性选择器.attr()和.prop()两种方法
在判断表单单选框是否被选中时,通常会想到使用$('#checkbox').attr('checked')来判断,但在一些情况下,你会发现这种方法并不管用,得到的是undefined. 原来jQuery ...
- 【学习】一本案例驱动的jQuery Mobile入门书
清华大学出版社推出的<构建跨平台APP:jQuery Mobile移动应用实战> 提供的全是jQuery Mobile的案例: 手机入侵 题库应用 音乐专辑 通讯录 新闻列表 销售排名 九 ...
- Redis学习笔记五:独立功能之事务
Redis 事务提供了一种将多个命令请求打包,然后一次性.按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断,会将事务中的所以命令都执行完毕才去处理其他客户端的命令请求. 事务的实现 事务 ...
- Redhat EL安装curses
1.下载curses安装包 http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.6.tar.gz2. tar -zxvf nurses-5.6.tar.gz 3 ...
- Effective Java 读书笔记之十 序列化
一.谨慎地实现Serializable接口 1.一旦一个类被发布,就大大地降低了“改变这个类的实现”的灵活性. 2.仔细设计类的序列化形式而不是接受类的默认虚拟化形式. 3.反序列化机制是一个“隐藏的 ...
- BZOJ3223——Tyvj 1729 文艺平衡树
1.题目大意:维护序列,只有区间翻转这个操作 2.分析:splay的经典操作就是实现区间翻转,就是在splay中有一个标记,表示这个区间被翻转了 然后就是记得各种的操作访问某个点时,记得下传,顺便交换 ...
- [codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案
[codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案 试题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴 ...
- COGS 2479 偏序 题解
[题意] 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于30%的 ...