通过 PHP 上传 ZIP 文件并解压缩 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>
错误
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. It's about open
, but if open
does not support wrappers, the extactTo
won't either (it's a way more difficult to support). See a 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 服务器
您所能做的就是在本地(在网络服务器上)提取 ZIP 文件;然后逐个文件上传到 FTP 服务器。
创建一个临时文件夹并在其中提取 (ZipArchive::extractTo
) ZIP 存档。
将临时文件夹上传到 FTP 服务器。
参见 PHP - ftp_put + Copy Entire Folder Structure。
删除临时文件夹。
另请注意,您使用 ASCII 模式上传文件。 ZIP 格式是二进制的。通过以 ASCII 模式上传二进制文件,您会损坏它。
ftp_fput($conn_id, $file, $fp, FTP_ASCII);
实际上 FTP 的 none 客户端可以在 FTP 服务器上提取或解压缩存档文件,因为 FTP 中没有这样的命令。但是,net2ftp 通过从您的 Web 服务器下载存档文件,在他们的服务器中提取文件,然后将所有文件上传回您的服务器,使之成为可能。因此,您可能会注意到,如果存档中有数千个文件,net2ftp 需要很长时间才能完成上传。
我想制作一个表格,您可以在其中填写 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>
错误
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 包装器。
而且你的代码也没什么意义:
您首先将
上传到 FTP 服务器$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. It's about
open
, but ifopen
does not support wrappers, theextactTo
won't either (it's a way more difficult to support). See a 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 服务器。虽然看起来可以在
中的一些简单的单行将本地 ZIP 文件提取到 FTP 服务器ZipArchive:extractTo
调用中使用 URL 包装器,但事实并非如此。正如我在上面展示的那样。也没有任何其他方法可以使用 PHP.您所能做的就是在本地(在网络服务器上)提取 ZIP 文件;然后逐个文件上传到 FTP 服务器。
创建一个临时文件夹并在其中提取 (
ZipArchive::extractTo
) ZIP 存档。将临时文件夹上传到 FTP 服务器。
参见 PHP - ftp_put + Copy Entire Folder Structure。
删除临时文件夹。
另请注意,您使用 ASCII 模式上传文件。 ZIP 格式是二进制的。通过以 ASCII 模式上传二进制文件,您会损坏它。
ftp_fput($conn_id, $file, $fp, FTP_ASCII);
实际上 FTP 的 none 客户端可以在 FTP 服务器上提取或解压缩存档文件,因为 FTP 中没有这样的命令。但是,net2ftp 通过从您的 Web 服务器下载存档文件,在他们的服务器中提取文件,然后将所有文件上传回您的服务器,使之成为可能。因此,您可能会注意到,如果存档中有数千个文件,net2ftp 需要很长时间才能完成上传。