如何使用PHP检查远程服务器上是否存在文件?

A.B*_*per 28 php

如何使用PHP通过FTP连接检查远程服务器上是否存在特定文件?

Mer*_*ijn 51

一些建议:


Joh*_*ius 33

我用了这个,有点容易:

// the server you wish to connect to - you can also use the server ip ex. 107.23.17.20
        $ftp_server = "ftp.example.com";

// set up a connection to the server we chose or die and show an error
        $conn_id = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server");
        ftp_login($conn_id,"ftpserver_username","ftpserver_password");

// check if a file exist
        $path = "/SERVER_FOLDER/"; //the path where the file is located

        $file = "file.html"; //the file you are looking for

        $check_file_exist = $path.$file; //combine string for easy use

        $contents_on_server = ftp_nlist($conn_id, $path); //Returns an array of filenames from the specified directory on success or FALSE on error. 

// Test if file is in the ftp_nlist array
        if (in_array($check_file_exist, $contents_on_server)) 
        {
            echo "<br>";
            echo "I found ".$check_file_exist." in directory : ".$path;
        }
        else
        {
            echo "<br>";
            echo $check_file_exist." not found in directory : ".$path;  
        };

        // output $contents_on_server, shows all the files it found, helps for debugging, you can use print_r() as well
        var_dump($contents_on_server);

// remember to always close your ftp connection
        ftp_close($conn_id);
Run Code Online (Sandbox Code Playgroud)

使用的功能:(感谢middaparka)

  1. 使用ftp_connect登录

  2. 通过ftp_nlist获取远程文件列表

  3. 使用in_array查看文件是否存在于数组中


emo*_*ity 11

只需检查文件的大小.如果大小是-1,它不存在,所以:

$file_size = ftp_size($ftp_connection, "example.txt");

if ($file_size != -1) {
    echo "File exists";

} else {
    echo "File does not exist";
}
Run Code Online (Sandbox Code Playgroud)

如果大小是0,文件确实存在,它只是0字节.

资源

  • 对此保持警惕。在(某些?)ftp 服务器上,目录名称上的 ftp_size() 也返回 -1(无论它是否存在)。我理解这意味着您只能在文件上运行它,但值得注意的是这个限制。 (2认同)

Joh*_*ker 5

一个通用的解决方案是:

  1. 使用ftp_connect登录

  2. 通过ftp_chdir导航到相关目录

  3. 通过ftp_nlistftp_rawlist获取远程文件列表

  4. 使用in_array查看ftp_rawlist返回的数组中是否存在文件

就是说,如果您有相关的URL包装器,则可以简单地使用file_exists。(有关更多信息,请参见PHP FTP和FTPS协议和包装器手册。)


Pet*_*uss 5

这是@JohanPretorius解决方案的优化,以及对@Andrew等的"大型目录的缓慢和低效"的评论的答案:如果您需要多个"file_exist检查",此功能是最佳解决方案.

ftp_file_exists() 缓存最后一个文件夹

  function ftp_file_exists(
      $file, // the file that you looking for
      $path = "SERVER_FOLDER",   // the remote folder where it is
      $ftp_server = "ftp.example.com", //Server to connect to
      $ftp_user = "ftpserver_username", //Server username
      $ftp_pwd = "ftpserver_password", //Server password
      $useCache = 1  // ALERT: do not $useCache when changing the remote folder $path.
  ){

      static $cache_ftp_nlist = array();
      static $cache_signature = '';

      $new_signature = "$ftp_server/$path";

      if(!$useCache || $new_signature!=$cache_signature) 
          {
              $useCache = 0;
              //$new_signature = $cache_signature;
              $cache_signature = $new_signature;
               // setup the connection
               $conn_id         = ftp_connect($ftp_server) or die("Error connecting $ftp_server");
               $ftp_login           = ftp_login($conn_id, $ftp_user, $ftp_pwd);
               $cache_ftp_nlist = ftp_nlist($conn_id, $path);

               if ($cache_ftp_nlist===FALSE)die("erro no ftp_nlist");
          }

        //$check_file_exist = "$path/$file";
        $check_file_exist = "$file";

        if(in_array($check_file_exist, $cache_ftp_nlist)) 
            {
                echo "Found: ".$check_file_exist." in folder: ".$path;
            } 
        else 
            {
                echo "Not Found: ".$check_file_exist." in folder: ".$path;  
            };
        // use for debuging: var_dump($cache_ftp_nlist);
        if(!$useCache) ftp_close($conn_id);
    } //function end

    //Output messages
    echo ftp_file_exists("file1-to-find.ext"); // do FTP
    echo ftp_file_exists("file2-to-find.ext"); // using cache
    echo ftp_file_exists("file3-to-find.ext"); // using cache
    echo ftp_file_exists("file-to-find.ext","OTHER_FOLDER"); // do FTP
Run Code Online (Sandbox Code Playgroud)