2009-10-08 61 views
6

我正在我的应用程序中下载一个动态文件,使用iframe模拟ajax。我正在做的是,当下载请求完成后,我将创建一个动态的不可见iframe,并将我的iframe的src设置为下载url.I能够成功下载该文件,但要求显示一个下载指示器,一旦下载开始,并应该尽快完成下载对话框。我提供了回调后iframe创建显示下载指示器,它已成功工作,并提供了另一种方法的'onload'的iframe,期待它会在下载对话框出现时被调用。但不幸的是,这是行不通的,因为即使下载完成后,我的进度指标仍然存在。我无法删除它。然后我意识到由于响应的内容类型不是html,因此它将由单独的进程提供服务,这会导致下载对话框,因此我的onload方法永远不会被调用。请让我知道这个解决方案。Ajax文件下载问题

回答

1

你应该在客户端启动一个定时器,当下载请求时,其在指定的时间间隔测试iframe的状态:

if ((iframe.document && iframe.document.readyState == 'complete') 
    || iframe.contentDocument) 
{ 
    stopTimer(); 
    closePopupDialog(); 
} 
+0

以上是一个非常接近解决方案,但在我的情况下,即使下载后,readyState从未达到'完整',它仍然处于'交互'状态。任何想法可能是什么问题? – Bibin

+0

刚刚才知道,内容处置在这方面起着作用。看看** [这](http://www.atalasoft.com/cs/blogs/jake/archive/2009/06/18/events-to-expect-when-dynamically-loading-iframes-in-javascript。 aspx)** – Bibin

+0

这种方法*不幸*不起作用,因为不同浏览器的readyState行为不一致。例如,Chrome从不改变。 –

0

你可以使用一个flash下载管理器 - 谷歌将揭示他们的一大堆。

您的其他选择是使用真正的AJAX。只需向下载URI发出请求,并在获得响应时,使用responseBody而不是XMLHTTPRequest对象的responseText属性。

您需要一种方法将其写入硬盘,这可以在IE安全限制和ActiveXObject“Scripting.FileSystemObject”下完成。您可能可以使用data uri方法:http://en.wikipedia.org/wiki/Data_URI_scheme带有base64编码,但我不确定这是否会起作用。

否则,你回到闪存写你通过ajax下载到磁盘的数据。

如果您知道规格中不需要动态下载的大小和准确的时间安排,那么您可以在下载之前进行互联网速度检查,将一些缓冲时间添加到计算的下载时间文件,并只显示给定时间段的对话框。很hackish的,但话又说回来,这方案似乎有点营销需要,其将要那么它 - 将待

15

我创建了jQuery File Download pluginDemo),它也解决了这个问题并提供了一些其他很好的功能。它基本上为您提供“完整的类似Ajax”的文件下载体验(甚至包含回调),通常不可能用于文件下载。它的工作原理非常类似与一个iframe一些其他的答案,但我发现很方便一些很酷的功能:

  • 用户从来没有离开他们发起了一个文件下载的是否是成功的在同一页或有错误
  • successCallback和failCallback函数允许您明确地了解在任何情况下的UI行为
  • 与jQuery UI相结合,开发人员可以轻松地显示模式,告诉用户正在发生文件下载,解除模式在下载开始后甚至以友好的方式通知用户发生了错误。有关此示例,请参阅Demo

这是一个简单的用例演示,使用带有承诺的插件sourcedemo page还包括许多其他“更好的UX”示例。

$.fileDownload('some/file.pdf') 
    .done(function() { alert('File download a success!'); }) 
    .fail(function() { alert('File download failed!'); });