我想制作一个表格,您可以在其中填写 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 对象
第 29 行 C:\xampp\htdocs\upload.php
警告:ZipArchive::close():无效或未初始化的 Zip 对象
C:\xampp\htdocs\upload.php 第 30 行
The ZipArchive
不支持 URL 包装器。
无论如何,你的代码没有多大意义:
-
你先上传$localfile
到 FTP 服务器作为/htdocs/file.zip
$file = '/htdocs/file.zip';
ftp_fput($conn_id, $file, $fp, FTP_ASCII)
-
然后你尝试打开/htdocs/file.zip
,因为它是本地文件
$zip->open($file);
但这样的本地文件不存在。
-
然后您尝试将该不存在的文件提取到 FTP URL。这不受支持。
See ZipArchive::open():支持流包装器 https://bugs.php.net/bug.php?id=68621。是关于open
,但如果open
不支持包装器,extactTo
也不会(这是一种更难支持的方式)。看到cmb 评论 https://bugs.php.net/bug.php?id=68621#1433424133:
无论如何,ZipArchive::open() 不应该接受任何流
包装 URL,但仅限真实文件路径。它的文档没有
否则,“支持”的手册页也没有说明
协议和包装器”[1]:
| PHP 附带了许多用于各种 URL 样式的内置包装器
|与文件系统功能一起使用的协议[...]
但是,ZipArchive::open() 不是一个文件系统函数
事情。
所以,实际上,这不是一个错误,甚至不是一个文档错误
严格意义上。因此我要更改为功能请求。
由于您的代码是错误的,因此很难猜测您实际上想要做什么。我可以想象这两种可能性。
-
您想要将 ZIP 文件上传到 FTP 服务器并在那里解压缩。这简直就是无法在 FTP 服务器上解压缩 ZIP 文件 https://superuser.com/q/479661/213663.
-
您想要将本地 ZIP 解压缩到 FTP 服务器。虽然看起来可以使用 URL 包装器ZipArchive:extractTo
打电话,不是。正如我上面所展示的。也没有任何其他方法可以通过 PHP 中的一些简单语句将本地 ZIP 文件提取到 FTP 服务器。
您所能做的就是在本地(在 Web 服务器上)提取 ZIP 文件;然后逐个文件上传到FTP服务器。
另请注意,您使用 ASCII 模式上传文件。 ZIP 格式是二进制的。以 ASCII 模式上传二进制文件会损坏它。
ftp_fput($conn_id, $file, $fp, FTP_ASCII);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)