在不使用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("");
}
}
虽然这个过程有点复杂,但是相对于刷新后再给用户提示上传导入的结果,个人感觉用户体验好多了
很直接的,就是上传文件,然后就知道了操作的结果,然后刷新页面。
欢迎大家给出意见!
分享到:
相关推荐
答案:可以使用iframe模拟Ajax上传文件。接下来博主将使用iframe来模拟Ajax来上传文件。 首先看一下效果图: 文件结构图: 09-iframe-upload.html文件: 页面中有一个表单,表单中有一个上传文件按钮和提交按钮,...
使用隐藏的Iframe实现Ajax无刷新上传的基本思路是:创建一个隐藏的Iframe作为文件上传的目标,当用户选择文件并提交表单后,表单数据会通过POST方式发送到服务器端处理文件上传操作。由于Iframe的存在,上传过程不会...
总之,实现Ajax上传文件并兼容各种浏览器是一项技术挑战,但通过合理使用HTML5新特性、旧版IE的特有对象以及适当的兼容性检查,我们可以构建出一个高效且跨浏览器的文件上传系统。无论用户使用的是现代浏览器还是老...
然而,我们可以利用IFRAME(Inline Frame)来模拟实现AJAX式的无刷新文件上传,以达到类似的效果。 首先,我们需要理解AJAX的工作原理。AJAX允许我们在后台与服务器进行通信,更新部分网页内容,而无需刷新整个页面...
3. **兼容性处理**:对于不支持FileReader和FormData的浏览器(如IE8),可能需要使用iframe或者ActiveXObject(XMLHttpRequest的IE特有实现)来模拟Ajax上传。 4. **上传过程**:当文件选择后,使用Ajax发送POST...
AjaxUpload是一种基于JavaScript和Ajax技术实现的异步文件上传方式,它允许用户在不刷新整个网页的情况下上传文件,显著提升了用户体验。AjaxUpload的核心是利用XMLHttpRequest对象与服务器进行交互,通过创建隐藏的...
{ //创建iframe var iframe = document.createElement(“iframe”); document.body.appendChild(iframe); iframe.id = ‘iframeName’; iframe.name = ‘iframeName’; iframe.style.display = ‘none’; //创建form...
AjaxUpload是一种利用JavaScript和Ajax技术实现在后台服务器上异步上传文件的方法。它通过创建隐藏的IFrame和表单来模拟文件提交,避免了浏览器对跨域限制的问题,同时利用Ajax进行数据传输,实现无刷新的交互。 2...
1. **IFrame模拟上传**:由于IE8不支持`FormData`和`XMLHttpRequest2`,我们可以利用IFrame创建一个隐藏的表单,将文件输入字段添加到这个表单中,然后提交表单到服务器。IFrame的`contentDocument`或`contentWindow...
它利用IFrame或者Flash来模拟Ajax上传,确保了较好的兼容性。同样,`ajaxfileupload.js`也提供了丰富的事件回调,如onStart、onComplete、onProgress等,让你能根据实际需求定制上传行为。使用此库时,你需要引入...
异步上传,也称为Ajax上传,是指在不刷新整个页面的情况下,通过XMLHttpRequest对象发送请求,后台处理完成后返回结果,这种模式提高了用户体验,因为用户可以在等待上传的同时继续浏览其他内容。 在这个案例中,...
在文件上传进度条场景下,Servlet主要负责接收上传文件的请求,处理文件,并将文件的处理进度反馈给客户端。 接着,JSP(JavaServer Pages)是用来动态生成HTML页面的,它可以嵌入Java代码,使得页面和业务逻辑结合...
在这个案例中,iframe被用来模拟异步通信,因为古老的IE浏览器(尤其是版本7及以下)不支持Ajax的XMLHttpRequest对象,而iframe可以提供一种替代方式来实现跨域通信和数据交换。 2. **Ajax(异步JavaScript和XML)*...
标题“frameset 上传文件窗口最小化(未实现)”表明我们正在探讨如何在使用frameset进行文件上传时,尝试实现上传窗口的最小化功能,但这个功能目前尚未实现。 在描述中提到的“对象是如何传递到TOP页面的”,这...
3. **隐藏IFrame**:由于浏览器的安全限制,直接使用AJAX上传文件并不容易。通常,会利用一个隐藏的IFrame来处理表单提交,这样文件可以被发送到服务器而不会导致页面刷新。 4. **服务器端处理**:`file.asp`可能是...
由于浏览器的安全策略,某些情况下普通的Ajax上传可能无法工作,这时Iframe Transport通过创建一个隐藏的iframe来模拟表单提交,从而实现跨域和大文件的无刷新上传。这种技术对于那些不支持FormData或XMLHttpRequest...
在网页开发中,图片上传和显示是不可或...尽管AJAX不能直接处理文件上传,但结合IFRAME技术,我们可以模拟出类似的效果,同时保持页面的无刷新特性。在整个过程中,重要的是确保安全性、用户体验和良好的错误处理机制。
为确保更广泛的用户支持,可以考虑结合使用如jQuery或其它库,或者采用渐进增强的方式处理不支持Ajax上传的浏览器。 总结来说,AjaxUpload是一个方便的JavaScript库,它通过Ajax实现了无刷新的文件上传,改善了用户...