通过PHP上传ZIP文件和UNZIP ftp文件夹


Upload a ZIP file and UNZIP ftp folder via PHP

我想做一个表格,你可以填写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警告::extractTo():无效或未初始化的Zip对象C:'xampp'htdocs'upload.php第29行

警告:ZipArchive::close():无效或未初始化的Zip对象C:'xampp'htdocs'upload.php on line 30

ZipArchive不支持URL包装器

你的代码没有多大意义:

  • 首先将$localfile作为/htdocs/file.zip上传到FTP服务器

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

    $zip->open($file);
    

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

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

    参见ZipArchive::open():支持流包装器。这是关于open的,但是如果open不支持包装器,那么extactTo也不会(这是一种更难以支持的方式)。请看cmb的评论:

    无论如何,ZipArchive::open()不应该接受任何流包装器url,但只能使用真实的文件路径。它的文档没有说明并非如此,手册页上的"支持"也没有说明协议和包装"[1]:

    | PHP为各种url样式提供了许多内置包装器|文件系统函数使用的协议[…]

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

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


因为你的代码是错误的,所以很难猜测你到底想做什么。我可以想象这两种可能性。

  • 您想要上传一个ZIP文件到FTP服务器并在那里解压缩它。在FTP服务器上解压缩ZIP文件是不可能的。

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

    你所能做的就是在本地(在web服务器上)提取ZIP文件;然后逐个文件上传到FTP服务器。

    • 创建一个临时文件夹并提取(ZipArchive::extractTo) ZIP存档。

    • 上传临时文件夹到FTP服务器

      参见PHP - ftp_put +复制整个文件夹结构

    • 删除临时文件夹


还要注意,您使用ASCII模式上传文件。ZIP格式是二进制文件。通过以ASCII模式上传二进制文件,您会损坏它。

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

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

您可以分三步完成=>

步骤1:上传你的zip文件(uploed .zip)到ftp服务器。代码=比;ftp_put($ftp, $remote_file, "Upload,zip", FTP_BINARY) ;第二步:再上传一个文件到ftp服务器,我们将其命名为Extractor.php,其中包含提取zip文件的代码。代码=祝辞

$zip = new ZipArchive;
$res = $zip->open('uploaded.zip');
if ($res === TRUE) {
    $zip->extractTo('extract/path/');
    $zip->close();
    echo "Extracted" ;
    unlink("uploaded.zip");
} else {
    echo "Zip Corrupted" ;
}

步骤3:在上传完这两个文件后,使用curl调用Extractor.php。代码=祝辞

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://url/where/it/will/be/displayed/Extractor.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
print_r($output) ;

希望对你也有帮助。