当前位置:首页 > PHP

php实现批量下载

2026-02-13 19:08:14PHP

PHP实现批量下载的方法

使用ZipArchive类打包下载

创建临时压缩包,将多个文件打包后提供下载链接。示例代码:

$zip = new ZipArchive();
$zipName = 'downloads.zip';

if ($zip->open($zipName, ZipArchive::CREATE) === TRUE) {
    $files = ['file1.pdf', 'file2.jpg', 'file3.docx'];

    foreach ($files as $file) {
        if (file_exists($file)) {
            $zip->addFile($file);
        }
    }

    $zip->close();

    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="'.basename($zipName).'"');
    header('Content-Length: ' . filesize($zipName));
    readfile($zipName);
    unlink($zipName); // 删除临时文件
}

多文件流合并下载

通过HTTP头控制实现多个文件合并下载输出:

php实现批量下载

$fileList = [
    '/path/to/file1.txt',
    '/path/to/file2.txt'
];

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="combined_files.bin"');

foreach ($fileList as $file) {
    if (file_exists($file)) {
        readfile($file);
    }
}

异步队列处理大文件批量下载

对于大型批量下载任务,建议采用队列系统:

php实现批量下载

// 生产者部分(添加下载任务到队列)
$downloadJobs = [
    ['url' => 'http://example.com/file1', 'saveAs' => 'local1.ext'],
    ['url' => 'http://example.com/file2', 'saveAs' => 'local2.ext']
];

foreach ($downloadJobs as $job) {
    file_put_contents('download_queue.txt', json_encode($job)."\n", FILE_APPEND);
}

// 消费者部分(后台处理)
while (true) {
    $queue = file('download_queue.txt');
    if (!empty($queue)) {
        $job = json_decode(array_shift($queue), true);
        file_put_contents($job['saveAs'], file_get_contents($job['url']));
        file_put_contents('download_queue.txt', implode('', $queue));
    }
    sleep(5);
}

注意事项

  • 设置合理的执行时间限制:set_time_limit(0)
  • 处理内存限制:ini_set('memory_limit', '1024M')
  • 对于远程文件下载,考虑使用cURL代替file_get_contents
  • 添加权限验证防止未授权访问
  • 记录下载日志用于审计追踪

安全增强措施

验证文件路径防止目录遍历攻击:

function safeDownload($filePath) {
    $baseDir = '/secure/download/directory/';
    $realPath = realpath($baseDir . $filePath);

    if (strpos($realPath, $baseDir) === 0 && file_exists($realPath)) {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="'.basename($realPath).'"');
        readfile($realPath);
    } else {
        header('HTTP/1.0 404 Not Found');
    }
}

标签: 批量php
分享给朋友:

相关文章

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…

php 链表实现

php 链表实现

在 PHP 中实现链表可以通过类来模拟链表节点(Node)和链表(LinkedList)结构。以下是链表的完整实现示例,包含基础操作如插入、删除、遍历等。 链表节点类(Node) 链表的基本单元是节…

php无法实现

php无法实现

PHP 是一种功能强大的服务器端脚本语言,能够实现多种功能,包括动态网页开发、数据库交互、文件操作等。如果遇到“无法实现”的问题,通常是由于以下原因之一: 环境配置问题 确保 PHP 环境正确安装和…

php redis 队列实现

php redis 队列实现

PHP Redis 队列实现 Redis 是一个高性能的键值存储系统,常被用作消息队列。以下是使用 PHP 和 Redis 实现队列的几种方法。 安装依赖 确保已安装 PHP Redis 扩展。可以…