1

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

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

但是,当我尝试上传 .zip 文件而不是文本 XML 文件时,它仍然返回 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);
4

2 回答 2

3

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

ftp 服务器可能出于多种原因拒绝该文件,因此它可能首先允许上传,但随后不保存文件。ascii/binary 问题可能是其中之一,但某些文件扩展名可能被列入黑名单,或者文件可能太大。不过,后者不太可能,因为上传具有不同扩展名的 zip 文件对您有用。

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

于 2012-09-07T09:10:29.420 回答
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;
            }
于 2012-09-07T09:10:14.300 回答