$ _POST ['index']值回显字符串但是使用readfile函数

时间:2015-09-28 23:12:14

标签: php jquery post force-download

以下是我用来将random_num发送到force_dl.php的jQuery代码,其中random_num的值为977926 ...我的最终目标是强制下载data977926.data而不是在新窗口中打开。< / p>

$.post( "../scripts/force_dl.php",{
    random_num: random_num
},
function( data ) {
    alert( data );
    var data_file = document.getElementById("data_file");
    data_file.href = "../scripts/force_dl.php";
});

这是正在修改的HTML代码

<a id="data_file">Download data file</a>

当我在force_dl.php中有以下内容时,

<?php $file_name = "data" . $_POST['random_num'] . ".data";
echo "$file_name"; ?>

我在警告中看到了文件名,

data977926.data

如果我在force_dl.php中运行以下内容

header("Content-disposition: attachment; filename=data257667.data");
header("Content-type: text/plain");
readfile("../queries/gnuplot_tmp_files/data257667.data");

并单击带有ID data_file的HTML链接,我被迫根据需要下载数据文本文件。     当我运行以下操作时会出现问题。当我单击相同的data_file链接时,我下载了一个名为data.data的文件!

$file_name = "data" . $_POST['random_num'] . ".data";
header("Content-disposition: attachment; filename=$file_name");
header("Content-type: text/plain");
readfile("../queries/gnuplot_tmp_files/$file_name");

这是data.data文件中的内容,

<br />
<b>Notice</b>:  Undefined index: random_num in     <b>/var/www/html/msdb/scripts/force_dl.php</b> on line <b>2</b><br />
<br />
<b>Warning</b>:  readfile(../queries/gnuplot_tmp_files/data.data): failed to open stream: No such file or directory in     <b>/var/www/html/msdb/scripts/force_dl.php</b> on line <b>6</b><br />

当我能回显$ _POST ['random_num']时,为什么索引random_num未定义?为什么下载的文件名为data.data而不是data977926.data?当我回显$ _POST ['random_num']时,为什么我会看到data977926.data,但是当我将$ _POST ['random_num']插入到header和readfile函数中时,我得到的结果与输入data977926.data时的结果不同?提前谢谢。

1 个答案:

答案 0 :(得分:2)

在您的JavaScript更改中

data_file.href = "../scripts/force_dl.php";

对此:

data_file.href = "../scripts/force_dl.php?random_num=" + random_num;

在php文件中下载更改

$file_name = "data" . $_POST['random_num'] . ".data";

对此:

$file_name = "data" . $_GET['random_num'] . ".data";

这样你就可以通过链接中的GET方法将随机数传递给php文件,在你当前的代码中,你不会在第二次告诉php文件得到什么。

请注意,如果您想对这两个操作使用相同的php文件,您可以首先通过isset函数检查输入值,并根据它们执行正确的操作:

<?php

if(isset($_POST['random_num'])){
    echo 'data'.$_POST['random_num'].'.data';
}elseif(isset($_GET['random_num'])){
    $file_name = 'data'.$_GET['random_num'].'.data';
    header('Content-disposition: attachment; filename='.$file_name);
    header('Content-type: text/plain');
    readfile('../queries/gnuplot_tmp_files/'.$file_name);   
}

?>