在基于PHP的网站上,我想在填写简短表单后向用户发送下载包.网站启动的下载应该类似于download.com这样的网站,它们说"你的下载将在一瞬间开始".
我知道的几种可能的方法和浏览器兼容性(基于快速测试):
1)window.open
指向新文件.
- FireFox 3 blocks this. - IE6 blocks this. - IE7 blocks this.
2)创建指向新文件的iframe.
- FireFox 3 seems to think this is OK. (Maybe it's because I already accepted it once?) - IE6 blocks this. - IE7 blocks this. How can I do this so that at least these three browsers will not object?
额外奖励:有没有一种方法不需要浏览器条件语句?
(我相信download.com有条件地使用这两种方法,但我不能让任何一种方法工作.)
回应和澄清:
Q: "Why not point the current window to the file?" A: That might work, but in this particular case, I want to show them some other content while their download starts - for example, "would you like to donate to this project?"
更新:我放弃了这种方法.请参阅下面的答案.
您还可以执行元刷新,这是大多数浏览器支持的.Download.com将一个放在一个noscript标签中.
更新:我已经决定放弃这种方法,而只是向用户显示实际文件的链接.我的理由是这样的:
我最初尝试在服务器启动的下载时被浏览器阻止.这让我想到:"浏览器是正确的.它是如何知道这是一个合法的下载?它应该阻止显然不是由用户启动的下载."
我可以用于服务器启动的下载的任何方法也可以由想要发送恶意软件的人使用.因此,只有当用户通过单击文件链接专门请求文件时,才会发生下载.
你可以自由地反对意见,如果你仍想开始下载,希望这个主题可以帮助你做到这一点.
我通常只有一个PHP脚本,可以使用适当的Content-Type将文件直接输出到浏览器
if(file_exists($filename)) { header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, pre-check=0"); header("Cache-Control: private", false); header("Content-Type: " . $content-type); header("Content-Disposition: attachment; filename=\"" . basename($filename) . "\";" ); header("Content-Transfer-Encoding: binary"); header("Content-Length: " . filesize($filename)); readfile("$filename"); }else{ print "ERROR: the file " . basename($filename) . " could not be downloaded because it did not exist."; }
唯一的缺点是,由于这会设置HTTP标头,因此在您有任何其他输出之前会调用它.
但您可以链接到PHP下载页面,这将导致浏览器弹出下载框而不会弄乱当前页面的内容.