Получение прогресса ftp_put - PullRequest
4 голосов
/ 22 мая 2010

У меня есть php-скрипт на веб-сервере, который загружает файл на другой удаленный сервер через ftp_put.

Как я могу отобразить текущий прогресс загрузки для пользователя?

Единственное подобноеСистема, которую я видел, предназначена для загрузки файлов от пользователя с ajax-запросами для проверки локального размера загружаемого файла на сервер.

Эквивалентная система - это ajax-запросы к веб-серверу, который затем проверяетсяразмеры файлов на удаленном сервере и вернули эти данные в клиентский скрипт пользователя.

Это кажется мне ужасно неэффективным.Есть ли лучший способ?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2017

Это может быть легко реализовано с помощью Оболочек протокола URL FTP :

$url = "ftp://username:password@ftp.example.com/remote/dest/path/file.zip";
$local_path = "/local/source/path/file.zip";

$size = filesize($local_path) or die("Cannot retrieve size file");

$hout = fopen($url, "wb") or die("Cannot open destination file");
$hin = fopen($local_path, "rb") or die("Cannot open source file");

while (!feof($hin))
{
    $buf = fread($hin, 10240);
    fwrite($hout, $buf);
    echo "\r".intval(ftell($hin)/$size*100)."%";
}

echo "\n";

fclose($hin);
fclose($hout);
1 голос
/ 22 мая 2010

Если ftp-сервер на другом компьютере поддерживает команду REST (перезапустите загрузку с определенной точки), существует грязный способ реализовать это:

  1. создать временный файл
  2. поставить X байтв этот файл из файла, который вы хотите загрузить
  3. загрузить временный файл
  4. записать статус в другой файл (или сеанс, но не уверен, будет ли он работать)
  5. добавить другойX байтов во временный файл
  6. Загрузка начальной формы временного файла X байтов
  7. статус записи в файл
  8. повторение 5-7 до полной загрузки файла
  9. удалениевременные файлы и файлы состояния.

Пример кода:

$fs = filesize('file.bin');
define('FTP_CHUNK_SIZE', intval($fs * 0.1) ); // upload ~10% per iteration

$ftp = ftp_connect('localhost') or die('Unable to connect to FTP server');
ftp_login($ftp, 'login', 'pass') or die('FTP login failed');

$localfile = fopen('file.bin','rb');

$i = 0;
while( $i < $fs )
{
    $tmpfile = fopen('tmp_ftp_upload.bin','ab');
    fwrite($tmpfile, fread($localfile, FTP_CHUNK_SIZE));
    fclose($tmpfile);

    ftp_put($ftp, 'remote_file.bin', 'tmp_ftp_upload.bin', FTP_BINARY, $i);
    // Remember to put $i as last argument above

    $progress = (100 * round( ($i += FTP_CHUNK_SIZE)  / $fs, 2 ));
    file_put_contents('ftp_progress.txt', "Progress: {$progress}%");
}
fclose($localfile);
unlink('ftp_progress.txt');
unlink('tmp_ftp_upload.bin'); // delete when done

И файл для проверки с помощью ajax:

if(file_exists('ftp_progress.txt'))
    echo file_get_contents('ftp_progress.txt');
else
    echo 'Progress: 0%';
exit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...