You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony生成含0KB文件的Zip归档问题及解决方案代码

解决Symfony框架中生成Zip归档时文件大小为0KB的异常

我之前碰到过一模一样的问题——在Symfony中生成Zip归档后,打开发现里面的文件全是0KB,折腾了好一会儿终于找到正确的实现方式,下面是经过验证可以正常工作的代码:

// 加载服务器配置文件
$config_server = sfYaml::load(sfConfig::get('sf_root_dir').'/config/server.yml');
$url_root = $config_server[sfConfig::get('sf_environment')]['url_root'];
$path_root = $config_server[sfConfig::get('sf_environment')]['path_root'];
$path_upload = $config_server[sfConfig::get('sf_environment')]['path_upload'];

$zipname = 'file.zip';
$zip = new ZipArchive();
// 创建临时文件存储Zip内容,避免直接操作文件时的权限或缓存问题
$tmp_file = tempnam('.','');
$zip->open($tmp_file, ZipArchive::CREATE);

// 获取需要打包的附件集合(替换为你实际的文件获取逻辑)
$files = ...; // 示例:从数据库或上传目录获取文件信息数组

foreach ($files as $file) {
    $full_file_path = $path_upload . '/' . $file['filename'];
    // 先校验文件的存在性与可读性,避免无效文件导致空内容
    if (file_exists($full_file_path) && is_readable($full_file_path)) {
        // 通过读取文件内容再添加到Zip的方式,确保内容被正确写入
        $zip->addFromString($file['filename'], file_get_contents($full_file_path));
    }
}

// 必须关闭ZipArchive实例,否则所有缓存的内容不会被写入到文件中
$zip->close();

// 输出Zip文件供用户下载
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.$zipname.'"');
header('Content-Length: ' . filesize($tmp_file));
readfile($tmp_file);

// 清理临时文件,避免服务器磁盘占用
unlink($tmp_file);

关键注意事项(为什么之前会出现0KB文件):

  • 临时文件的使用:用tempnam创建临时文件来承载Zip内容,比直接使用固定路径文件更稳定,能避免权限或文件未刷新的问题
  • 文件内容的正确读取:使用addFromString配合file_get_contents,确保文件内容被完整加载并写入Zip;如果直接用addFile出现问题,大概率是文件路径配置错误或者文件权限不足
  • 必须关闭ZipArchive:$zip->close()是核心步骤,它会把所有内存中缓存的Zip内容写入到磁盘文件,跳过这一步会导致Zip文件不完整或内容为空
  • 前置校验:添加文件前先检查文件是否存在且可读,避免添加无效文件导致的空条目

内容的提问来源于stack exchange,提问作者Mathieu Mourareau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:44:27