跳转到内容
彼岸论坛
欢迎抵达彼岸 彼岸花开 此处谁在 -彼岸论坛

[程序员] 请问如何实现大文件夹即时浏览器下载


小天管理

已推荐帖子

我用的是 php ,问了一圈 AI ,告诉我使用 ZipStream ,但是我试了同样需要等待压缩的时候非常久,而不是像群晖 NAS 那样,立即开始下载,且浏览器不显示最终文件大小。 请问 v 友这是如何做到的

r4i2k7.jpg

public function downloadFolderNew()
{
    $path = $this->request->param("path", "");
    if (!empty($path)) {
        // 将路径转换为项目的公共路径
        $path = str_replace("D:\\phpproject\\test\\public\\", public_path(), $path);
    }

    if (!is_dir($path)) {
        $this->error("路径不存在");
    }

    $fileName = $this->request->param("file_name", "") ?: uniqid();
    $zipFileName = $fileName . ".zip";

    // 设置响应头
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . $zipFileName . '"');
    header('X-Accel-Buffering: no'); // 关闭 Nginx 的输出缓冲

    // 禁用输出缓冲区
    if (ob_get_level()) {
        ob_end_clean();
    }
    // 立即输出部分内容,浏览器开始下载
    echo "\xEF\xBB\xBF"; // 避免 PHP 输出缓冲,立即开始下载
    flush();
    // 创建一个 ZIP 流
    $zip = new ZipStream\ZipStream(null, [
        'outputStream' => 'php://output' // 将输出直接定向到浏览器
    ]);
    // 递归添加文件夹内容到 ZIP
    $this->addFolderToZip($zip, $path, '');

    // 结束 ZIP 流
    $zip->finish();
    exit();
}

private function addFolderToZip($zip, $folder, $zipPath)
{
    // 创建迭代器,遍历文件夹中的文件
    $files = new \RecursiveIteratorIterator(
        new \RecursiveDirectoryIterator($folder, \RecursiveDirectoryIterator::SKIP_DOTS),
        \RecursiveIteratorIterator::LEAVES_ONLY
    );
    foreach ($files as $file) {
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($folder) + 1); // 获取文件相对路径
        if (!$file->isDir()) {
            // 确保文件路径和内容正确添加到 ZIP 中
            $zip->addFileFromPath($zipPath . $relativePath, $filePath);
        }
        // 刷新输出缓冲,逐步发送数据到浏览器
        flush();
    }
}
意见的链接
分享到其他网站

加入讨论

您现在可以发表并稍后注册. 如果您是会员,请现在登录来参与讨论.

游客
回复主题...

×   粘贴为富文本.   粘贴为纯文本来代替

  只允许使用75个表情符号.

×   您的链接已自动嵌入.   显示为链接来代替

×   您之前的内容已恢复.   清除编辑器

×   您无法直接粘贴图片.要从网址上传或插入图片.

  • 游客注册

    游客注册

  • 会员

    没有会员可显示

  • 最新的状态更新

    没有最新的状态更新
  • 最近查看

    • 没有会员查看此页面.
×
×
  • 创建新的...