1

次のコマンドは 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 が返されますが、ファイルはアップロードされません。

この奇妙な行動の理由は何でしょうか?

追加情報:

zip ファイルは、同じアカウントで FileZilla 経由で問題なくアップロードできます。

私も指定しています:

ftp_pasv($this->ftpConnectionId, true);
4

2 に答える 2

3

zipfile はバイナリ ファイルです。これがおそらく、.xml としてアップロードするとファイルが破損する理由です。FTP_ASCII の代わりに FTP_BINARY を指定してみてください。FTP_BINARY は ascii ファイルでも機能しますが、その逆は機能しないため、常に FTP_ASCII よりも常に FTP_BINARY を使用することをお勧めします。

ftp サーバーはさまざまな理由でファイルを拒否する場合があるため、最初はアップロードを許可しても、その後ファイルを保存しない場合があります。ascii/binary の問題が 1 つである可能性がありますが、一部のファイル拡張子がブラックリストに登録されているか、ファイルが大きすぎる可能性もあります。ただし、別の拡張子の 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 に答える