1

我有一个包含歌曲的页面,每首歌曲旁边都有一个下载按钮:

<table>
  <tr>
    <td>Off the Grid</td>
    <td><a href="http://example.com/php/download.php?Off_the_Grid.mp3">Download</a></td>
  </tr>
  <tr>
    <td>Far-Sighted</td>
    <td><a href="http://example.com/php/download.php?Far_Sighted.mp3">Download</a></td>
  </tr>
</table>

然后我有以下强制下载的脚本:

<?php

    $audioFile = "Off_the_Grid.mp3";
    $fileName = $_GET['$audioFile'];
    // Fetch the file info.
    $filePath = '../audio/' . $audioFile;

    if(file_exists($filePath)) {
        $fileName = basename($filePath);
        $fileSize = filesize($filePath);

        // Output headers.
        header("Cache-Control: private");
        header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
        header("Content-Length: ".$fileSize);
        header("Content-Disposition: attachment; filename=".$fileName);

        // Output file.
        readfile ($filePath);                   
        exit();
    }
    else {
        die('The provided file path is not valid.');
    }

?>

我的目标是把这个脚本变成一个函数,这样当点击歌曲的下载链接时——例如,“Far-Sighted”——“Far-Sighted”并且只有“Far-Sighted”被强制下载。而如果点击“Off the Grid”下载链接,该功能将为“Off the Grid”运行。等等。对于我发布的所有歌曲。

上面的代码可以强制下载“Off the Grid”。但是,我试图让它强制下载任何被点击的歌曲。现在,如果我点击“Far-Sighted”旁边的“Download”,那么根据我发布的代码,“Off the Grid”会下载,而“Far-Sighted”不会下载。显然,《远见卓识》应该下载;但是,我被困住了:-/

有没有办法干净地做到这一点?我一直在想办法做到这一点,但无济于事。有没有办法让我的变量“$audiofile”根据点击的歌曲下载链接改变它的值?我打算为每首歌曲创建 php 文件,然后将歌曲独有的脚本发布到那里,或者只发布一个 php 文件,其中包含为每首歌曲量身定制的多个脚本实例。但这似乎很荒谬。

有没有很好的方法来实现这一点?谢谢!

4

1 回答 1

2

我认为问题在于您没有正确使用 GET 。我会尽量让自己清楚:

有任何网址吗?将由 GET 解析,并通过以下方式给出密钥:

example.com?key=value&key2=value2

因此,请再次查看您是如何解析 GET 值的。如果您愿意,可以查看本教程:http ://www.tizag.com/phpT/postget.php

我建议以下解决方案:

  <tr>
    <td>Far-Sighted</td>
    <td><a href="http://example.com/php/download.php?id=Far_Sighted.mp3">Download</a></td>
  </tr>

和PHP

$audioFile = $_GET['id'];
// Fetch the file info.
$filePath = '../audio/' . $audioFile;

考虑到验证来自 GET 的任何数据以避免注入是一个好主意。

于 2013-07-10T09:40:48.137 回答