Приветствую. Можно ли каким-либо образом вычислить размер загружаемого файла создающегося динамически. Т.е. есть ссылка с параметрами, в зависимости от параметров сервер возвращает файл. Проблема в том, что я не могу узнать вес файла пока не скачаю его. Может быть можно узнать вес файла пока он скачивается, т.е. периодически проверять его размер и если он превышает ограничения, то прерывать загрузку? Добавлено спустя 2 минуты 23 секунды: и еще один вопрос. в процессе загрузки большого файла, пока курл работает, сам сайт (его другие страницы) не загружается. как-то можно это делать асинхронно?
Если я правильно понял, проблема в том, чтобы пользователь не смог забить трафик своими попытками залить на сервер черезчур большой файл. Кажется для таких случаев в htaccess есть несколько директив управляющих максимальным размером загружаемых файлов.
Если я вас правильно понял, то вам необходимо узнать размер файла по ссылке, до его загрузки. Я думаю решением является читать заголовки ответа сервера (файл не загружается). Вам нужен заголовок Content-Length. Источник кода http://php.ru/manual/function.filesize.html Код (Text): <?php $remoteFile = 'http://us.php.net/get/php-5.2.10.tar.bz2/from/this/mirror'; $ch = curl_init($remoteFile); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //not necessary unless the file redirects (like the PHP example we're using here) $data = curl_exec($ch); curl_close($ch); if ($data === false) { echo 'cURL failed'; exit; } $contentLength = 'unknown'; $status = 'unknown'; if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/', $data, $matches)) { $status = (int)$matches[1]; } if (preg_match('/Content-Length: (\d+)/', $data, $matches)) { $contentLength = (int)$matches[1]; } echo 'HTTP Status: ' . $status . "\n"; echo 'Content-Length: ' . $contentLength; ?> Добавлено спустя 7 минут 21 секунду: Есть также способ без использования curl http://www.internet-technologies.ru/articles/article_839.html
Epsilon, пока не придумал как тут htaccess использовать, если ссылку передаю в курл, а он уже загружает, отработают ли правила? У меня прописано php_value upload_max_filesize 50M, но файл в 150М загружался без проблем. Avivar, пробовал читать заголовок, была ошибка, сейчас не вспомню какая, но попробую еще раз, хоть ошибку увидеть и запомнить. а по поводу торможения сайта во время загрузки файла (пока функция не отработает) есть у кого-нибудь мысли? Добавлено спустя 26 минут 27 секунд: перепроверил, в ответе нет content-length (длины файла) =(
ссылка не проблема _http://export.admitad.com/ru/webmaster/websites/89454/products/export/?user=bkm&code=e7d8beb4e7®ion=RU&price_from=&price_to=&keyword=&format=xml смотрим заголовки Код (PHP): echo '<pre>'; var_dump(get_headers($_POST['lnk_export'], 1)); echo '</pre>';
С курлом пока не работал, но это вроде как плагин... поэтому правила htaccess для него могут быть неписаны... думаю нужно искать в самом курле. Кстати, наЯндексил: http://otvet.mail.ru/question/57070611 ("Curl, как ограничить скачивание по размеру.") [Осторожно предположу, ибо новичок в PHP]Браузер асинхронно посылает запрос (например с помощью XMLHTTP), в ходе которого нужно скачать файл и ... работает дальше -> Сервер скачивает файл в БД и отправляет браузеру id закаченного файла -> как только приходит ответ с сервера, браузер отсылает id обратно -> сервер получает id, по нему "узнаёт" предыдущий запрос (хотя это можно сохранить в сессию), извлекает скаченный файл из БД, и обрабатывает запрос, после чего браузер получает обратно сам конечный результат.
Боюсь узнать не получится(либо я чего то не знаю). В заголовке размер не передается. Передача файла скорее всего осуществляется из приватной файловой системы(прямые ссылки не доступны). Сам скрипт осуществляет чтение и передачу зачитанных кусков файла пользователю, пока не закончится скачивание...
сайт тормозит - это проблема в организации сессии, ушел реализовывать решение. а по поводу файла - фиг с ним, все равно более 200 метров не будет (я надеюсь), а потом сразу после загрузки я его удалю.
ха, в нужном месте ставим session_write_close();, дальше ajax функция раз в секунду запрашивает размер файла, который уже на диске и выводит его на экран. осталось только вовремя (при достижении порога) прервать работу курла.
если не остановлю сессию, не смогу вывести информацию о загрузке на экран. считать размер по мере загрузки было бы неплохо, а это можно сделать только если сокет открыть или курлом тоже? ушел читать доку.
Ну соткет откроется так или иначе Вопрос в том нужно ли прикидываться браузером. С курлом это проще. А макс файл аплоад это про аплоад юзера к тебе.