Ajax文件下载问题

时间:2009-10-08 15:58:41

标签: html ajax iframe download

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

5 个答案:

答案 0 :(得分:15)

我创建了jQuery File Download pluginDemo),它还修复了问题并提供了一些其他不错的功能。它基本上为你提供了一个完整的Ajax"文件下载的经验(甚至还有回调),通常不能用于文件下载。它与iframe的其他一些答案非常相似,但有一些很酷的功能,我发现它非常方便:

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

这是一个使用带有promises的插件source的简单用例演示。 demo page包括许多其他更好的用户体验'例子。

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

答案 1 :(得分:2)

看到这一点,它可能会有所帮助

http://bytes.com/topic/javascript/answers/610641-file-download-ajax

答案 2 :(得分:1)

看到这一点,它可能会有所帮助

http://code.msdn.microsoft.com/AjaxFileDownload

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

你可以使用闪存下载管理器 - 谷歌将揭示其中的一大部分。

您的另一个选择是使用真正的AJAX。只需向下载URI发出请求,当您收到响应时,请使用responseBody而不是XMLHTTPRequest对象的responseText属性。

您需要一种方法将其写入硬盘驱动器,这可以在IE中通过宽松的安全约束和ActiveXObject“Scripting.FileSystemObject”完成。您可以使用数据uri方法:http://en.wikipedia.org/wiki/Data_URI_scheme使用base64编码,但我不确定这是否有效。

否则,您将返回闪存,将您通过ajax下载的数据写入磁盘。

如果你知道动态下载的大小并且规范中不需要准确的时间,那么你可以在下载之前进行网速检查,为计算下载文件所需的时间增加一些缓冲时间,只显示给定时间段的对话框。非常hackish,但是这个计划似乎有点营销 - 需要 - 它应该是它应该是