写了一个简单的类似ajax上传文件的功能,原理当然不是真正的通过ajax方式上传,而是利用iframe来做的
这是其中的一种写法:
先来分析一下原理,利用js来创建一个iframe,这个iframe的src指向一个静态页面。这个静态页面当中有一个Form表单
进行提交。后台提交成功后让其运行一个父窗口的js函数,并返回上传成功的文件路径、
先来看js,由于有一些参数是可变的,所以代码上有些混杂.(程序当中为方便,用到了jquery框架)
var Upload = {};
Upload = {
formId:"D_upload_form",
imgURL : "http://www.xxxx.com:8080/img",
action : "/img/upload.htm",
currentFilePath:null,
allFilePath:new Array(),
imgPreDiv:null,
uploadInfo:null,
checkType:2,//默认检测类型为图片格式
imgTemplate:null, //图片显示模板格式
maxNum:5, //最大上传数量
hasUploadNum:0,//已经上传的数量
/**
* 如果需要修改默认参数调用此方法.
*/
setting:function(uploadURL, upladAction, checkType) {
Upload.imgURL = uploadURL || Upload.imgURL;
Upload.action = upladAction || Upload.action;
Upload.checkType = checkType || Upload.checkType;
},
/**
* 创建文件上传
* @param fileID 当前file控件ID
* @param imgListDivId 如果是图片,则可设置图片上传完成后显示的缩略图的位置
* @param infoId 提示用户正在上传的信息所在的标签ID
* @param imgTemplate 图片上传后显示的的格式模板,程序根据此模板自动生成后续的图片样式
*/
createUpload:function(fileID, imgListDivId, infoId, imgTemplate) {
if (typeof($) != "function") {
alert("请导入jquery1.2.6以上版本JS文件");
return;
}
var fileInput = $("#" + fileID);
var iframeWidth = fileInput.parent().css("width") || "250";
var iframeHeight = fileInput.parent().css("height") || "30";
var html = "<iframe frameborder='0' id='D_upload_iframe' scrolling='no' src='" + Upload.imgURL
+ "/html/upload.html' width='" + iframeWidth + "' height='" + iframeHeight + "'></iframe>";
fileInput.parent().html(html);
if (imgListDivId != null || imgListDivId != "") {
Upload.imgPreDiv = $("#" + imgListDivId);
}
if (infoId != null || infoId != "") {
Upload.uploadInfo = $("#" + infoId);
}
if (imgTemplate != null || imgTemplate != "") {
Upload.imgTemplate = $("#" + imgTemplate).html();
}
},
/**
* 供后台程序调用,设置当前上传成功的文件路径
* @param path 上传后的路径
*/
setFilePath:function(path) {
Upload.currentFilePath = path;
Upload.allFilePath.push(path);
//var img = "<img src='" + path + "' alt='上传的图片,可删除'/>";
var img = Upload.imgTemplate.replace("src=\"\"", "src=\"" + path + "\"");
if (Upload.imgPreDiv != null) {
Upload.imgPreDiv.append(img);
}
history.back();
Upload.uploadInfo.hide();
},
/**
* 供后台程序调用,当上传出现错误时弹出错误提示框
* @param error 错误信息
*/
uploadError:function(error) {
alert(error);
history.back();
Upload.uploadInfo.hide();
},
/**
* 获取当前上传的文件路径
*/
getFilePath:function() {
return Upload.currentFilePath;
},
/**
* 显示正在上传信息
*/
showUploadInfo:function() {
Upload.uploadInfo.show();
}
};
上面的JS 方法基本没什么可说的,通过获取当前页面当中的一个input对象,将其替换成一个iframe并保留一些参数
下面来看iframe静态页面内容:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-type" content="text/html;chartset=utf-8"/>
</head>
<body style="padding:0;">
<form style="padding:0;" method="post" action="" enctype="multipart/form-data">
<input type="file" name="fileName" onchange="listernInputChange(this,this.form);"/>
</form>
</body>
<script type="text/javascript">
function iframeLoad() {
if (parent.Upload == null || parent.Upload == "undefined") {
alert("您的设置可能问题,或访问了不该的页面!");
history.back();
} else {
document.forms[0].action = parent.Upload.imgURL + parent.Upload.action;
}
}
function listernInputChange(input, form) {
var form1 = form || document.forms[0];
var pattern = /\.(jpg|jpeg|gif|bmp|png)(\s|$)/i;
if (parent.Upload.checkType == 1) {
pattern = /\.(css)(\s|$)/i;
} else if (parent.Upload.checkType == 3) {
pattern = /\.(swf)(\s|$)/i;
}
var url = input.value;
if (parent.Upload.hasUploadNum < parent.Upload.maxNum) {
if (!pattern.test(url)) {
alert("上传的文件格式不正确");
} else {
parent.Upload.showUploadInfo();
form1.submit();
}
parent.Upload.hasUploadNum++;
} else {
alert("已达到最大上传数量,不可以再上传");
}
}
iframeLoad();
</script>
</html>
iframe页面当中,做了如下事:
1:获取父窗口当中传入的action路径
2:获取用户设置的最大上传数量及上传的文件类型
3:监听浏览按钮的change事件进行表单提交
整个页面调用了父窗口当中的JS函数来获取相关的参数
现在来看后台代码:
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
String imgPath = "";
String sectionPath = "";
String fileName = "";
StringBuffer uploadError = null;
try {
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
//获取当前项目所在的绝对路径
if (DStringUtil.isEmpty(UploadCtrl.CONTEXT_PATH)) {
UploadCtrl.CONTEXT_PATH = request.getSession().getServletContext().getRealPath("/");
}
//文件保存路径
String path = request.getParameter("savePath");
//检测类型
String checkType = request.getParameter("checkType");
//默认检测的文件类型为图片格式,可以设置指定类型
byte cType = UploadUtil.IMG_TYPE;
if (DStringUtil.isEmpty(path)) {
path = ConfigUtil.DEFAULT_IMG_PATH;
}
if ((!DStringUtil.isEmpty(checkType)) && DStringUtil.isNumber(checkType)) {
cType = Byte.valueOf(checkType);
}
sectionPath = UploadCtrl.CONTEXT_PATH + path;
uploadError = new StringBuffer(); //保存上传当中的错误信息,有错误时,不回滚
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile file = multipartRequest.getFile("fileName");
if (file.getSize() > 0) {
String error = UploadUtil.checkFileExt_SIZE(file, cType, ConfigUtil.MAX_IMG_50K);
if (DStringUtil.isEmpty(error)) {
imgPath = UploadUtil.uploadTempFile(sectionPath, file, CreateCode.getCode());
fileName = imgPath;
imgPath = imgURL + path + "/" + imgPath;
}
uploadError.append(error);
}
if (uploadError.length() == 0) {
//插入图片
out.println("<html>");
out.println("<head>");
out.println("<title>Insert Image</title>");
out.println("<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">");
out.println("</head>");
out.println("<body>");
out.println("<script type=\"text/javascript\">parent.Upload.setFilePath(\"" + imgPath + "\")</script>");
out.println("</body>");
out.println("</html>");
} else {
out.println("<html>");
out.println("<head>");
out.println("<title>error</title>");
out.println("<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">");
out.println("</head>");
out.println("<body>");
out.println("<script type=\"text/javascript\">parent.Upload.uploadError(\"" + uploadError.toString() + "\");</script>");
out.println("</body>");
out.println("</html>");
}
} catch (Exception e) {
logger.error("上传图片:" + e);
if (!DStringUtil.isEmpty(imgPath)) {
UploadUtil.deleteFile(sectionPath + "/" + fileName);
}
throw e;
} finally {
if (uploadError != null && !DStringUtil.isEmpty(uploadError.toString())) {
UploadUtil.deleteFile(sectionPath + "/" + fileName);
}
}
return null;
}
以上代码当中用了一些工具类,在这里并未给出,重点的是看后面上传成功后如果让其将路径返回给父窗口
查看其中的红色代码,这里利用response写入一段代码,并让其运行父窗口当中的方法,通过传参的方式,将文件路径告之父窗口。
来看演示HTML:
<script type="text/javascript">
$(function() {
//创建上传文件,及处理上传成功后的操作
Upload.createUpload("imgFile", "imgList", "D_upload_label_info", "ImageTemplate");
//Upload.createUpload("imgFile2", "imgList2", "", "");
});
</script>
<%--图片显示模板格式--%>
<div id="ImageTemplate">
<div>
<img src="" alt="图片位置"/></div>
</div>
<%--图片显示位置--%>
<div id="imgList" style="height:150px;">
</div>
<div style="height:30px;">
<%--只是一个占位符--%>
<input id="imgFile" type="file" name="imgFile"/>
</div>
<div>
<label id="D_upload_label_info" style="display:none;">正在上传....</label>
</div>
<div>
<input id="imgFile2" type="file" name="imgFile"/>
</div>
<%--图片显示位置--%>
<div id="imgList2" style="height:150px;">
</div>
以上就是整个上传的过程。
不足之处:目前在同一个页面只能有一个上传的文件选择框,不能有多个不同提交路径及不同参数的上传框。
分享到:
相关推荐
本示例“ajax+jquery+flash进度条的文件图片上传完返回上传路劲完美例子”着重展示了如何结合AJAX、jQuery和Flash技术实现一个高效的文件上传功能,特别是针对图片文件,并且具有进度条显示以及解决乱码问题。...
这里我们讨论的是“伪Ajax文件上传”这一主题,它主要针对JavaScript实现的文件上传功能,特别是考虑了对Firefox和IE8浏览器的兼容性。 文件上传在Web应用中是一个常见的需求,传统方式通常是通过表单提交,页面会...
针对超大文件上传的需求,开发者通常需要采取一些策略来优化和扩展这一功能,同时加入进度条显示可以提升用户体验。 标题中提到的"asp.net 超大文件上传,带进度条源码",主要涉及以下知识点: 1. **文件分块上传**...
【标题】"带进度条大文件上传源码(单文件多文件都可以传) v2.0.rar" 提供的是一个基于.Net技术实现的文件上传解决方案,特别针对大文件和批量文件上传进行了优化,并且带有进度条显示,为用户提供更好的交互体验。...
在IT行业中,大文件上传和处理是一个常见的挑战,特别是在视频分享和云存储服务中。"大文件分片上传,大视频等.zip" 这个压缩包文件提供了针对此类问题的一个解决方案,它涉及到HTML、PHP以及可能的前端JavaScript...
"仿163网盘无刷新文件上传 for Jsp"是一个针对JSP(JavaServer Pages)开发的项目,旨在实现类似网易163网盘的无刷新文件上传体验。这个项目的核心目标是提供一个用户友好的界面,允许用户在不刷新整个页面的情况下...
ASP.NET 2.0 AJAX Extensions是微软为.NET Framework 2.0引入的一个重要组件,旨在增强Web应用程序的用户体验,通过实现部分页面更新(Partial Page Rendering)和异步交互,提供与JavaScript库(如Prototype或...
本项目“仿163网盘无刷新文件上传 for JSP”就是针对这一需求而设计的,主要利用JavaServer Pages(JSP)技术实现,结合前端JavaScript和Ajax技术,实现文件的异步上传。 首先,我们需要理解JSP的基本概念。JSP是...
默认的Progress.aspx页面就是ProgressPage的一个实例,它通过数据绑定表达式与UploadHttpModule通信,更新DetailsSpan和DetailsDiv控件,实现AJAX无刷新更新。 使用NeatUpload需要满足以下条件: 1. .NET Framework...
这个java版的头像上传裁剪功能是针对.NET版本的一个补充,提供了完整的Java实现方案。下面我们将详细探讨相关的知识点。 1. **文件上传** 文件上传通常使用Servlet API或者第三方库如Apache Commons FileUpload来...
【标题】"基于PHP的仿163网盘无刷新文件上传 for Php.zip"是一个针对PHP开发者的资源,旨在实现类似163网盘的无刷新文件上传功能。这一技术通常涉及前端与后端的交互,以提供用户友好的、流畅的文件上传体验,而无需...
2. **AjaxFileUpload**:提供了一个支持多文件上传的控件,用户可以选择多个文件并异步上传,无需等待页面刷新。 3. **AutoCompleteExtender**:类似于搜索引擎的自动填充功能,用户在输入框中输入时,控件会根据...
【标题】"基于ASP的进度条上传文件系统"是一个针对Web开发的项目,它利用了Active Server Pages(ASP)技术来实现文件上传功能,并且在上传过程中提供了进度条展示,提高了用户体验。ASP是Microsoft推出的一种服务器...
这个项目的核心目标是提供一个类似于163网盘的用户体验,即在不刷新整个页面的情况下完成文件上传操作,提升了用户的交互体验。 在JSP(JavaServer Pages)中,文件上传功能通常通过Apache的Commons FileUpload库来...
【标题】"仿126风格的附件上传"是一个针对多附件异步上传功能的实现,它借鉴了126邮箱的用户界面和交互设计,旨在提供一种友好且高效的文件上传体验。这一技术通常用于网站或应用中,让用户能够方便地上传多个文件,...
针对这个漏洞,修复建议包括:首先,应该增加上传页面的认证机制,只允许特定的用户或经过身份验证的用户进行文件上传;其次,应限制上传目录的执行权限,防止上传的脚本被直接执行。这样的修复措施可以有效地防止...
综上所述,"仿qq相册源码ajax_js"是一个利用AJAX和JavaScript技术实现的动态相册系统,它通过模仿QQ相册的特性,提供了一种无刷新、交互性强的图片浏览和管理体验。这个源码对于学习和实践Web前端开发,尤其是AJAX和...
【标题】"jsp头像上传仿flash效果"指的是在JavaServer Pages (JSP) 中实现一个用户头像上传的功能,并且这个功能在视觉效果上模仿了经典的Flash技术。Flash曾经是网页动态效果和多媒体交互的主要工具,但在现代网页...
总的来说,"兼容ie8的上传源码"是一个针对旧版浏览器的文件上传解决方案,它利用了当时的技术,如IFrame、ActiveX控件,以及传统的表单提交,以实现与现代浏览器类似的功能。理解并分析这样的源码可以帮助我们更好地...
Struts2框架简化了开发流程,支持拦截器、文件上传、国际化等功能。 3. **Spring**: - Spring是一个轻量级的Java EE全栈框架,提供了丰富的功能集,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等。Spring...