我有一个页面,允许用户下载动态生成的文件。它需要很长时间来生成,因此我想显示一个“等待”指示器。问题是,我无法确定浏览器何时接收到文件,以便我可以隐藏指示器。
我请求一个隐藏表单,POST到服务器,并针对其结果定位到一个隐藏的iframe。这样,我就不会用结果替换整个浏览器窗口。我监听iframe上的“load”事件,希望在下载完成时触发它。
我返回一个带有文件的“
我尝试的一种方法是使用多部分响应。因此,它将发送一个空的HTML文件以及附加的可下载文件。
例如:
这在Firefox中可行;它接收空的HTML文件,触发“load”事件,然后显示可下载文件的“保存”对话框。但在Internet Explorer和Safari上失败了;Internet Explorer触发“load”事件,但不会下载文件,Safari下载文件(带有错误的名称和内容类型),并且不会触发“load”事件。
另一种方法可能是调用以开始创建文件,轮询服务器直到准备就绪,然后下载已经创建的文件。但我宁愿避免在服务器上创建临时文件。
我该怎么办?
我请求一个隐藏表单,POST到服务器,并针对其结果定位到一个隐藏的iframe。这样,我就不会用结果替换整个浏览器窗口。我监听iframe上的“load”事件,希望在下载完成时触发它。
我返回一个带有文件的“
Content-Disposition: attachment
”头,这会导致浏览器显示“保存”对话框。但浏览器不会在iframe中触发“load”事件。我尝试的一种方法是使用多部分响应。因此,它将发送一个空的HTML文件以及附加的可下载文件。
例如:
Content-type: multipart/x-mixed-replace;boundary="abcde"
--abcde
Content-type: text/html
--abcde
Content-type: application/vnd.fdf
Content-Disposition: attachment; filename=foo.fdf
file-content
--abcde
这在Firefox中可行;它接收空的HTML文件,触发“load”事件,然后显示可下载文件的“保存”对话框。但在Internet Explorer和Safari上失败了;Internet Explorer触发“load”事件,但不会下载文件,Safari下载文件(带有错误的名称和内容类型),并且不会触发“load”事件。
另一种方法可能是调用以开始创建文件,轮询服务器直到准备就绪,然后下载已经创建的文件。但我宁愿避免在服务器上创建临时文件。
我该怎么办?