我想制作一个表格,您可以填写FTP登录服务器并获取上传ZIP文件的选项。该脚本与我想要执行UNZIP上传文件的最后一部分(UNZIP文件)不同。有谁知道这是什么问题? 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对象 第29行的C:\ xampp \ htdocs \ upload.php
警告:ZipArchive :: close():无效或未初始化的Zip对象 第30行的C:\ xampp \ htdocs \ upload.php
答案 0 :(得分:1)
ZipArchive
不支持网址包装。
你的代码无论如何都没有多大意义:
您首先将$localfile
作为/htdocs/file.zip
$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 ZIP file on the ZIP server。
您想要将本地ZIP解压缩到FTP服务器。虽然在ZipArchive:extractTo
调用中似乎可以使用URL包装器,但事实并非如此。正如我上面所示。也没有任何其他方法可以使用PHP中的一些简单的单行程序将本地ZIP文件解压缩到FTP服务器。
您所能做的就是在本地提取ZIP文件(在Web服务器上);然后逐个文件地将其上传到FTP服务器。
创建一个临时文件夹并在那里提取(ZipArchive::extractTo
)ZIP存档。
将临时文件夹上传到FTP服务器。
删除临时文件夹。
另请注意,您使用ASCII模式上传文件。 ZIP格式是二进制格式。通过以ASCII模式上传二进制文件,会损坏它。
ftp_fput($conn_id, $file, $fp, FTP_ASCII);
答案 1 :(得分:1)
实际上,任何FTP客户端都不能在FTP服务器上提取或解压缩存档文件,因为FTP中没有这样的命令。但是,net2ftp可以通过从Web服务器下载存档文件,将文件提取到其服务器中,然后将所有文件上传回服务器来实现。因此,您可能会注意到,如果存档中有成千上万个文件,则net2ftp完成上传需要花费很长时间。