Как получить размер файла на FTP-сервере? - PullRequest
0 голосов
/ 09 июля 2010

Мне нужен список всех файлов (и связанных с ними размеров файлов) на FTP-сервере. Я могу получить список файлов, используя класс FTP CodeIgniter, но не знаю, как получить размер файла. Как я могу получить размеры файлов? Спасибо.

Ответы [ 7 ]

2 голосов
/ 09 июля 2010

Только что взглянул на FTP-класс CodeIgniters. Как написано с обратным сжатием для 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, она загрузит ваше расширение.

1 голос
/ 09 июля 2010

Я ничего не знаю о классе FTP CodeIgniter, но как насчет этого?

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

Я предполагаю, что метод list_files () класса FTP не предоставляет эту информацию. Это правильно?

0 голосов
/ 14 августа 2014

После тяжелой работы этот код прекрасно работает !!!!и я хочу поделиться с сообществом (от 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);

Хороший код!Fernando

0 голосов
/ 09 июля 2010

Поскольку 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);

В $ файлах вы должны получить одну строку на файл, содержащую права доступа к файлу, владельца / группы, размера файлаи имя файла.Вам придется проанализировать это, чтобы отобразить их отдельно.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Просто скопируйте / вставьте информацию о соединении из руководства по CI, добавьте последнюю строку на основе исходного кода CI, YMMV: p.

0 голосов
/ 09 июля 2010

Обратите внимание, что существует вероятность того, что на FTP-сервере отключены определенные функции, или он не позволит вам затем вызвать (например, функцию filesize ()).Кроме того, стандартные функции fileize () http://php.net/manual/en/function.filesize.php должны работать поверх ftp

0 голосов
/ 09 июля 2010

Относительно просто расширить класс 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 ().

0 голосов
/ 09 июля 2010

Использование помощника файла

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

При наличии файла и пути возвращает имя, путь, размер, дату изменения.Второй параметр позволяет вам явно объявить, какую информацию вы хотите вернуть;Возможные варианты: имя, путь_сервера, размер, дата, читабельный, доступный для записи, исполняемый, файловые поля.Возвращает FALSE, если файл не может быть найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...