首页 > 解决方案 > 使用 PHP 下载多个文件

问题描述

我有一个页面,我正在尝试使用 PHP 下载多个文件。

如果我有完整的文件路径,我可以像这样下载单个文件:

$filepath = '../docs/folder/filename.pdf';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filepath));
flush();
readfile($filepath);
exit;

但是,我希望能够获取特定文件夹中名称在日期范围内的所有文件。所以我的文件名都具有相同的格式,即/folder/ddmmyyxxxx.pdf,并且我有一个表格,可以给我文件夹和两个日期。

$folder = $_POST['doc_type'];
$from_date = $_POST['from_date'];
$to_date = $_POST['to_date'];

$period = new DatePeriod(
    new DateTime($from_date),
    new DateInterval('P1D'),
    new DateTime($to_date)
);

foreach ($period as $date){
    $formatted_date = $date->format('dmy');
    if(glob('../docs/'.$folder.'/'.$formatted_date.'*.*')){
        // download code here
    }
}

下载代码适用于硬编码的文件名,但是当我尝试循环访问日期时,它没有找到任何文件,即使回显 $formatted_date 和 $folder 变量会按预期给出文件名的开头。

我做错了什么,或者有更好的方法来实现这一点,以便它们一起下载到一个文件夹中,而不是循环浏览它们并单独下载。

编辑

这就是我现在所拥有的,var_dump's 显示了正确的文件路径,它只使用一个单独的文件就可以很好地下载,但就目前而言,它只是下载一个空的 zip 文件夹

$folder = $_POST['doc_type'];
$from_date = $_POST['from_date'];
$to_date = $_POST['to_date'];

$period = new DatePeriod(
    new DateTime($from_date),
    new DateInterval('P1D'),
    new DateTime($to_date)
);

$valid_files = [];
$dir    = '../../docs/'.$folder;
$files = scandir($dir);
foreach ($period as $date){
    $formatted_date = $date->format('dmy');
    foreach($files as $file){
        if(strpos($file,$formatted_date)!==false){
            $valid_files[] = '../../docs/'.$folder.'/'.$file;
        }
    }
}

// var_dump($valid_files);
$zipname = 'download.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach($valid_files as $file){
    // var_dump($file);
    $zip->addFile($file);
}
$zip->close();

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($zipname).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($zipname));
flush();
readfile($zipname);
exit;

标签: phpdownload

解决方案


推荐阅读