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
相关产品推荐
相关产品推荐

