`

使用iframe模拟ajax上传文件

阅读更多

在不使用ajax插件进行文件时上传时,貌似只能通过form.submit来完成,但是这样就造成了无法及时得到后台返回的结果,虽然可以通过其他机制(如将上传结果通过request输出到页面上的一个隐藏域中等)。如何在只使用form的submit事件以及input[type=file]来完成文件的上传功能,又能在页面刷新前知道后台的处理结果呢?

        可以使用iframe来完成模拟ajax上传文件的功能!

 

<form id="importForm_Talking"  action="importProvinceTalk/${provinceID}?callbackurl=%2fcommon%2fupload_response" method="post" enctype="multipart/form-data"target="check_file_frame">
    <input type="file" name="myFiles_Talking" id="myFiles_Talking" size=1  style="cursor:pointer;opacity:0;filter:alpha(opacity=0);width:1px;position:absolute;left:0;top:0;z-index:9999;" />
 </form>
<iframe id="check_file_frame" name="check_file_frame" style="display:none;"></iframe>


可以看到:

1、为了避免form.submit提交后页面刷新,所以将 form的target属性指向了一个隐藏的iframe。

2、form的action的内容里面有个callback参数,这个参数是干嘛用的呢?来看一下java后台的代码: 

 

	@RequestMapping(value = "/importProvinceTalk/{id}", method = RequestMethod.POST)
	public void importProvinceTalk(@RequestParam("myFiles_Talking") MultipartFile file,
			@PathVariable("id") long provinceId,
			@RequestParam("callbackurl") String callbackurl,
			HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {
                /***省略处理代码***/
		//将导入结果通过中间页面传回导入资源的页面
		String newUrl = callbackurl + "?success=" + result.get("success");
		if(result.get("errmsg") != null){
			newUrl += "&errmsg=" +  URLEncoder.encode(result.get("errmsg").toString(),"utf-8");
		}
		//response.sendRedirect(newUrl);
		RequestDispatcher rDispatcher = request.getRequestDispatcher(newUrl);
		rDispatcher.forward(request, response);

}

 

可以看到,处理结果被传递到了那个callback指向的页面,后台在处理完成后,会将处理结果传送到callback指向的页面。下面来看看callback指向的页面里面有什么内容。

 

	<input type="text"  id="success" name="success" value=<%=request.getParameter("success") %> />
	<input type="text"  id="errmsg" name="errmsg" value=<%=request.getParameter("errmsg") %> />
	<script type="text/javascript">
		var success = document.getElementById("success").value;
		var errmsg = document.getElementById("errmsg").value;
		window.parent.uploadCallBack(success, errmsg);
	</script>

 

java后台将处理结果输出到这个页面上来了,那这个callback页面到底以什么样的形式展现呢?

        没错,这个callback页面就是展示在上面那个隐藏域iframe里面的,所以它能够调用父页面的uploadCallBack方法,来向用户展示处理的结果。

 

 

/**
 * 导入回调函数
 */
function uploadCallBack(success, errmsg) {
	if (success == "true") {
		alert("导入成功!");
		location.reload();
	} else {
		alert(errmsg);
		//隐藏导入等待框
		$("#wait").modal("hide");
		//清楚input-file的value
		$("input[type='file']").val("");
	}
}
 

虽然这个过程有点复杂,但是相对于刷新后再给用户提示上传导入的结果,个人感觉用户体验好多了

很直接的,就是上传文件,然后就知道了操作的结果,然后刷新页面。

 

欢迎大家给出意见!

分享到:
评论

相关推荐

    PHP+iframe模拟Ajax上传文件功能示例

    答案:可以使用iframe模拟Ajax上传文件。接下来博主将使用iframe来模拟Ajax来上传文件。 首先看一下效果图: 文件结构图: 09-iframe-upload.html文件: 页面中有一个表单,表单中有一个上传文件按钮和提交按钮,...

    使用隐藏的Iframe实现ajax无刷新上传

    使用隐藏的Iframe实现Ajax无刷新上传的基本思路是:创建一个隐藏的Iframe作为文件上传的目标,当用户选择文件并提交表单后,表单数据会通过POST方式发送到服务器端处理文件上传操作。由于Iframe的存在,上传过程不会...

    真正实现ajax上传文件 兼容IE6789火狐谷歌世界之窗

    总之,实现Ajax上传文件并兼容各种浏览器是一项技术挑战,但通过合理使用HTML5新特性、旧版IE的特有对象以及适当的兼容性检查,我们可以构建出一个高效且跨浏览器的文件上传系统。无论用户使用的是现代浏览器还是老...

    JSP_模拟AJAX实现无刷新文件上传

    然而,我们可以利用IFRAME(Inline Frame)来模拟实现AJAX式的无刷新文件上传,以达到类似的效果。 首先,我们需要理解AJAX的工作原理。AJAX允许我们在后台与服务器进行通信,更新部分网页内容,而无需刷新整个页面...

    fileUpload(兼容IE的Ajax上传图片)

    3. **兼容性处理**:对于不支持FileReader和FormData的浏览器(如IE8),可能需要使用iframe或者ActiveXObject(XMLHttpRequest的IE特有实现)来模拟Ajax上传。 4. **上传过程**:当文件选择后,使用Ajax发送POST...

    AjaxUpload.rar 文件上传

    AjaxUpload是一种基于JavaScript和Ajax技术实现的异步文件上传方式,它允许用户在不刷新整个网页的情况下上传文件,显著提升了用户体验。AjaxUpload的核心是利用XMLHttpRequest对象与服务器进行交互,通过创建隐藏的...

    js动态创建上传表单通过iframe模拟Ajax实现无刷新

    { //创建iframe var iframe = document.createElement(“iframe”); document.body.appendChild(iframe); iframe.id = ‘iframeName’; iframe.name = ‘iframeName’; iframe.style.display = ‘none’; //创建form...

    ajaxupload在spring mvc4.2中实现简单文件上传

    AjaxUpload是一种利用JavaScript和Ajax技术实现在后台服务器上异步上传文件的方法。它通过创建隐藏的IFrame和表单来模拟文件提交,避免了浏览器对跨域限制的问题,同时利用Ajax进行数据传输,实现无刷新的交互。 2...

    ajax文件上传

    1. **IFrame模拟上传**:由于IE8不支持`FormData`和`XMLHttpRequest2`,我们可以利用IFrame创建一个隐藏的表单,将文件输入字段添加到这个表单中,然后提交表单到服务器。IFrame的`contentDocument`或`contentWindow...

    使用ajaxupload.js/ajaxfileupload.js实现文件上传

    它利用IFrame或者Flash来模拟Ajax上传,确保了较好的兼容性。同样,`ajaxfileupload.js`也提供了丰富的事件回调,如onStart、onComplete、onProgress等,让你能根据实际需求定制上传行为。使用此库时,你需要引入...

    js加iframe轻松实现异步图片上传 可以预览 兼容FF,chrome,ie9

    异步上传,也称为Ajax上传,是指在不刷新整个页面的情况下,通过XMLHttpRequest对象发送请求,后台处理完成后返回结果,这种模式提高了用户体验,因为用户可以在等待上传的同时继续浏览其他内容。 在这个案例中,...

    JAVA实现模拟导入数据/上传文件进度条

    在文件上传进度条场景下,Servlet主要负责接收上传文件的请求,处理文件,并将文件的处理进度反馈给客户端。 接着,JSP(JavaServer Pages)是用来动态生成HTML页面的,它可以嵌入Java代码,使得页面和业务逻辑结合...

    [php]ifame仿ajax图片上传预览,兼容IE\FF\Chrome

    在这个案例中,iframe被用来模拟异步通信,因为古老的IE浏览器(尤其是版本7及以下)不支持Ajax的XMLHttpRequest对象,而iframe可以提供一种替代方式来实现跨域通信和数据交换。 2. **Ajax(异步JavaScript和XML)*...

    frameset 上传文件窗口最小化(未实现)

    标题“frameset 上传文件窗口最小化(未实现)”表明我们正在探讨如何在使用frameset进行文件上传时,尝试实现上传窗口的最小化功能,但这个功能目前尚未实现。 在描述中提到的“对象是如何传递到TOP页面的”,这...

    asp仿163网盘无刷新文件上传

    3. **隐藏IFrame**:由于浏览器的安全限制,直接使用AJAX上传文件并不容易。通常,会利用一个隐藏的IFrame来处理表单提交,这样文件可以被发送到服务器而不会导致页面刷新。 4. **服务器端处理**:`file.asp`可能是...

    jQuery-1.8.3(&2.1.4).min.js&jquery;.fileupload&jquery;.iframe-transport

    由于浏览器的安全策略,某些情况下普通的Ajax上传可能无法工作,这时Iframe Transport通过创建一个隐藏的iframe来模拟表单提交,从而实现跨域和大文件的无刷新上传。这种技术对于那些不支持FormData或XMLHttpRequest...

    ajax图片上传教程+原码

    在网页开发中,图片上传和显示是不可或...尽管AJAX不能直接处理文件上传,但结合IFRAME技术,我们可以模拟出类似的效果,同时保持页面的无刷新特性。在整个过程中,重要的是确保安全性、用户体验和良好的错误处理机制。

    ajaxupload.js

    为确保更广泛的用户支持,可以考虑结合使用如jQuery或其它库,或者采用渐进增强的方式处理不支持Ajax上传的浏览器。 总结来说,AjaxUpload是一个方便的JavaScript库,它通过Ajax实现了无刷新的文件上传,改善了用户...

Global site tag (gtag.js) - Google Analytics