【问题标题】:Is it possible to trigger file download to a user's browser?是否可以触发文件下载到用户的浏览器?
【发布时间】:2012-08-05 17:09:57
【问题描述】:

是否可以强制文件下载到用户的浏览器(当然是标准对话框提示)?由服务器触发。基本上我正在考虑将来自服务器文件系统的文件推送到浏览器。还是因为安全沙箱而无法做到这一点? 如果这是不可能的,是否有其他非常接近此的方法?我不想在未经用户同意的情况下发送文件。我可以想到两步方法,首先提示用户输入数据,然后让用户单击触发下载的确定按钮,但在下载快结束时,用户会得到另一个确认框(要求打开的标准下载提示或保存)。如果能一步到位就好了。

【问题讨论】:

    标签: javascript html ajax json cgi


    【解决方案1】:

    使用每 5 秒或 10 秒轮询一次服务器的 ajax json 脚本, 当服务器准备好文件时,会以肯定回答“我有文件”进行响应,将 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;
        }
    

    【讨论】:

      【解决方案2】:

      既然您知道必须提示用户,请尝试使用带有type="application/octet-stream" 的普通超链接。

      您也可以在标题中使用:"content-disposition: attachment"

      【讨论】:

        【解决方案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);
        ?>
        

        希望这可以作为伪代码很好地帮助您入门。祝你好运!

        【讨论】:

        • 不一定——如果它们在浏览器中,并且您将它们链接到图片(或其他类似资源),它只会让浏览器查看图片。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 1970-01-01
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多