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

标签 php file-upload ftp zip unzip

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

<?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>

错误

Successfully uploaded

ftp://:@ftp.***.com/htdocs/file.zip Warning: ZipArchive::extractTo(): Invalid or uninitialized Zip object in C:\xampp\htdocs\upload.php on line 29

Warning: ZipArchive::close(): Invalid or uninitialized Zip object in 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(): support stream wrappers .关于 open , 但如果 open不支持包装器,extactTo也不会(这是一种更难支持的方式)。查看comment by cmb :

    Anyhow, ZipArchive::open() is not supposed to accept any stream wrapper URLs, but only real file paths. Its documentation doesn't tell otherwise, and neither does the man page on "Supported Protocols and Wrappers"[1]:

    | PHP comes with many built-in wrappers for various URL-style | protocols for use with the filesystem functions [...]

    但是,ZipArchive::open() 不是一个文件系统函数

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


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

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

  • 您想将本地 ZIP 解压缩到 FTP 服务器。虽然看起来可以在 ZipArchive:extractTo 中使用 URL 包装器打电话,不是正如我在上面展示的那样。也没有任何其他方法可以使用 PHP 中的一些简单的一行代码将本地 ZIP 文件提取到 FTP 服务器。

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


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

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

关于php - 通过 PHP 上传 ZIP 文件和 UNZIP ftp 文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40506789/

相关文章:

.net - 解析来自 FTP LIST 命令的响应(语法变体)

php - 比较两个相同的字符串在 PHP 中返回 false

php: 从字符串中删除 URL

jquery - 限制多个文件的上传大小

PHP通过内部php函数上传单按钮文件

java - Apache FTPS 客户端 storeFile 从 Unix/Linux/Max 问题到 Windows FTPS 服务器

php - 获取行直到数量满足

php - 如何使用 laravel 迁移

javascript - primefaces上传后如何重新加载jsf页面?

java - 使用Java访问网络中的文件