【问题标题】:Upload a ZIP file and UNZIP ftp folder via PHP通过 PHP 上传 ZIP 文件和解压缩 ftp 文件夹
【发布时间】:2017-03-23 06:03:52
【问题描述】:

我想制作一个表格,您可以在其中填写 FTP 登录服务器并获取上传 ZIP 文件的选项。该脚本与最后一部分(解压缩文件)不同,我想执行解压缩上传的文件。有谁知道是什么问题? TIA

<?php 
if (isset($_POST['Submit'])) {
$ftp_server = $ftp = $_POST['ftp'];
$ftp_user_name = $username = $_POST['username'];
$ftp_user_pass = $password = $_POST['password'];   


 if (!empty($_FILES['upload']['name'])) {
$ch = curl_init();

$file1 = $localfile = $_FILES['upload']['name'];
$fp = fopen($file1, 'r');

$file = '/htdocs/file.zip';
// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// try to upload $file
if (ftp_fput($conn_id, $file, $fp, FTP_ASCII)) {
    echo "Successfully uploaded ftp://".$username.":".$password."@".$ftp.$file."\n";

    $zip = new ZipArchive;
    $zip->open($file); 
    $zip->extractTo('ftp://'.$username.':'.$password.'@'.$ftp.'/htdocs'); 
    $zip->close();

} else {
    echo "There was a problem while uploading $file\n";
}

// close the connection and the file handler
ftp_close($conn_id);
fclose($fp);
 }  
}
?>

    <?php if(isset($error)){ echo $error; } ?>
        <form action="upload.php" method="post" enctype="multipart/form-data">
            <div>
                <label for="upload">Select file</label>
                <input name="upload" type="file" />
                <br> Ftp Server:
                <br>
                <input type="text" name="ftp" value="<?php if(isset($ftp)){ echo $ftp; } ?>">
                <br> Username:
                <br>
                <input type="text" name="username" value="<?php if(isset($username)){ echo $username; } ?>">
                <br> Password:
                <br>
                <input type="text" name="password" value="<?php if(isset($password)){ echo $password; }else{ echo '123456';} ?>">

                <input type="submit" name="Submit" value="Upload" />
            </div>
        </form>

错误

上传成功

ftp://:@ftp.***.com/htdocs/file.zip 警告: ZipArchive::extractTo(): Zip 对象无效或未初始化 C:\xampp\htdocs\upload.php 在第 29 行

警告:ZipArchive::close():Zip 对象无效或未初始化 C:\xampp\htdocs\upload.php 第 30 行

【问题讨论】:

    标签: php file-upload ftp zip unzip


    【解决方案1】:

    ZipArchive 不支持 URL 包装器。

    而且你的代码没有多大意义:

    • 您首先以/htdocs/file.zip 的身份将$localfile 上传到FTP 服务器

      $file = '/htdocs/file.zip';
      ftp_fput($conn_id, $file, $fp, FTP_ASCII)
      
    • 然后你尝试打开/htdocs/file.zip,因为它是一个本地文件

      $zip->open($file);
      

      但是这样的本地文件不存在。

    • 然后您尝试将该不存在的文件提取到 FTP URL。这不受支持。

      ZipArchive::open(): support stream wrappers。这是关于open,但如果open 不支持包装器,extactTo 也不支持(这是一种更难以支持的方式)。见comment by cmb

      无论如何,ZipArchive::open() 不应该接受任何流 包装器 URL,但只有真实的文件路径。它的文档没有 另有说明,“支持”的手册页也没有 协议和包装器”[1]:

      | PHP 带有许多用于各种 URL 样式的内置包装器 |用于文件系统功能的协议 [...]

      然而,ZipArchive::open() 不是一个文件系统函数 问题。

      所以,实际上,这不是一个错误,甚至不是一个文档错误 严格意义上的。因此,我将更改为功能请求。


    由于您的代码是错误的,因此很难猜测您实际上要做什么。我可以想象这两种可能性。

    • 您想将 ZIP 文件上传到 FTP 服务器并在那里解压缩。就是not possible to unzip a ZIP file on an FTP server

    • 您想将本地 ZIP 解压缩到 FTP 服务器。虽然在 ZipArchive:extractTo 调用中使用 URL 包装器似乎是可能的,但事实并非如此。正如我在上面展示的那样。也没有其他方法可以使用 PHP 中的一些简单的单行代码将本地 ZIP 文件提取到 FTP 服务器。

      您所能做的就是在本地(在网络服务器上)解压 ZIP 文件;然后逐个文件上传到FTP服务器。


    另请注意,您使用 ASCII 模式上传文件。 ZIP 格式是二进制的。以 ASCII 模式上传二进制文件,会损坏它。

    ftp_fput($conn_id, $file, $fp, FTP_ASCII);
    

    【讨论】:

      【解决方案2】:

      实际上没有一个 FTP 客户端可以在 FTP 服务器上提取或解压缩存档文件,因为 FTP 中没有这样的命令。但是,net2ftp 可以通过从您的 Web 服务器下载存档文件,在其服务器中提取文件,然后将所有文件上传回您的服务器来实现。因此,您可能会注意到,如果存档中有数千个文件,net2ftp 需要很长时间才能完成上传。

      【讨论】:

        猜你喜欢
        • 2013-09-27
        • 2015-07-05
        • 2015-04-05
        • 2013-09-26
        • 1970-01-01
        • 2010-09-05
        • 2010-12-14
        • 2018-03-31
        • 1970-01-01
        相关资源
        最近更新 更多