【问题标题】:Why would uploading a zip file via ftp_fput return true but not upload the file?为什么通过 ftp_fput 上传 zip 文件返回 true 但不上传文件?
【发布时间】:2012-09-07 09:01:58
【问题描述】:

以下命令返回 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,但不会上传文件。

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

附加信息:

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

我也在指定:

ftp_pasv($this->ftpConnectionId, true);

【问题讨论】:

    标签: php xml ftp


    【解决方案1】:

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

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

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

    【讨论】:

    • 对不起,我复制错了:我使用 FTP_BINARY 和二进制 zip 文件,上面已更正
    • 如果您尝试不同的扩展名,例如 .bin 而不是 .xml,会怎样?由于 .xml 扩展名,传输编码可能隐式更改回 ASCII。
    • 但是使用 FileZilla 手动上传 zip 文件是可行的,我在它的日志中看到它设置了 TYPE I(这是我对 FTP_BINARY 所做的),它还设置了我也使用 ftp_pasv 所做的 PASV。
    • FTP服务器不保存日志吗?这种方式只是猜测,但日志可能会告诉您更多信息。
    • 谢谢,查询并查看日志最终解决了问题
    【解决方案2】:

    这是因为 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;
                }
    

    【讨论】:

    • 我们在这里使用 FTP_BINARY 进行上传
    猜你喜欢
    • 2023-03-08
    • 2020-02-05
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    相关资源
    最近更新 更多