How can I check if a file exists on a remote server using PHP?

后端 未结 6 1231
时光取名叫无心
时光取名叫无心 2020-12-02 20:47

How can I check if a specific file exists on a remote server using PHP via FTP connections?

相关标签:
6条回答
  • 2020-12-02 20:55

    You can use ftp_nlist to list all the files on the remote server. Then you should search into the result array to check if the file what you was looking for exists.

    http://www.php.net/manual/en/function.ftp-nlist.php

    0 讨论(0)
  • 2020-12-02 20:59

    Just check the size of a file. If the size is -1, it doesn't exist, so:

    $file_size = ftp_size($ftp_connection, "example.txt");
    
    if ($file_size != -1) {
        echo "File exists";
    
    } else {
        echo "File does not exist";
    }
    

    If the size is 0, the file does exist, it's just 0 bytes.

    Source

    0 讨论(0)
  • 2020-12-02 21:00

    A general solution would be to:

    1. Login using ftp_connect

    2. Navigate to the relevant directory via ftp_chdir

    3. Get the remote file list via ftp_nlist or ftp_rawlist

    4. Use in_array to see if the file was present in the array returned by ftp_rawlist

    That said, you could potentially simply use file_exists if you have the relevant URL wrappers available. (See the PHP FTP and FTPS protocols and wrappers manual page for more information.)

    0 讨论(0)
  • 2020-12-02 21:02

    Some suggestions:

    • Use ftp_size, which returns -1 if it doesn't exist: http://www.php.net/manual/en/function.ftp-size.php
    • Use fopen, e.g. fopen("ftp://user:password@example.com/somefile.txt", "r")
    • Use ftp_nlist, check to see if the filename you want is in the list: http://www.php.net/manual/en/function.ftp-nlist.php
    0 讨论(0)
  • 2020-12-02 21:11

    I used this, a bit easier:

    // 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);
    

    Functions used: (thanks to middaparka)

    1. Login using ftp_connect

    2. Get the remote file list via ftp_nlist

    3. Use in_array to see if the file was present in the array

    0 讨论(0)
  • 2020-12-02 21:12

    This is an optimization of @JohanPretorius solution, and an answer for comments about "slow and inefficient for large dirs" of @Andrew and other: if you need more than one "file_exist checking", this function is a optimal solution.

    ftp_file_exists() caching last folder

      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
    
    0 讨论(0)
提交回复
热议问题