PHP如何在保存原始文件到服务器前对客户端上传文件进行zip压缩
你对上传流程的理解存在一点偏差:用户上传的文件到达PHP脚本时,已经被自动存到了服务器的系统临时目录中,对应$_FILES["file"]["tmp_name"]路径,这个临时文件会在请求结束后自动清理,无需手动删除。你想要的「先压缩再存原始文件」实际不需要先把原始文件移动到正式存储目录,直接读取临时文件内容生成压缩包即可,完全不会产生冗余文件。
修改后的代码参考如下:
<?php if(isset($_POST['upload_file'])) { // 先校验上传文件是否正常 if ($_FILES["file"]["error"] !== UPLOAD_ERR_OK) { echo "文件上传失败,错误码:" . $_FILES["file"]["error"]; exit; } $tmp_path = $_FILES["file"]["tmp_name"]; $file_name = $_FILES["file"]["name"]; $folder = "images/"; $zip_name = "upload.zip"; // 第一步:直接从临时文件生成压缩包,无需提前转存原始文件 $zip = new ZipArchive(); if($zip->open($zip_name, ZIPARCHIVE::CREATE) !== TRUE) { echo "Sorry ZIP creation failed at this time"; exit; } // 直接将临时文件内容添加到压缩包,指定压缩包内的文件名称 $zip->addFile($tmp_path, $file_name); $zip->close(); // 第二步:如果需要留存原始文件再执行移动操作,不需要可以直接删掉这行 move_uploaded_file($tmp_path, $folder . $file_name); } ?>
注意事项
- 运行前请确保服务器已开启
zip扩展,且脚本对当前目录、images目录都有写入权限 - 如果不需要留存原始文件,直接删除最后的
move_uploaded_file行即可,临时文件会被系统自动清理,服务器只会留存生成的zip包 - 示例代码没有处理文件名重复的问题,实际使用建议给文件名加随机前缀或时间戳,避免覆盖已有文件
内容的提问来源于stack exchange,提问作者mike5421
相关产品推荐
相关产品推荐

