检测文件是否已提供给浏览器?..有点

时间:2009-09-09 14:25:47

标签: javascript savefiledialog

我有一个按钮,它将window.location设置为php文件,生成一个Feed然后下载。但是,由于文件的大小不同,由于数据放入了Feed中,因此从点击按钮到弹出的文件对话框有时需要一段时间。

我希望能够做的是单击按钮并显示loading.gif,直到对话框/文件完成。

任何想法都会很酷!

干杯

7 个答案:

答案 0 :(得分:5)

我不确定为什么你需要检查文件的大小?如果你使用ajax动态地执行get / post,并且你正在做的就是在发生这种情况时尝试显示加载图标,那么抛出异步活动指示器就相当简单了。例如,使用jquery:

$("#loading").ajaxStart(function(){
   $(this).show();
});

$("#loading").ajaxStop(function(){
   $(this).hide();
});

$("#feeds").load("feeds.php?id=89734258972347895");

上面的代码设置一个id为“loading”的DOM对象,以便在启动和停止任何异步请求时显示和隐藏。 .load(url)将url的内容加载到div #feeds中。如果您使用php设置content-disposition:attachment标头,它将自动启动文件下载窗口,即使它已异步加载到div中。这也是可能的,当然没有jquery,只有一堆浏览器兼容性javascript,它不像简单订阅ajaxStart和ajaxStop事件那样容易显示和隐藏你的加载img。

约什

答案 1 :(得分:1)

在设置window.location之前,你可以用你的gif

显示一个隐藏的div

答案 2 :(得分:1)

这是旧学校,但这可以通过服务器推送轻松完成

<?php
  $separator = "end_of_section_marker";
  header('Content-type: multipart/x-mixed-replace;boundary=$separator');
  print "\n--$separator\n";
  print "Content-type: text/html\n\n";
  // Send placeholder message here
  print "--$separator\n";
  ob_flush();
  flush();
  // Start long processing here
  print "Content-type: text/html\n\n";
  // send data here
  print "--$separator--\n";
?>

只需调整您要发送的数据的内容类型即可。 $ separator可以是任何值,只要它不会出现在正在发送的数据中。

答案 3 :(得分:1)

我过去使用过的方法就是这样......

  • 将window.location设置为加载页面,并在查询字符串中传递目标页面。加载页面应显示动画gif或您希望演示正在进行处理的任何内容。加载页面应立即重定向到查询字符串中传递的目标页面(以及任何其他适用的查询字符串参数)。

编辑:加载页面应使用javascript重定向到目标页面(将window.location设置为查询字符串中提供的URL)。这一点非常重要,因为如果您在服务器端重定向,则不会显示加载页面。

编辑2:如果您的加载页面是一个php文件,您可以检查要下载的文件的大小,并向用户显示估计的下载时间(以及动画“加载”gif)或诸如此类的东西。

  • 目标页面应在启用缓冲的情况下呈现(在呈现任何内容之前调用ob_start())。启用缓冲后,在呈现整个页面之前不会向浏览器发送任何内容。同时,您将继续显示步骤1中的加载页面。

答案 4 :(得分:0)

您必须使用AJAX与服务器通信才能发现正在下载的文件的确切大小。然后你有一些东西需要测试。无法从客户端知道预期有效负载的大小。

答案 5 :(得分:0)

您是否可以使用iframe加载Feed,然后使用间隔检查iframe /文档的readyState?所以过程将是:

  • 加载一个窗口,其中包含宽度和高度为100%的iframe以及iframe上的loading.gif。
  • 设置计时器,检查iframe.contentWindow.document.readyState属性
  • readyState ==完成后,显示保存文件对话框。

一个缺点是,对于大多数浏览器而言,PHP文件需要位于同一个域中(在IE上,您只需检查iframe的readyState属性)。

答案 6 :(得分:0)

只需让RSS生成脚本显示您想要的图像(输出图像的HTML,然后刷新输出缓冲区并开始生成数据)。在数据生成结束时:

<?php
print '<script>window.location = "http://www.newlocation.com"</script>'

这就是全部。