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

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 Мб), то хочу сделать прогрессбар загрузки файла. Для этого мне надо периодически определять количество переданных байт на сервер.

Как это можно сделать?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
можно повесить врапер на поток, через который считывать файл, и в нем считать

-~{}~ 28.03.09 13:27:

тээк, а где же война модеров со словом курл? ждем
можно делать ставки на время, через которое этот топик закроют
(очевидно, не сканирование, но кого это волнует :))
 

Farsh

~ on ~ high ~ wave ~
DDT
Можно брать информацию с хоста, на который заливаешь :)
 

DDT

Новичок
Farsh

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

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

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

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

P.S.
заголовок темы скорректировал :)
 

Farsh

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

weregod

unserializer
DDT, если достаточно знать, сколько байт отправил curl в поток, то решение grigori исчерпывающее
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
DDT, в мануал надо ходить самостоятельно

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

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

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

Farsh
ты пишешь чушь
 

Farsh

~ on ~ high ~ wave ~
grigori
я знаю что чушь, но она будет работать? будет ;) Меня спросили , как это можно сделать - я написал.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Farsh
1. это возможно только при специальной компиляции PHP на сервере-приемнике - что далеко не факт
2. скрипт, который отправляет файл, не сможет узнать, сколько данных передано,
твой вариант маловероятен, не задачу решает, а ставит костыль
как максимум, ты сделаешь скрипт-прокси для ajax-запросов браузера таким способом

и на кой $%^ ты пишешь, зная, что это чушь, и тратя время ТС?
 

Farsh

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

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: DDT

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

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

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

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Sad Spirit
спасибо! гляну :)

-~{}~ 30.03.09 21:55:

даже могу помочь, если не против
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Sad Spirit
понял! скачаю, прочту, напишу что думаю :)
 
Сверху