我有一个URL,我从工作中保存了一些项目,它们主要是MDB文件,但也有一些JPG和PDF。
我需要做的是列出该目录中的每个文件(已经完成),并为用户提供下载它的选项。
如何使用PHP实现这一目标?
答案 0 :(得分:30)
要阅读目录内容,您可以使用readdir()并使用我的示例download.php
中的脚本来下载文件
if ($handle = opendir('/path/to/your/dir/')) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
echo "<a href='download.php?file=".$entry."'>".$entry."</a>\n";
}
}
closedir($handle);
}
在download.php
中,您可以强制浏览器发送下载数据,并使用basename()确保客户端不会传递其他文件名,例如../config.php
$file = basename($_GET['file']);
$file = '/path/to/your/dir/'.$file;
if(!file_exists($file)){ // file does not exist
die('file not found');
} else {
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$file");
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
// read the file from disk
readfile($file);
}
答案 1 :(得分:2)
如果可以从浏览器访问该文件夹(不在Web服务器的文档根目录之外),则只需输出指向这些文件位置的链接即可。如果它们位于文档根目录之外,则需要有链接,按钮等,指向PHP脚本,该脚本处理从其位置获取文件并流式传输到响应。
答案 2 :(得分:0)
这是一个更简单的解决方案,列出目录中的所有文件并下载它。
在index.php文件中
<?php
$dir = "./";
$allFiles = scandir($dir);
$files = array_diff($allFiles, array('.', '..')); // To remove . and ..
foreach($files as $file){
echo "<a href='download.php?file=".$file."'>".$file."</a><br>";
}
scandir()函数列出指定路径内的所有文件和目录。它适用于PHP 5和PHP 7.
现在在download.php中
<?php
$filename = basename($_GET['file']);
// Specify file path.
$path = ''; // '/uplods/'
$download_file = $path.$filename;
if(!empty($filename)){
// Check file is exists on given path.
if(file_exists($download_file))
{
header('Content-Disposition: attachment; filename=' . $filename);
readfile($download_file);
exit;
}
else
{
echo 'File does not exists on given path';
}
}
答案 3 :(得分:0)
这是不下载库文件的代码
$filename = "myfile.jpg";
$file = "/uploads/images/".$filename;
header('Content-type: application/octet-stream');
header("Content-Type: ".mime_content_type($file));
header("Content-Disposition: attachment; filename=".$filename);
while (ob_get_level()) {
ob_end_clean();
}
readfile($file);
我包含了mime_content_type,它将返回文件的内容类型。
为防止文件下载损坏,我添加了ob_get_level()和ob_end_clean();