小编典典

通过Ajax和PHP强制下载

ajax

我想创建一个允许强制下载JPG的下载脚本。这是我的PHP脚本:

<?php
    header("Pragma: public"); // required
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Description: File Transfer");
    header("Content-Type: image/jpg");
    header('Content-Disposition: attachment; filename="'.basename($GET['a']).'"');
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize(($GET['a']));
    readfile(($GET['a']);
?>

这是我的js代码的代码段:

function downloadFile(a){
    document.location = "download.php?a="+ a;
}

使用此代码示例,什么都不会发生。如果我将结果附加到HTML标记中,它将显示文件的内容。

有什么想法可以教浏览器下载此文件吗?

编辑:脚本更新


阅读 300

收藏
2020-07-26

共1个答案

小编典典

您无法使用Ajax下载文件。因此,如果您在ajax上发生了某些情况,则应返回url作为响应,并像document.location = "url"开始下载过程一样应用它。

这里有一个音符。我记得,如果不是用户单击启动浏览器,浏览器将阻止文件下载。因此,这将正常工作:

.click(function(){
   document.location = "download url"
})

但是,如果不是通过用户单击启动它,它将被阻止。因此,这样的代码:

.click(function(){
       $.ajax({...,
       success:function(download_url_from_server){
           document.location = download_url_from_server;
       }});           
    })

将被浏览器阻止。因此,如果您想在发布时传递一些数据,可以使用以下方法将表单提交到隐藏的iframe或空白页中<form target="..."

 function checkToken(token){
    var $form = $("#downloadForm");
    if ($form.length == 0) {
        $form = $("<form>").attr({ "target": "_blank", "id": "downloadForm", "method": "POST", "action": "script.php" }).hide();
        $("body").append($form);
    }
    $form.find("input").remove();
    var args = { a: "checkToken", b: token }
    for (var field in args) {
        $form.append($("<input>").attr({"value":args[field], "name":field}));
    }
    $form.submit();
}

在script.php中,如果令牌正常,您需要立即从download.php执行代码,或者重定向到下载脚本:

header("Location: download.php?a=" . $filename)
2020-07-26