欢迎访问宙启技术站
智能推送

PHP/ThinkPHP如何实现批量打包下载文件

发布时间:2023-05-14 05:13:54

在PHP/ThinkPHP中,实现批量打包下载文件可以通过以下步骤:

1. 创建一个用于存放要下载文件的目录,将所有要下载的文件放入该目录中。

2. 编写一个PHP脚本,用来处理下载请求,并将所有要下载的文件打包成ZIP格式的压缩文件。

3. 使用ThinkPHP的文件操作类,读取存放要下载文件的目录中的所有文件,将它们添加到ZIP格式的压缩文件中。

4. 设置HTTP头信息,告诉浏览器下载的是一个ZIP格式的压缩文件,并指定下载文件的名称。

5. 将ZIP格式的压缩文件输出到浏览器。

具体实现过程如下:

1. 创建一个用于存放要下载文件的目录并将所有要下载的文件放入该目录中。

$dir = 'download';
if (!is_dir($dir)) {
    mkdir($dir);
}
$files = ['1.txt', '2.txt', '3.txt'];
foreach ($files as $file) {
    file_put_contents($dir . '/' . $file, 'This is ' . $file);
}

2. 编写一个PHP脚本,用来处理下载请求,并将所有要下载的文件打包成ZIP格式的压缩文件。

public function download() {
    // 允许将脚本的执行时间设置为不限制(0秒)
    set_time_limit(0);
    // 创建一个用于存放要下载文件的目录
    $dir = 'download';
    // 打包后要下载的文件名
    $filename = 'download_files.zip';
    // 创建一个 ZIP 对象
    $zip = new \ZipArchive();
    // 创建一个 ZIP 压缩文件
    if ($zip->open($filename, \ZipArchive::CREATE) !== TRUE) {
        exit('Cannot create zip archive');
    }
    // 遍历要下载的文件
    $files = scandir($dir);
    foreach ($files as $file) {
        if ($file != '.' && $file != '..') {
            // 将文件添加到 ZIP 压缩文件中
            $zip->addFile($dir . '/' . $file, $file);
        }
    }
    // 关闭 ZIP 对象
    $zip->close();
    // 将 ZIP 压缩文件输出到浏览器
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    header('Content-Length: ' . filesize($filename));
    readfile($filename);
    // 删除压缩文件
    unlink($filename);
    // 删除存放要下载文件的目录中的所有文件
    foreach ($files as $file) {
        if ($file != '.' && $file != '..') {
            unlink($dir . '/' . $file);
        }
    }
    rmdir($dir);
}

3. 使用ThinkPHP的文件操作类,读取存放要下载文件的目录中的所有文件,将它们添加到ZIP格式的压缩文件中。

use think\File;

public function download() {
    // 允许将脚本的执行时间设置为不限制(0秒)
    set_time_limit(0);
    // 创建一个用于存放要下载文件的目录
    $dir = 'download';
    if (!is_dir($dir)) {
        mkdir($dir);
    }
    // 将要下载的文件复制到下载目录中
    $files = ['1.txt', '2.txt', '3.txt'];
    foreach ($files as $file) {
        copy('files/' . $file, $dir . '/' . $file);
    }
    // 打包后要下载的文件名
    $filename = 'download_files.zip';
    // 创建一个 ZIP 对象
    $zip = new \ZipArchive();
    // 创建一个 ZIP 压缩文件
    if ($zip->open($filename, \ZipArchive::CREATE) !== TRUE) {
        exit('Cannot create zip archive');
    }
    // 遍历要下载的文件
    $file = new File($dir);
    $files = $file->listFiles();
    foreach ($files as $file) {
        if ($file->isFile()) {
            // 将文件添加到 ZIP 压缩文件中
            $zip->addFile($file->getRealPath(), $file->getFilename());
        }
    }
    // 关闭 ZIP 对象
    $zip->close();
    // 将 ZIP 压缩文件输出到浏览器
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    header('Content-Length: ' . filesize($filename));
    readfile($filename);
    // 删除压缩文件
    unlink($filename);
    // 删除存放要下载文件的目录中的所有文件
    foreach ($files as $file) {
        if ($file->isFile()) {
            unlink($file->getRealPath());
        }
    }
    rmdir($dir);
}

4. 设置HTTP头信息,告诉浏览器下载的是一个ZIP格式的压缩文件,并指定下载文件的名称。

header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Length: ' . filesize($filename));

5. 将ZIP格式的压缩文件输出到浏览器。

readfile($filename);

总结:

本文介绍了在PHP/ThinkPHP中实现批量打包下载文件的方法,通过将所有要下载的文件打包成ZIP格式的压缩文件,可以方便用户在一次操作中下载多个文件。同时,使用ThinkPHP的文件操作类可以更方便地读取目录中的所有文件,从而简化代码的实现。