将JavaScript ID值传递给PHP以供下载

将JavaScript ID值传递给PHP以供下载,javascript,php,Javascript,Php,我对PHP很陌生,但我学得很快。。我一直在尝试使用AJAX将ID传递给PHP。 使用这个ID,我使用SQL从数据库中获取文件的路径,而不是使用它下载文件。 然而,经过一些研究,这是不可能的,我无法理解交替。。。也许有解决办法 这些是我的JavaScript函数;我之所以使用JSON,是因为我传递了一个ID数组,因为我打算在将来多次下载时使用它。我通过单击表格行获取ID $('.btnDownload').click(function() { $.ajax({

我对PHP很陌生,但我学得很快。。我一直在尝试使用AJAX将ID传递给PHP。 使用这个ID,我使用SQL从数据库中获取文件的路径,而不是使用它下载文件。 然而,经过一些研究,这是不可能的,我无法理解交替。。。也许有解决办法

这些是我的JavaScript函数;我之所以使用JSON,是因为我传递了一个ID数组,因为我打算在将来多次下载时使用它。我通过单击表格行获取ID

$('.btnDownload').click(function() {
                $.ajax({
                    url: 'scripts/downloadFile.php',
                    type: "POST",
                    data: {id: JSON.stringify(fileID)}
                });
            });
和我的PHP尝试下载文件

<?php
    $data = $_POST['id'];
    $data = json_decode("$data", true);
    $countArray = count($data);
    $counter = 0;
while($countArray > $counter){
        $getID = $data[$counter];
// My sql connections and queries, jumped to the fetch part
$filePath = $fetch['filePath'];
                    header('Content-Type: application/zip');
                    header('Content-Disposition: attachment; filename='.basename($filePath));

                    readfile($filePath);
                    exit;
$counter++; 
    }
?>

当我给出一个静态路径并用浏览器运行它时,这个脚本是如何单独工作的。
我想要一些关于实现结果的替代方法的帮助。

传递给
downloadFile.php
的参数称为
id
,而不是
id
(例如:
数据:{id:JSON.stringify(fileID)}

您需要更新PHP分配以使用正确的键,如下所示:

$data = $_POST['id'];

传递给
downloadFile.php
的参数称为
id
,而不是
id
(例如:
data:{id:JSON.stringify(fileID)}

您需要更新PHP分配以使用正确的键,如下所示:

$data = $_POST['id'];

要解决与弹出窗口不弹出相关的问题,请尝试以下方法,而不是ajax:

$('.btnDownload').click(function(event) {
    var url = 'scripts/downloadFile.php?id=' + JSON.stringify(fileID);
    window.location.href = url;
    event.preventDefault();
})

应向用户显示一个“保存文件”对话框,由于php文件设置的处置头,浏览器将保持在相同的url上。

要解决弹出窗口未弹出的问题,请尝试以下操作,而不是ajax:

$('.btnDownload').click(function(event) {
    var url = 'scripts/downloadFile.php?id=' + JSON.stringify(fileID);
    window.location.href = url;
    event.preventDefault();
})
应向用户显示一个“保存文件”对话框,由于php文件设置的处置头,浏览器将保持在相同的url上。

使用类似的方法。它根据AJAX请求下载,以允许自定义下载进度条。一旦下载完成,它就会被复制(从技术上讲,它是从缓存下载到磁盘上的)。您可以像下面的代码那样执行它。当然,如果要实现自定义进度条,则需要分别获取未完成的响应和更新

$('.btnDownload').click(function(){
    $.ajax({
        url : 'scripts/downloadFile.php',
        type : 'POST',
        data : {id : JSON.stringify(fileID)}
    })
    .done(function( response ){
        location.href = 'data:,' + btoa(response);
    });
});
btoa
将输入转换为Base64编码字符串,然后您可以将其与一起使用以发布下载。

使用类似的方法。它根据AJAX请求下载,以允许自定义下载进度条。一旦下载完成,它就会被复制(从技术上讲,它是从缓存下载到磁盘上的)。您可以像下面的代码那样执行它。当然,如果要实现自定义进度条,则需要分别获取未完成的响应和更新

$('.btnDownload').click(function(){
    $.ajax({
        url : 'scripts/downloadFile.php',
        type : 'POST',
        data : {id : JSON.stringify(fileID)}
    })
    .done(function( response ){
        location.href = 'data:,' + btoa(response);
    });
});

btoa
将输入转换为Base64编码字符串,然后您可以将其与发布下载文件一起使用。

我对PHP非常生疏,但乍一看:1)到底是什么不符合预期?ajax调用可能会正确执行,也可能不会正确执行,但您没有对结果进行任何处理,或者代码是否不完整?2) 看起来您试图在PHP中读取'fileID'参数,但是您从jQuery传递'id'了吗?3) 您试图解码字符串“$data”中的一些JSON输入,而不是与您的问题无关的变量$data 4),但您可能应该考虑安全性,当您基本上在这里有一个网页,可以向用户提供您服务器上的任何文件时,用户想要下载的文件。问题恰恰是,我使用ajax调用进行下载。。。我想使用一些替代方法来传递ID参数并下载如果您希望下载作为常规链接弹出,我想解决方法可以是将window.location.href设置为“scripts/downloadFile.php?ID=”+JSON.stringify(fileID)。这就是你的意思吗?下载不会因为ajax而弹出,是的,与此类似,我对PHP非常生疏,但乍一看:1)到底什么东西没有按预期工作?ajax调用可能会正确执行,也可能不会正确执行,但您没有对结果进行任何处理,或者代码是否不完整?2) 看起来您试图在PHP中读取'fileID'参数,但是您从jQuery传递'id'了吗?3) 您试图解码字符串“$data”中的一些JSON输入,而不是与您的问题无关的变量$data 4),但您可能应该考虑安全性,当您基本上在这里有一个网页,可以向用户提供您服务器上的任何文件时,用户想要下载的文件。问题恰恰是,我使用ajax调用进行下载。。。我想使用一些替代方法来传递ID参数并下载如果您希望下载作为常规链接弹出,我想解决方法可以是将window.location.href设置为“scripts/downloadFile.php?ID=”+JSON.stringify(fileID)。这就是你的意思吗?下载不会因为ajax而弹出,是的,与之类似。哦,该死的抱歉,我之前弄乱了代码,因为我尝试了一些xmlhttprequest。。。忘了更改了。真他妈的抱歉,我之前弄乱了代码,因为我尝试了一些xmlhttprequest。。。忘记更改了如果使用此方法,如何在PHP端获取fileID变量?您可以使用$\u get['id']来实现。我没有注意到您现在将代码更改为使用POST。很抱歉,这个示例使用GET only工作。如果使用此方法,如何在PHP端获取fileID变量?您可以使用$\u GET['id']来实现。我没有注意到您现在将代码更改为使用POST。抱歉,此示例仅使用GET有效。