通过PHP

时间:2016-11-09 12:14:20

标签: php file-upload ftp zip unzip

我想制作一个表格,您可以填写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

  

2 个答案:

答案 0 :(得分:1)

ZipArchive不支持网址包装。

你的代码无论如何都没有多大意义:

  • 您首先将$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

      

    无论如何,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服务器。

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

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

答案 1 :(得分:1)

实际上,任何FTP客户端都不能在FTP服务器上提取或解压缩存档文件,因为FTP中没有这样的命令。但是,net2ftp可以通过从Web服务器下载存档文件,将文件提取到其服务器中,然后将所有文件上传回服务器来实现。因此,您可能会注意到,如果存档中有成千上万个文件,则net2ftp完成上传需要花费很长时间。