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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:00:01