cURL: можно ли определить размер переданных данных НА сервер?

  • Автор темы Автор темы DDT
  • Дата начала Дата начала

DDT

Новичок
curl: можно ли определить размер переданных данных НА сервер?

Привет.

Вот тестовый код, загружающий файл file.zip на удаленный сервер:
PHP:
// Задаем скрипт на сайте B, который примет наш запрос и обработает его
$url = 'http://test/';
		
// Указываем файл, который мы хотим передать сайту B
// Если файл находится не в текущей дирректории, то необходимо
// указать путь до файла
$file = dirname(__FILE__).'../../file.zip';
		
// Узнаем размер передаваемого файла
$filesize = filesize($file);
		
// Узнаем имя файла (в случае, если в $file указан полный путь до файла)
$pathinfo = pathinfo($file);
$filename = $pathinfo['basename'];
		
// Открываем передаваемый файл на чтение
// для дальнейшей его передачи
$fp = fopen($file, 'r');
		
// Инициализируем сеанс CURL
$ch = curl_init();
		
// Задаем параметры для открытого сеанса CURL
		
// Указываем URL скрипта, который примет наш запрос
// К имени скрипта добавляем переменную, содержащую имя передаваемого файла
// Чтобы это имя было доступно в принимающем скрипте из массива $_GET
curl_setopt($ch, CURLOPT_URL, $url . '?filename=' . $filename);
		
// Указываем файл (а вернее дескриптор открытого на чтение файла), который собираемся передать
curl_setopt($ch, CURLOPT_INFILE, $fp);
		
// Указываем предполагаемый размер отправляемого файла
curl_setopt($ch, CURLOPT_INFILESIZE, $filesize);
		
// Указываем, что файл передается методом PUT
curl_setopt($ch, CURLOPT_PUT, true);
		
// Указываем, что будет производиться закачка на удаленный сервер
curl_setopt($ch, CURLOPT_UPLOAD, true);
		
// Выполняем запрос CURL
curl_exec($ch);
		
// Завершаем сеанс CURL
curl_close($ch);

Все работает нормально. Т. к. предполагается передавать файлы большого размера (50 - 100 Мб), то хочу сделать прогрессбар загрузки файла. Для этого мне надо периодически определять количество переданных байт на сервер.

Как это можно сделать?
 
можно повесить врапер на поток, через который считывать файл, и в нем считать

-~{}~ 28.03.09 13:27:

тээк, а где же война модеров со словом курл? ждем
можно делать ставки на время, через которое этот топик закроют
(очевидно, не сканирование, но кого это волнует :))
 
DDT
Можно брать информацию с хоста, на который заливаешь :)
 
Farsh

у меня тоже была такая идея.

Как ты это видишь:
периодически отправителем запрашивать получателя "Ну что, сколько принялось?", в ответ получать "Столько-то байт" и сравнивать?

Если делать так, что как параллельно с отправкой спрашивать, в другом потоке? Что-то смутно я это представляю.

grigori
можно подробнее про врапер на потоке узнать?

P.S.
заголовок темы скорректировал :)
 
DDT
Впринципе если захотеть, то можно как-нить придумать. Например сделать multipart запрос, где помимо файла будет передан какой-то идентификатор именно для этого файла, который потом куда-нибудь записывается вместе с путём до .tmp файла. Далее параллельно другим скриптом через определенный промежуток делаешь запрос с этим же идентификатором и возвращаешь тот самый размер файла ;)
 
DDT, если достаточно знать, сколько байт отправил curl в поток, то решение grigori исчерпывающее
 
DDT, в мануал надо ходить самостоятельно

как сказал fixxxer, можно написать с хендлером курла
http://ru.php.net/manual/en/function.curl-setopt.php
найди CURLOPT_READFUNCTION

или не трогать курл и поставить враппер:
http://ru.php.net/stream_wrapper_register

на всякий случай предупрежу - с вопросом "а как же это написать, помогите" топик будет в корзине
читай, врубайся

Farsh
ты пишешь чушь
 
grigori
я знаю что чушь, но она будет работать? будет ;) Меня спросили , как это можно сделать - я написал.
 
Farsh
1. это возможно только при специальной компиляции PHP на сервере-приемнике - что далеко не факт
2. скрипт, который отправляет файл, не сможет узнать, сколько данных передано,
твой вариант маловероятен, не задачу решает, а ставит костыль
как максимум, ты сделаешь скрипт-прокси для ajax-запросов браузера таким способом

и на кой $%^ ты пишешь, зная, что это чушь, и тратя время ТС?
 
grigori
Да, немного тупанул на ночь глядя в предложенной реализации ( по крайне мере, которая показалась интересной мне самому ) , извиняюсь. По поводу
2. скрипт, который отправляет файл, не сможет узнать, сколько данных передано
это и так ясно.
Мне пришла в голову мысль - я ее подал. И я на это имею право, а также и на ошибку. И не $%^ тут гнать. Время я ничьё не трачу, ТС не дурак и сам понимает, что это прототип извращенного варинта.
 
Автор оригинала: DDT

Все работает нормально. Т. к. предполагается передавать файлы большого размера (50 - 100 Мб), то хочу сделать прогрессбар загрузки файла. Для этого мне надо периодически определять количество переданных байт на сервер.

Как это можно сделать?
Пропиарю свой могучий HTTP_Request2, который умеет использовать как cURL, так и Socket'ы и умеет кидать текущую информацию observer'ам.

Кстати с PUT'ом я его особо не тестировал, будет интересно узнать, нет ли косяков.
 
Sad Spirit
спасибо! гляну :)

-~{}~ 30.03.09 21:55:

даже могу помочь, если не против
 
Sad Spirit
понял! скачаю, прочту, напишу что думаю :)
 
Сверху