是否可以触发文件下载到用户的浏览器

Is it possible to trigger file download to a user's browser?

本文关键字:用户 浏览器 文件下载 是否      更新时间:2023-09-26

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

使用每 5 秒或 10 秒轮询一次服务器的 ajax json 脚本,当服务器准备好文件时,响应肯定的答案"我有一个文件",将 iframe 移动到文件所在的 URL,然后将其作为正常下载处理。

提供了一个小例子,说明我应该如何认为它应该工作,所以你有一些工作要做。不过,我还没有检查它是否有错误,它更像是一个概念证明的东西。

jQuery example(不带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;
    }

这绝对是可能的。假设您希望由服务器触发此操作,则只需向他们发送此标头:

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);
?>

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

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

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