为什么通过ftp_fput上传zip文件会返回true但不上传文件?

时间:2012-09-07 09:01:59

标签: php xml ftp

以下命令返回true并将文本XML文件上载到FTP服务器:

if (ftp_put($this->ftpConnectionId, $this->remoteXmlFileName, $this->localXmlFileName, FTP_ASCII)) {

但是,当我尝试上传文本XML文件的.zip文件内容时,它仍然返回true但不上传文件:

if (ftp_put($this->ftpConnectionId, $this->remoteXmlFileName, $this->localXmlFileName, FTP_BINARY)) {

我发现如果我只是将zip文件重命名为“.xml”,它将上传文件,但.zip文件已损坏。

但如果我将zip文件重命名为“.zip.xml”,它会再次返回true,但不会上传文件。

这种奇怪行为可能是什么原因?

其他信息:

可以通过FileZilla上传zip文件,同一帐户没问题。

我也在指定:

ftp_pasv($this->ftpConnectionId, true);

2 个答案:

答案 0 :(得分:2)

zipfile是二进制文件。这可能是为什么将它上传为.xml会破坏文件的原因。尝试指定FTP_BINARY而不是FTP_ASCII。 FTP_BINARY也适用于ascii文件,但反之亦然,因此您最好始终使用FTP_BINARY而不是FTP_ASCII。

ftp服务器可能由于多种原因拒绝该文件,因此它可能首先允许上传,但之后不保存该文件。 ascii / binary问题可能是一个,但也有一些文件扩展名可能被列入黑名单,或者文件可能太大。但是后者不太可能,因为上传带有不同扩展名的zipfile可以为你工作。

我认为ftp服务器会主动忽略zip文件。

答案 1 :(得分:0)

这是因为zip文件包含文件,大小可能大于您的XMl

我们已使用此代码通过ftp上传整个目录

试试这段代码。这适用于你的ftp

//Start ftp upload code
    $ftp_user_name =$_SESSION['upload']['username'];
    $ftp_user_pass = $_SESSION['upload']['password'];
    $ftp_server = $_SESSION['upload']['host'];
    $sourcepath = $_SESSION['upload']['source'];
    $dest_folder = $_SESSION['upload']['dest_folder'];          
    $conn_id = @ftp_connect($ftp_server,21) or die("Couldn't connect to $ftp_server");
    if (@ftp_login($conn_id, $ftp_user_name, $ftp_user_pass)) {
        ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 70000000000000000); // Set the network timeout to 10 seconds
        ftp_copyAll($conn_id, $sourcepath, $dest_folder);

       }


      function ftp_copyAll($conn_id, $src_dir, $dst_dir) {
                if(is_dir($dst_dir)){
                    return "Dir $dst_dir Already exists";
                } else {
                    $d = dir($src_dir);
                    ftp_mkdir($conn_id, $dst_dir); //echo "creat dir $dst_dir";
                    while($file = $d->read()) { // do this for each file in the directory
                        if ($file != "." && $file != "..") { // to prevent an infinite loop
                            if (is_dir($src_dir."/".$file)) { // do the following if it is a directory
                            $src_dir_path=$src_dir."/".$file;
                            $dst_dir_path=$dst_dir."/".$file;

                            ftp_copyAll($conn_id, $src_dir_path, $dst_dir_path); // recursive part
                            } else {                        
                                $upload = ftp_put($conn_id, $dst_dir."/".$file, $src_dir."/".$file, FTP_BINARY); // put the files
                                //echo "creat files::: ".$dst_dir."/".$file ."";
                                echo " ";
                            }
                        }
                        ob_flush() ;
                        flush(); 
                        usleep(90000);
                        //sleep(1);
                    }
                    $d->close();
                }
                 return true;
            }