【问题标题】:PHP OnClick file download using file path stored in MySQL使用存储在 MySQL 中的文件路径下载 PHP OnClick 文件
【发布时间】:2014-01-28 00:11:50
【问题描述】:

我已经搜索了很长时间,但没有看到可以解决我的问题的东西。我正在处理一个显示文件列表的页面,当点击时,用户将被允许下载该文件。文件路径存储在 MySQL 中以供下载。
目前我正在使用带有 SQL 查询的 while 循环来检索和显示(回显)文件。

  1. logID = MySQL 中的自动增量 ID
  2. logDate = 日期时间值
  3. fileLink = MySQL 中存储的文件路径(例如 C:\www\wamp\file.txt)

    while ($row = mysql_fetch_array($result)) {
    $ID =$row['logID'];
    $date =$row['logDate'];
    $file =$row['fileLink'];
    echo $ID, ' ';
    echo $date, '<br/>';
    }
    

所以现在屏幕上显示如下,
1 2014-01-25 09:33:27
2 2014-01-26 09:37:28
3 2014-01-27 09:38:09

我想将“echo $date”的日期和时间变成一个超链接(我对此有问题),这样用户就可以点击下载文件。我有一个文件下载代码,

<?php
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>

问题是当此下载代码在页面上时,页面加载时立即出现下载框,并且仅提供下载“2014-01-27”文件的选项,该文件是期间最后检索到的项目SQL while 循环。

我已经读到下载代码应该在另一个 .php 文件上,当需要它时会被调用,但我是 PHP 新手,不知道如何去做。

主要是我的问题,

  1. 如何使用 onclick 事件将回显项设为超链接以触发下载。
  2. 如何将文件路径绑定到相应的回显项,因为现在 $file 将存储由于 while 循环而导致的最后一条记录的文件路径。
  3. 如果上述情况可行,并且下载代码在另一个 .php 文件上,我如何将相应的 $file 变量值传递给该 .php 文件以使该方法起作用。

提前感谢您并感谢您提供的任何帮助。

【问题讨论】:

    标签: php mysql download


    【解决方案1】:

    我已经读到下载代码应该在另一个 .php 文件中,需要时会调用它

    确实如此。从请求/响应的角度考虑这一点,您的 PHP 代码本质上需要响应两种不同类型的请求:

    • 文件列表请求
    • 对特定文件的请求

    这两件事将在两个不同的 PHP 文件中。假设第一个名为list.php。它只会显示文件列表的 HTML 内容。它可以像你所拥有的一样简单:

    while ($row = mysql_fetch_array($result)) {
        $ID =$row['logID'];
        $date =$row['logDate'];
        $file =$row['fileLink'];
    
        echo $ID, ' ';
        echo $date, '<br/>';
    }
    

    您提到您希望日期成为超链接,对吗?然后用超链接标记将其包围。像这样的:

    echo '<a href="download.php?id=' . $ID . '">' . $date . '</a>', '<br />';
    

    请注意,我在这里做了几件事。不仅日期值现在被超链接包围,而且超链接还包括几个组件:

    • download.php,我假设它是第二页的名称。当然,它可以是您决定的任何东西。
    • $ID,这是发送到第二页的值,因此它知道单击了哪个文档。这是 URL 上的查询字符串值,将在第二页上由 $_GET['id'] 获得。注意:这个值可以由用户更改,不要依赖它作为安全措施。始终验证用户是否有权下载他们在第二页本身请求的文件。

    第二页download.php 将包含用于将文件写入输出的代码。标头信息、文件内容等。在该页面中,您将获得所请求文件的 ID ($_GET['id']),从数据库或文件系统或任何位置获取该文件,并将其发送到拥有您拥有的代码的用户。

    这样,用户会看到第一页,然后可以单击他们想要向第二页请求他们想要的文件的任何链接。

    【讨论】:

    • 嗨,大卫,感谢您的详细解释。这真的很有帮助。它确实有效,但是有一个小问题。到目前为止,显示的是我上面用超链接所说的。当我选择要下载的最后一个文件“2014-01-27 09:38:09”时,下载弹出窗口完美运行。但是,当我选择其他 2 条记录时,它会加载 download.php 页面,其中的文本分别显示 C\:wamp\www\SCS\Logs\2014-01-25.txt 或 26.txt。有没有办法解决这个问题?再次感谢您。
    • @Jethro:听起来这就是这些文件实际包含的内容,或者您​​的代码没有正确读取文件,而是只是回显文件的名称而不是其内容。我不太确定是什么原因造成的(我的 PHP 非常 生锈了),但要诊断它,您可能需要在 download.php 中添加一些日志记录语句以获取一些运行时调试信息.本质上是为了确保每个值都符合您的预期。
    • 嗨大卫,抱歉,请忽略我的第一条评论。它工作得很好,因为我刚刚创建了另一个用于测试的日志文件。我认为前 2 个用于下载的日志文件出现的问题是由于我在 MySQL 中手动输入文件路径,它没有正确转义并读取目录斜杠“\”。非常感谢您的帮助!
    【解决方案2】:

    根据您的问题 1 和 2:

    while ($row = mysql_fetch_array($result)) {
       $ID =$row['logID'];
       $date =$row['logDate'];
       $file =$row['fileLink'];
       echo $ID, ' ';
       echo '<a href="'.$file.'">'.$date.'</a><br/>'; // Hyperlink to file.
    }
    

    第三期你可以试试

      while ($row = mysql_fetch_array($result)) {
           $ID =$row['logID'];
           $date =$row['logDate'];
           $file =$row['fileLink'];
           echo $ID, ' ';
           echo '<a href="yourfile.php?file='.$file.'">'.$date.'</a><br/>';
        }
    

    【讨论】:

      【解决方案3】:

      据我了解,您希望有多个链接来提供该特定日期的日志文件。

      您应该有一个文件将日志文件列表准备为一个数组,或者在您的 while 循环中执行以下操作:

      echo "<a href='download.php?logId={$row['logID']}'>{$row['logDate']}</a>";
      

      然后您应该创建 download.php(您已经准备好的下载脚本),它将根据 logId GET 参数(另一个查询数据库以获取 filePath)提供文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多