通过 Ajax 和 PHP 强制下载

2022-01-02 00:00:00 download jquery php javascript ajax

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

i want to create a downloadscript which allows Force Download of JPGs. This is my php script:

<?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代码的一段代码:

This is a code segment of my js code:

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

使用此代码示例没有任何反应.如果我将结果附加到 HTML 标签中,它会显示文件的内容.

With this code sample nothing happens. If i append the result into a HTML-tag, it shows the content of the file.

任何想法如何教浏览器下载此文件?

Any ideas how to teach the browser to download this file?

脚本更新

推荐答案

您无法使用 ajax 下载文件.所以,如果你有一些应该在 ajax 上发生的事情,你应该返回 url 作为响应并像 document.location = "url" 一样应用它来开始下载过程.

You can't download files with ajax. So, if you have something that should happen on ajax, you should return url in response and apply it like document.location = "url"to start download process.

这里有一个注意事项.我记得,如果不是由用户点击启动,浏览器将阻止文件下载.所以,这会正常工作:

One note here. As I remember, browser will block file download if it is initiated not by user click. So, this will work fine:

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

但是如果不是通过用户点击启动的,它会被阻止.所以,代码如下:

But if it is started not by user click, it will be blocked. So, code like this:

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

会被浏览器拦截.因此,如果您想通过帖子传递一些数据,您可以使用 <form target="..." 将表单提交到隐藏的 iframe 或空白页面:

will be blocked by browser. So, if you want to pass some data with a post, you may submit a form into hidden iframe or to blank page using <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 的代码,如果令牌没问题,或者做一个重定向来下载脚本:

And in script.php you need to execute code from download.php immediately, if token is Ok, or do a redirect to download script:

header("Location: download.php?a=" . $filename)

相关文章