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

如何用PHP连接FTP并解压ZIP文件?现有代码仅能上传需优化

解决PHP FTP上传后解压ZIP的问题

你好!你的代码已经成功搞定了FTP连接和文件上传的部分,但FTP协议本身并没有自带解压命令,所以直接用原生的FTP函数没法完成解压操作。下面给你几个可行的解决方案,你可以根据自己的服务器环境来选:

方案一:如果远程服务器支持FTP执行Shell命令(推荐,效率最高)

如果你的FTP服务器允许通过ftp_exec()函数执行Shell命令,这是最直接高效的方式。在上传完文件后,添加执行解压命令的代码即可:

if ($_POST){ 
    // FTP服务器信息
    $ftpserver = $_POST['ftp_host']; 
    $ftpuser = $_POST['ftp_kadi']; 
    $ftppass = $_POST['ftp_sifresi']; 
    // 文件路径
    $kaynakdosya = "./minecraft.zip"; 
    $hedefdosya = "./minecraft.zip"; 
    // 连接FTP服务器
    $baglanti = ftp_connect($ftpserver); 
    // 登录FTP
    $giris = ftp_login($baglanti, $ftpuser, $ftppass); 
    // 检查连接和登录状态
    if ((!$baglanti) || (!$giris)) { 
        echo "Ftp bağlantısı sağlanamadı"; 
        die; 
    } else { 
        echo "Ftp'ye bağlanıldı<br>"; 
    } 
    // 上传文件
    $yukle = ftp_put($baglanti,$hedefdosya, $kaynakdosya, FTP_BINARY); 
    // 检查上传结果
    if (!$yukle) { 
        echo "Dosya Yüklenemiyor"; 
    } else { 
        echo "Dosya Yüklendi<br>";
        // 执行解压命令:将ZIP解压到当前目录,可修改-d后的路径调整解压位置
        $unzipCommand = "unzip " . $hedefdosya . " -d ./"; 
        if (ftp_exec($baglanti, $unzipCommand)) {
            echo "Dosya başarıyla açıldı (unzip)";
            // 可选:上传完成后删除FTP上的ZIP文件
            ftp_delete($baglanti, $hedefdosya);
        } else {
            echo "Unzip komutu çalıştırılamadı. Sunucuda unzip desteği yok veya izinler yetersiz.";
        }
    } 
    ftp_close($baglanti); 
}

注意事项:

  • 远程服务器必须安装了unzip工具(Linux服务器一般默认有,Windows服务器可能需要额外配置)
  • 你的FTP账号需要有执行Shell命令的权限(部分共享主机可能会禁用这个功能)
  • 可以修改-d后面的参数,指定解压到特定目录

方案二:本地解压后再上传文件(兼容所有环境)

如果远程服务器不允许执行Shell命令,那就只能用这种“曲线救国”的方式:上传ZIP → 从FTP下载ZIP到本地 → 本地解压 → 把解压后的文件逐个上传到FTP。

示例代码片段(接在你的上传成功逻辑后):

if ($yukle) {
    echo "Dosya Yüklendi<br>";
    // 1. 从FTP下载ZIP到本地临时目录
    $localTempZip = "./temp_minecraft.zip";
    if (ftp_get($baglanti, $localTempZip, $hedefdosya, FTP_BINARY)) {
        // 2. 本地解压ZIP(需要PHP启用ZipArchive扩展,大部分环境默认支持)
        $zip = new ZipArchive();
        if ($zip->open($localTempZip) === TRUE) {
            $extractDir = "./temp_extract/";
            mkdir($extractDir, 0777, true); // 创建临时解压目录
            $zip->extractTo($extractDir);
            $zip->close();
            echo "Dosya yerel olarak açıldı<br>";

            // 3. 遍历解压后的文件,逐个上传到FTP
            $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($extractDir));
            foreach ($iterator as $file) {
                if (!$file->isDir()) {
                    $localFilePath = $file->getPathname();
                    // 计算远程路径:去掉本地临时目录前缀
                    $remoteFilePath = str_replace($extractDir, "./", $localFilePath);
                    if (ftp_put($baglanti, $remoteFilePath, $localFilePath, FTP_BINARY)) {
                        echo "Yüklendi: " . $remoteFilePath . "<br>";
                    } else {
                        echo "Yüklenemedi: " . $remoteFilePath . "<br>";
                    }
                }
            }

            // 4. 清理本地临时文件和目录
            unlink($localTempZip);
            // 递归删除临时解压目录
            function deleteDir($dir) {
                $files = array_diff(scandir($dir), array('.','..'));
                foreach ($files as $file) {
                    (is_dir("$dir/$file")) ? deleteDir("$dir/$file") : unlink("$dir/$file");
                }
                return rmdir($dir);
            }
            deleteDir($extractDir);

            // 可选:删除FTP上的ZIP文件
            ftp_delete($baglanti, $hedefdosya);
        } else {
            echo "Yerel zip dosyası açılamadı";
        }
    } else {
        echo "FTP'den zip dosyası indirilemedi";
    }
}

注意事项:

  • 本地服务器需要有足够的磁盘空间存放临时文件
  • 上传大量小文件时,这种方法效率会偏低,因为要逐个上传

额外提示

  • 确保FTP账号对目标目录有读写权限,不管是解压还是上传文件都需要权限支持
  • 可以先手动在FTP服务器上执行解压命令,确认服务器是否支持unzip工具
  • 如果是Windows服务器,解压命令会不同(比如使用tar命令或第三方解压工具),需要对应调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:02:32