Если ftp-сервер на другом компьютере поддерживает команду REST
(перезапустите загрузку с определенной точки), существует грязный способ реализовать это:
- создать временный файл
- поставить X байтв этот файл из файла, который вы хотите загрузить
- загрузить временный файл
- записать статус в другой файл (или сеанс, но не уверен, будет ли он работать)
- добавить другойX байтов во временный файл
- Загрузка начальной формы временного файла X байтов
- статус записи в файл
- повторение 5-7 до полной загрузки файла
- удалениевременные файлы и файлы состояния.
Пример кода:
$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;