我想做一个表格,你可以填写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) ;
希望对你也有帮助。