我过去做过的最简单和最可靠的方法是简单地将隐藏的 iFrame 标记与您的表单一起定位 - 然后它将在 iframe 内提交而无需重新加载页面。
也就是说,如果您不想使用插件、JavaScript 或 HTML 以外的任何其他形式的“魔法”。当然,你可以将它与 JavaScript 或你有什么结合起来......
<form target="iframe" action="" method="post" enctype="multipart/form-data">
<input name="file" type="file" />
<input type="button" value="Upload" />
</form>
<iframe name="iframe" id="iframe" style="display:none" ></iframe>
您还可以读取 iframe 的内容以onLoad
了解服务器错误或成功响应,然后将其输出给用户。
Chrome、iFrame 和 onLoad
-注意-如果您对如何在上传/下载时设置 UI 阻止程序感兴趣,您只需要继续阅读
目前,Chrome 在用于传输文件时不会触发 iframe 的 onLoad 事件。Firefox、IE 和 Edge 都会触发文件传输的 onload 事件。
我发现适用于 Chrome 的唯一解决方案是使用 cookie。
基本上在开始上传/下载时做到这一点:
- [Client Side] 启动一个间隔来寻找cookie的存在
- [服务器端] 对文件数据做任何你想做的事
- [服务器端] 为客户端间隔设置 cookie
- [客户端] Interval 看到 cookie 并像 onLoad 事件一样使用它。例如,您可以启动 UI 阻止程序,然后 onLoad(或在制作 cookie 时)删除 UI 阻止程序。
为此使用 cookie 很难看,但它确实有效。
我在下载时为 Chrome 制作了一个 jQuery 插件来处理这个问题,你可以在这里找到
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
同样的基本原则也适用于上传。
使用下载器(显然包括 JS)
$('body').iDownloader({
"onComplete" : function(){
$('#uiBlocker').css('display', 'none'); //hide ui blocker on complete
}
});
$('somebuttion').click( function(){
$('#uiBlocker').css('display', 'block'); //block the UI
$('body').iDownloader('download', 'htttp://example.com/location/of/download');
});
在服务器端,就在传输文件数据之前,创建 cookie
setcookie('iDownloader', true, time() + 30, "/");
插件会看到cookie,然后触发onComplete
回调。