За последние 24 часа нас посетили 26720 программистов и 1511 роботов. Сейчас ищет 831 программист ...

Размер динамически загружаемого файла

Тема в разделе "PHP для новичков", создана пользователем bkm, 13 авг 2013.

  1. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    Приветствую.

    Можно ли каким-либо образом вычислить размер загружаемого файла создающегося динамически. Т.е. есть ссылка с параметрами, в зависимости от параметров сервер возвращает файл. Проблема в том, что я не могу узнать вес файла пока не скачаю его. Может быть можно узнать вес файла пока он скачивается, т.е. периодически проверять его размер и если он превышает ограничения, то прерывать загрузку?

    Добавлено спустя 2 минуты 23 секунды:
    и еще один вопрос.
    в процессе загрузки большого файла, пока курл работает, сам сайт (его другие страницы) не загружается. как-то можно это делать асинхронно?
     
  2. Epsilon

    Epsilon Активный пользователь

    С нами с:
    9 ноя 2012
    Сообщения:
    11
    Симпатии:
    0
    Если я правильно понял, проблема в том, чтобы пользователь не смог забить трафик своими попытками залить на сервер черезчур большой файл.
    Кажется для таких случаев в htaccess есть несколько директив управляющих максимальным размером загружаемых файлов.
     
  3. Avivar

    Avivar Новичок

    С нами с:
    6 авг 2013
    Сообщения:
    15
    Симпатии:
    0
    Если я вас правильно понял, то вам необходимо узнать размер файла по ссылке, до его загрузки.
    Я думаю решением является читать заголовки ответа сервера (файл не загружается). Вам нужен заголовок Content-Length.
    Источник кода http://php.ru/manual/function.filesize.html
    Код (Text):
    1.  
    2. <?php
    3. $remoteFile = 'http://us.php.net/get/php-5.2.10.tar.bz2/from/this/mirror';
    4. $ch = curl_init($remoteFile);
    5. curl_setopt($ch, CURLOPT_NOBODY, true);
    6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    7. curl_setopt($ch, CURLOPT_HEADER, true);
    8. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //not necessary unless the file redirects (like the PHP example we're using here)
    9. $data = curl_exec($ch);
    10. curl_close($ch);
    11. if ($data === false) {
    12.   echo 'cURL failed';
    13.   exit;
    14. }
    15.  
    16. $contentLength = 'unknown';
    17. $status = 'unknown';
    18. if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/', $data, $matches)) {
    19.   $status = (int)$matches[1];
    20. }
    21. if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
    22.   $contentLength = (int)$matches[1];
    23. }
    24.  
    25. echo 'HTTP Status: ' . $status . "\n";
    26. echo 'Content-Length: ' . $contentLength;
    27. ?>
    Добавлено спустя 7 минут 21 секунду:
    Есть также способ без использования curl http://www.internet-technologies.ru/articles/article_839.html
     
  4. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    Epsilon, пока не придумал как тут htaccess использовать, если ссылку передаю в курл, а он уже загружает, отработают ли правила? У меня прописано php_value upload_max_filesize 50M, но файл в 150М загружался без проблем.

    Avivar, пробовал читать заголовок, была ошибка, сейчас не вспомню какая, но попробую еще раз, хоть ошибку увидеть и запомнить.

    а по поводу торможения сайта во время загрузки файла (пока функция не отработает) есть у кого-нибудь мысли?

    Добавлено спустя 26 минут 27 секунд:
    перепроверил, в ответе нет content-length (длины файла) =(
     
  5. Avivar

    Avivar Новичок

    С нами с:
    6 авг 2013
    Сообщения:
    15
    Симпатии:
    0
    А можно пример ссылки, чтобы посмотреть уже на месте... Если не хотите светить, то можно в лс.
     
  6. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    ссылка не проблема _http://export.admitad.com/ru/webmaster/websites/89454/products/export/?user=bkm&code=e7d8beb4e7&region=RU&price_from=&price_to=&keyword=&format=xml

    смотрим заголовки
    Код (PHP):
    1. echo '<pre>';
    2. var_dump(get_headers($_POST['lnk_export'], 1));
    3. echo '</pre>';
     
  7. Epsilon

    Epsilon Активный пользователь

    С нами с:
    9 ноя 2012
    Сообщения:
    11
    Симпатии:
    0
    С курлом пока не работал, но это вроде как плагин... поэтому правила htaccess для него могут быть неписаны... думаю нужно искать в самом курле.
    Кстати, наЯндексил: http://otvet.mail.ru/question/57070611 ("Curl, как ограничить скачивание по размеру.")

    [Осторожно предположу, ибо новичок в PHP]Браузер асинхронно посылает запрос (например с помощью XMLHTTP), в ходе которого нужно скачать файл и ... работает дальше -> Сервер скачивает файл в БД и отправляет браузеру id закаченного файла -> как только приходит ответ с сервера, браузер отсылает id обратно -> сервер получает id, по нему "узнаёт" предыдущий запрос (хотя это можно сохранить в сессию), извлекает скаченный файл из БД, и обрабатывает запрос, после чего браузер получает обратно сам конечный результат.
     
  8. Avivar

    Avivar Новичок

    С нами с:
    6 авг 2013
    Сообщения:
    15
    Симпатии:
    0
    Боюсь узнать не получится(либо я чего то не знаю). В заголовке размер не передается. Передача файла скорее всего осуществляется из приватной файловой системы(прямые ссылки не доступны). Сам скрипт осуществляет чтение и передачу зачитанных кусков файла пользователю, пока не закончится скачивание...
     
  9. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    сайт тормозит - это проблема в организации сессии, ушел реализовывать решение.
    а по поводу файла - фиг с ним, все равно более 200 метров не будет (я надеюсь), а потом сразу после загрузки я его удалю.
     
  10. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    ха, в нужном месте ставим session_write_close();, дальше ajax функция раз в секунду запрашивает размер файла, который уже на диске и выводит его на экран. осталось только вовремя (при достижении порога) прервать работу курла.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    разумно открыть сокет ручками и считать размер по мере загрузки, если в заголовках нет.
     
  12. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    если не остановлю сессию, не смогу вывести информацию о загрузке на экран. считать размер по мере загрузки было бы неплохо, а это можно сделать только если сокет открыть или курлом тоже? ушел читать доку.
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ну соткет откроется так или иначе :)
    Вопрос в том нужно ли прикидываться браузером. С курлом это проще.

    А макс файл аплоад это про аплоад юзера к тебе.
     
  14. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    все получилось, используя CURLOPT_PROGRESSFUNCTION и callback-функцию =)