Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html Ajax文件下载问题_Html_Ajax_Iframe_Download - Fatal编程技术网

Html Ajax文件下载问题

Html Ajax文件下载问题,html,ajax,iframe,download,Html,Ajax,Iframe,Download,我正在应用程序中下载一个动态文件,使用iframes模拟ajax。我现在做的是,当下载请求发出时,我会创建一个动态的不可见iframe,并将我的iframe的src设置为下载url。我能够成功下载文件,但要求是在下载开始后显示下载指示器,下载对话框一出现就应该结束。我提供了创建iframe后的回调以显示下载指示器,该指示器正在成功工作,并提供了另一种方法来处理iframe的“onload”,期望它会被调用,当下载对话框出现时。但不幸的是,这不起作用,因此即使在下载完成后,我的进度指标仍然存在。我

我正在应用程序中下载一个动态文件,使用iframes模拟ajax。我现在做的是,当下载请求发出时,我会创建一个动态的不可见iframe,并将我的iframe的src设置为下载url。我能够成功下载文件,但要求是在下载开始后显示下载指示器,下载对话框一出现就应该结束。我提供了创建iframe后的回调以显示下载指示器,该指示器正在成功工作,并提供了另一种方法来处理iframe的“onload”,期望它会被调用,当下载对话框出现时。但不幸的是,这不起作用,因此即使在下载完成后,我的进度指标仍然存在。我没办法把它去掉。然后我意识到,由于响应的内容类型不是html,它将由一个单独的进程提供服务,这将导致下载对话框,因为我的onload方法永远不会被调用。请告诉我一个解决方案。

你可以使用flash下载管理器-谷歌将公布一系列的解决方案

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

您需要一种将其写入硬盘的方法,这可以在IE中通过宽松的安全约束和ActiveXObject“Scripting.FileSystemObject”来完成。您可能可以使用数据uri方法:使用base64编码,但我不确定这是否可行

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


如果您知道动态下载的大小,并且规范中不要求精确的时间,那么您可以在下载之前进行internet速度检查,在下载文件所需的计算时间中添加一些缓冲时间,并在给定的时间段内显示对话框。非常老练,但是这个计划似乎有点市场营销需要它,所以它应该是

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


看到这个,它可能会帮助你


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

if ( ( iframe.document && iframe.document.readyState == 'complete' )
    || iframe.contentDocument )
{
    stopTimer();
    closePopupDialog();
}
我创建了()也解决了这个问题,并提供了一些其他不错的特性。它基本上为您提供了一种文件下载的“完整的Ajax式”体验(甚至包括回调),而这在文件下载中通常是不可能的。它的工作原理与使用iframe的其他一些答案非常相似,但有一些很酷的功能,我发现这些功能非常方便:

  • 无论文件下载成功与否,用户都不会离开启动文件下载的页面
  • successCallback和failCallback函数允许您明确了解在这两种情况下的UI行为
  • 结合jQuery UI,开发人员可以轻松地显示一个模式,告诉用户正在进行文件下载,在下载开始后解散该模式,甚至友好地通知用户发生了错误。有关此示例,请参见
下面是一个简单的用例演示,使用带有承诺的插件。其中还包括许多其他“更好的用户体验”示例

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

上面的一个非常接近解决方案,但在我的例子中,readyState在下载后从未达到“完整”状态,它仍然处于“交互式”状态。你知道会出现什么问题吗?只是知道,内容配置在其中起着作用。不幸的是,由于浏览器之间的readyState行为变化无常,请检查此方法不起作用。例如,Chrome永不改变,这就是我一直在寻找的。谢谢!:)