php - 使用 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;
解决方案
推荐阅读
- python - 无法使用 python selenium 抓取某些 DIV 标签
- java - 在全状态处理中,您应该如何处理由于从未达到缓冲区大小而未处理的数据?
- configuration - 如何为普罗米修斯操作员启用其他配置
- html - 重构特殊的 HTML 字符
- html - 如何使用 Angular 8 反应形式验证多个预选复选框
- oracle - 为什么我在通过 opatch 应用补丁时收到错误代码 135?
- eclipse - Eclipse 未检测从外部库导入的类的构造函数中的命名参数
- containers - AWS fargate 容器的 Api 网关 URL
- java - 忽略 VS Code 中未使用的局部变量警告
- javascript - JavaScript 模板式语句