【问题标题】:How to Get File Size of Files on FTP Server?如何获取 FTP 服务器上文件的文件大小?
【发布时间】:2010-07-09 09:14:13
【问题描述】:

我需要一个 FTP 服务器上所有文件(以及相关文件大小)的列表。我可以使用 CodeIgniter 的 FTP 类获取文件列表,但不知道如何获取文件大小。如何获取文件大小?谢谢。

【问题讨论】:

    标签: php codeigniter ftp


    【解决方案1】:

    刚刚快速浏览了 CodeIgniters FTP 类。由于它是为 PHP4 向后兼容编写的,如果你必须这样做,你可能可以这样做(黑客工作)。

    <?php
    $files = $this->ftp->list_files('/folder/');
    
    foreach ($files as $file)
    {
      echo 'File:'. $file .' Size: '. ftp_size($this->ftp->conn_id, $file) .' <br />';
    }
    $this->ftp->close();
    

    我不建议这样做 - 可能值得扩展主要的 CI ftp 类

    class FTP extends CI_FTP
    {
    
      function FTP()
      {
        // call parent constructor
        parent::CI_FTP();
      }
    
      // Single file size
      function file_size($file)
      {
        return ftp_size($this->conn_id, $file);
      }
    }
    

    将以上内容放入您的应用程序/库中并将其保存为 ftp.php。如果您正在运行 CI 的更新版本,它将加载您的扩展。

    【讨论】:

      【解决方案2】:

      我对 CodeIgniter 的 FTP 类一无所知,但是这个呢?

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

      我假设 FTP 类的 list_files() 方法不提供此信息。对吗?

      【讨论】:

      • 我认为他想坚持使用 CI 的 FTP 功能(ftp_rawlist() 可能需要使用 PHP 的内置功能打开 FTP 连接)。但是,看起来 CI 实际上并没有提供该功能。
      • @Pekka:CI FTP 类是标准 PHP FTP 函数的简单包装类,因此很容易扩展它并添加一个额外的包装函数来执行 ftp_rawlist。 CI 的 list_files 只是调用 ftp_nlist 顺便说一句。
      • ftp_rawlist 为我做了。只需要解析我感兴趣的部分。不想使用 ftp_size 因为服务器并不总是支持它。
      【解决方案3】:

      请注意,有一个问题是 FTP 服务器禁用了某些功能,否则它不会让您调用 then(例如 filesize() 函数)。 此外,标准的 filesize() http://php.net/manual/en/function.filesize.php 函数应该在 ftp 上工作

      【讨论】:

        【解决方案4】:

        由于 CI 仍然与 PHP 4 兼容,您可能可以按如下方式快速而肮脏地完成它:

        $this->load->library('ftp');
        
        $config['hostname'] = 'ftp.example.com';
        $config['username'] = 'your-username';
        $config['password'] = 'your-password';
        $config['debug'] = TRUE;
        
        $this->ftp->connect($config);
        $files = ftp_rawlist($this->ftp->conn_id, $path);
        

        在 $files 中,每个文件应该有一行,包含文件权限、所有者/组、文件大小和文件名。您必须对其进行解析才能分别显示它们。

        免责声明:只需复制/粘贴 CI 手册中的连接信息,根据 CI 源代码添加最后一行,YMMV:p。

        【讨论】:

          【解决方案5】:

          扩展CI FTP类比较简单:

          class MY_FTP extends CI_FTP {
          
              function MY_FTP()
              {
                  parent::CI_FTP();
              }
          
              function get_file_size()
              {
          
              }
          }
          

          基本上只是让 get_ftp_size() 成为以下内容的包装器:

          return ftp_size($conn, $file);
          

          http://php.net/manual/en/function.ftp-size.php

          我希望这会有所帮助(如果您遇到困难,只需浏览一下安装的 ftp.php 文件;您应该很快就会找到自己的方式)

          编辑

          由于 wimvds 正确地建议 ftp_rawlist() 可能是更可取/更简单的选项,我什至可以建议更改 list_files() 以使用 ftp_rawlist()。

          【讨论】:

          • ftp_rawlist 添加一个包装器可能会更容易,因此您可以在一个 FTP 命令中同时拥有文件名和大小......不过,您将不得不解析结果(因为它每个文件只返回一个字符串)。
          【解决方案6】:

          经过努力,这段代码运行良好!!!!我想与社区分享(通过 MundialSYS)

          function dirFTPSize($ftpStream, $dir) {
              $size = 0;
              $files = ftp_nlist($ftpStream, $dir);
          
              foreach ($files as $remoteFile) {
                  if(preg_match('/.*\/\.\.$/', $remoteFile) || preg_match('/.*\/\.$/', $remoteFile)){
                      continue;
                  }
                  $sizeTemp = ftp_size($ftpStream, $remoteFile);
                  if ($sizeTemp > 0) {
                      $size += $sizeTemp;
                  }elseif($sizeTemp == -1){//directorio
                      $size += dirFTPSize($ftpStream, $remoteFile);
                  }
              }
          
              return $size;
          }
          
          $hostname = '127.0.0.1'; // or 'ftp.domain.com'
          $username = 'username';
          $password = 'password';
          $startdir = '/public_html'; // absolute path
          $files = array();
          $ftpStream = ftp_connect($hostname);
          $login = ftp_login($ftpStream, $username, $password);
          if (!$ftpStream) {
              echo 'Wrong server!';
              exit;
          } else if (!$login) {
              echo 'Wrong username/password!';
              exit;
          } else {
              $size = dirFTPSize($ftpStream, $startdir);
          }
          
          echo number_format(($size / 1024 / 1024), 2, '.', '') . ' MB';
          
          ftp_close($ftpStream);
          

          好代码! 费尔南多

          【讨论】:

            【解决方案7】:

            使用file helper

            get_file_info('path/to/file', $file_information)
            

            给定文件和路径,返回名称、路径、大小、修改日期。第二个参数允许你显式声明你想要返回什么信息;选项有:名称、服务器路径、大小、日期、可读、可写、可执行、文件权限。如果找不到文件,则返回 FALSE。

            【讨论】:

            • 我看不出这应该如何通过 FTP 连接工作?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-01-31
            • 2021-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-25
            相关资源
            最近更新 更多