如何强制浏览器下载任何类型的文件而不是打开它

时间:2019-03-25 12:45:11

标签: javascript

需要从浏览器下载任何类型的文件。从后端呈现asp.net页面后,URL(外部服务器)的路径可以动态更改,因此我只能使用Javascript下载每个文件。

对于pdf,mp4,xml,xls,doc,jpg,png,png,浏览器打开文件而不是下载。

我使用的是HTML5“下载”属性,但在最新更新之一后无法使用。

也尝试过XMLHttpRequest创建blob文件,然后下载但不起作用

我最后一次尝试是使用download.js库,这似乎是壁橱解决方案,但它只是下载空文件...

<script src="~/js/download.js"></script>

 function download_mp4(url) {               
    download('', url, 'video/mp4');
 }

该库的源代码在这里:

http://danml.com/download.html#Download

已经研究了他们建议的旧帖子,因为浏览器已经更改了打开/下载文件的方式,并且无法从服务器代码下载,因为其他情况只是发送了适当的标头,所以


编辑:

我通过这种方式(JS代码)解决了此问题:

function downloadFile(file_location, filename) {

    const download_server = "https://www.myserver.com/index.php";
    var encoded_url = btoa(file_location);
    window.location = download_server + "?url=" + encoded_url + "&title=" + filename;

}

PHP文件代码:

<?php
$url = base64_decode(filter_var($_GET['url']));
$title = urldecode($_GET['title']);

downloadFile($url,$title);

function downloadFile($url,$title)
{
    // Fetch and serve
    if ($url)
    {
        $headers = get_headers($url, 1);
        $size = $headers?$headers['Content-Length']:"";
        $mime = $headers?$headers['Content-Type']:"";
        $ext = pathinfo($url, PATHINFO_EXTENSION);
        $name = $title .'.' .$ext;

        if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE)
        {
            header('Content-Type: "' . $mime . '"');
            header('Content-Disposition: attachment; filename="' . $name . '"');
            header('Expires: 0');
            header('Content-Length: '.$size);
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header("Content-Transfer-Encoding: binary");
            header('Pragma: public');
        }
        else
        {
            header('Content-Type: "' . $mime . '"');
            header('Content-Disposition: attachment; filename="' . $name . '"');
            header("Content-Transfer-Encoding: binary");
            header('Expires: 0');
            header('Content-Length: '.$size);
            header('Pragma: no-cache');
        }

        readfile($url);
        echo "<script>
window.close();
</script>";
        exit;
    }
    exit('File not found');
}
?>

0 个答案:

没有答案