能否触发文件下载到用户浏览器?

3
能否强制用户在浏览器上下载文件(当然要用标准的对话框提示)?由服务器触发。基本上,我想推送一个来自服务器文件系统的文件到浏览器。或者,由于安全沙箱的限制,这不可能吗?
如果不可能,是否有与此非常接近的其他方法?我不想在未经用户同意的情况下发送文件。我能想到一种两步法,首先提示用户有即将到来的数据,并让用户单击“确定”按钮触发下载,但在下载接近结束时,用户会得到另一个确认框(标准的下载提示,询问是打开还是保存)。如果能在一步中完成就更好了。
3个回答

3

这是完全可以实现的。假设您希望服务器触发此操作,您只需要向其发送以下标头:

Location: http://www.foo.com/path/to/file

其中foo.com是您的域名,它包含文件的路径。 这将使用户链接到您的文件并自动下载。

现在,为了解决浏览器查看内容的问题,您需要使用服务器端代码发出Content头信息,例如(以PHP为例):

<?php
    header("Content-Type: application/octet-stream");
    header("Content-Length: " . filesize($file));   
    header('Content-Disposition: attachment; filename=' . $file); 
    readfile($file);
?>

希望这个伪代码足够好,可以让你开始工作。祝你好运!

不一定-如果它们在浏览器中,并且您将它们链接到图片(或其他可比较的资源),它只会让浏览器查看图片。 - Waleed Khan

3
使用一个ajax json脚本,每5秒或10秒轮询服务器,当服务器准备好文件时,回复一个肯定的答案“我有一个文件”,让iframe移动到文件所在的url,然后它被视为正常下载。
我提供了一个小例子,展示了它应该如何工作,这样你就有东西可以参考了。虽然我没有检查过它是否有漏洞,但它更多是一个概念证明。
jQuery示例(不含json):
$.ajax('/myserverscript.php?fileready=needtoknow').done(function(data) 
    {
    if(data.indexOf("I have a file") != -1)
        {
        xdata = data.split('\n');
        data = xdata[1];
        document.getElementById('myiframe').location.href = data;
        }
    });

PHP 代码

$x = filecheckingfunction();// returns false if none, returns url if there is a file
if($x !== false)
    {
    echo 'I have a file\n';
    echo $x;
    }

0

因为你知道你必须提示用户,所以尝试使用一个带有type="application/octet-stream"的普通超链接。

你也可以在头部中使用:"content-disposition: attachment"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接