2014-01-27 47 views
1

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

  1. LOGID =自动增量ID
  2. LOGDATE = DateTime值
  3. fileLink存储在MySQL =文件路径(例如C:\ WWW \瓦帕\ file.txt的)

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

所以在现在它显示了如下画面,
1 2014年1月25日9时33分27秒
2 2014-0 1-26 9时37分28秒
3 2014年1月27日9时38分09秒

我想提出这是“回声$日期”为超链接的日期和时间(我有这样的烦恼)这将允许用户点击下载文件。我有这是文件下载代码,

<?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文件才能使该方法正常工作。

在此先感谢您并感谢您的帮助。

回答

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将包括您将文件写入输出的代码。标题信息,文件内容等。在该页面中,您将获得所请求文件的标识($_GET['id']),从数据库或文件系统或其任何位置获取该文件,并将其发送给用户用你的代码。

通过这种方式,用户可以看到第一个页面,然后可以点击他们想要向第二个页面发送他们想要的文件的任何链接。

+0

嗨大卫,谢谢你的详细解释。这真的很有帮助。它确实有效,但是有一个小问题。截至目前的显示是我上面用超链接所说的。当我选择我的最后一个下载文件“2014-01-27 09:38:09”时,下载弹出窗口完美工作。但是,当我选择其他2条记录时,它将加载download.php页面,文本分别显示C \:wamp \ www \ SCS \ Logs \ 2014-01-25.txt或26.txt。无论如何解决这个问题?再一次感谢你。 – Jethro

+0

@Jethro:听起来好像是这些文件实际包含的内容,或者你的代码没有正确读取文件,而只是回应文件的名称而不是内容。我不确定是什么原因导致了这种情况(我的PHP非常生疏),但为了诊断它,您可能需要在'download.php'中放入一些日志语句来获取一些运行时调试信息。基本上要确保每个值都是你期望的值。 – David

+0

嗨大卫,道歉,请忽略我的第一条评论。它正在工作完美,因为我刚刚创建了另一个日志文件进行测试。我认为前两个日志文件下载发生的问题是由于我在MySQL中手动输入了文件路径,而这些文件路径没有正确地转义并读取目录斜杠“\”。非常感谢你的帮助! – Jethro

0

根据您的问题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/>'; 
    } 
0

据我所知,你想有多个链接,将提供该特定日期的日志文件。

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

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

那么你应该创建的download.php(您的下载脚本,你已经已准备好)将基于logId GET参数(对数据库的另一个查询获得filePath)提供文件。

相关问题