Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Определение размера файла

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
TIT
Отправлено: 19 Января, 2009 - 12:56:56
Post Id



Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Янв. 2009  
Откуда: Ростов-на-Дону


Помог: 0 раз(а)




Есть кусок кода, с помощью которого я хочу узнать размер файла (не локального)
PHP:
скопировать код в буфер обмена
  1. <?
  2. $filesize = filesize('http://www.server.com/file.ext');
  3. echo $filesize;
  4. ?>


Данный код вызывает след. ошибку:

Warning: filesize() [function.filesize]: stat failed for http://www[dot]server[dot]com/file[dot]ext in /index.php on line 3

В чём ошибка и как поправить?
 
 Top
Stierus Супермодератор
Отправлено: 19 Января, 2009 - 13:00:15
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Сами же уточнили, что "не локального". Запрашивайте удалённый файл (только заголовки принимайте, тело обрезайте, оно вам не нужно) и смотрите поле "Content-length".
 
My status
 Top
TIT
Отправлено: 19 Января, 2009 - 13:39:49
Post Id



Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Янв. 2009  
Откуда: Ростов-на-Дону


Помог: 0 раз(а)




Stierus пишет:
Сами же уточнили, что "не локального". Запрашивайте удалённый файл (только заголовки принимайте, тело обрезайте, оно вам не нужно) и смотрите поле "Content-length".
Уважаемый Stierus, подскажите, как скачать только заголовок файла, не качая его тело?

Попутно, задав данный вопрос на гугле получил ответ, может быть кому будет интересно. Ссылка: http://otvety.google.ru/otvety/thread?fid=6116b8e613df3c8f000460d3f7e1224e&eac=av&tid=6116b8e613df3c8f&tk=ALfNcUzyjGBrk4zo8xbAOwzNKWH5ABUU1SN_CcziavmT-m_o7dpMV6kP_awShiU_rityU3lunq6m2tfU7ulZ39pxz0zh4I-fDCaE8FuYuP3Mv2yrIn-cDAA

(Отредактировано автором: 19 Января, 2009 - 13:40:13)

 
 Top
vitaliy_mad
Отправлено: 19 Января, 2009 - 13:50:04
Post Id


Участник


Покинул форум
Сообщений всего: 1107
Дата рег-ции: Окт. 2008  
Откуда: Украина, Мариуполь


Помог: 0 раз(а)




Цитата:
Попутно, задав данный вопрос на гугле получил ответ, может быть кому будет интересно. Ссылка: http://otvety.google.ru/otvety/t...YuP3Mv2yrIn-cDAA

Тебе здесь то же само и сказали сделать... почти...
 
 Top
Stierus Супермодератор
Отправлено: 19 Января, 2009 - 14:18:16
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Цитата:
Уважаемый Stierus, подскажите, как скачать только заголовок файла, не качая его тело?


Если скачиваете вречную - просто дополнительное условие выставляйте.
У Curlа есть отдельный параметр, в мануале посмотрите - найдёте
 
My status
 Top
Ch_chov
Отправлено: 19 Января, 2009 - 19:12:50
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Правильно ли я понимаю, что для того чтобы получиль размер удаленного файла без использования CURL нужно считывать каждую строчку файла с помощью fgets и искать в ней заголовок "Content-length".
 
 Top
valenok Модератор
Отправлено: 19 Января, 2009 - 20:10:21
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Нет. Эта функция проигнорирует заголовки.
Воспользуйтесь curl'ом.


-----
Truly yours, Sasha.
 
My status
 Top
Ch_chov
Отправлено: 19 Января, 2009 - 21:18:24
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




valenok пишет:
Нет. Эта функция проигнорирует заголовки.
Воспользуйтесь curl'ом.

Я имею ввиду, что нужно парсить каждую строку полученную с помощью fgets и выковыривать от туда значение Content-length
 
 Top
Гость
Отправлено: 20 Января, 2009 - 13:47:54
Post Id


УДАЛЁН










$site_domain="site.ru"; // Сайт с нужным файлом
$site_file_path="/path/to/file.ext"; // Путь к нужному файлу
$site_timeout=10; // Время ожидания
$header_size=2048; // Примерный размер заголовка в байтах Этот параметр надо устанавливать очень осторожно ибо если поствить слишком мало то можно не считать заголовок а если много то пойдет считываеть тело файла

$service_port = getservbyname('www', 'tcp');
$address = gethostbyname($site_domain);
set_time_limit($site_timeout);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";} else {echo "OK.\n";}
$result = socket_connect($socket, $address, $service_port);
if ($result < 0) {echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";}
else {echo "OK.\n";}
$in = "GET $site_file_path HTTP/1.1\n";
$in .= "Host: $site_domain\n";
$in .= "Connection: Close\n\n";
$out = '';
socket_write($socket, $in, strlen($in));
$file_header=socket_read($socket, $header_size);
socket_close($socket);

// В переменной $file_header получили заголовки от файла В них надо с помощью регуляронго выражения выбрать Content-length
 
 Top
Ch_chov
Отправлено: 20 Января, 2009 - 15:45:03
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




А можете популярно объяснить, почему надо использовать socket_connect и socket_read, а не fopen и fgets.
 
 Top
Stierus Супермодератор
Отправлено: 20 Января, 2009 - 15:52:46
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Не буду лезть в то, что написано не мной, но я предлагал чтение заголовков, что бы не читать весь файл (хорошо, если он несколько килобайт весит, а если пару гигов?Улыбка )
 
My status
 Top
Гость
Отправлено: 20 Января, 2009 - 16:04:45
Post Id


УДАЛЁН










Хм а кто сказал что в предложденном мною коде надо читать весь файл
Цитата:
$header_size=2048; // Примерный размер заголовка в байтах Этот параметр надо устанавливать очень осторожно ибо если поствить слишком мало то можно не считать заголовок а если много то пойдет считываеть тело файла
Хотя лучше было бы огранизовать конец заголовков поиском \n\n

Ch_chov Дело в том что если читать fgets то HTTP-заголовки игнорируются а ткт все будет Улыбка
 
 Top
Ch_chov
Отправлено: 20 Января, 2009 - 17:07:18
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Цитата:
если читать fgets то HTTP-заголовки игнорируются


Т.е. будет считано только тело страницы?
 
 Top
Гость
Отправлено: 20 Января, 2009 - 18:44:41
Post Id


УДАЛЁН










Вот пример запроса картинки моего аватара на этом форуме:
Цитата:
telnet php.su 80
Trying 82.140.91.131...
Connected to php.su.
Escape character is '^]'.
GET /im/avatars/personal/1420-avatar .jpg HTTP/1.1\n
Host: forum.php.su\n\n

Вот что отвечает сервер:
Цитата:
HTTP/1.1 200 OK\n
Date: Tue, 20 Jan 2009 16:39:36 GMT\n
Server: Apache\n
Last-Modified: Thu, 19 Jun 2008 14:24:22 GMT\n
ETag: "19392b-d4d-bbc2b180"\n
Accept-Ranges: bytes\n
Content-Length: 3405\n
Connection: close\n
Content-Type: image/jpeg\n\n

JFIF``ExifIIC
$.' ",#(7),01444'9=82<.342C
2!!2222222222222222222222222222222222222222222222222Sa"

µ}!1AQa"q2Ѓ‘#B±БRСр$3br‚
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzѓ„…†‡€‰Љ’“”•–—™љўЈ¤Ґ¦§Ё©ЄІіґµ¶·ё№єВГДЕЖЗИЙКТУФХЦЧШЩЪбвгдежзийкстуфхцчшщъ

µw!1AQaq"2B‘Ў±Б #3RрbrС
$4б%с&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ѓ„…†‡€‰Љ’“”•–—™љўЈ¤Ґ¦§Ё©ЄІіґµ¶·ё№єВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийктуфхцчшщъ
?к|5рЪ\xЋЮСQXt«lщгюz7ьЇЛЧЉфЉ;uKkhг‚Р*G
¦ZTNГа¤6Iэ*єNЭ|ѕЅуЕYЬx«Fm1’|ј–#сЄШR3ё“O™ѓІsћ9ЄщнQ&\v9ЏxЉгDVцs[G=СsжЬBЄг;F99a\ўЮk7Ч^dєЅЧvЮS
уС01ъыЧЁЙiкЙЄ
...............................


Если вы будете читать fgets то будут считываться строки начиная с той кторая выделена красным цветом (Байтовое предстваление картинки)

Если же работаь с помощью Sockets то будут считываеться все строки начиная с той которая выделена зеленым Те будут считываться все HTTP-заголовки

В вашем примсере нас интересует вся информация начиная с зеленой и вплоть до красной строки - это и есть HTTP-заголовок в котором содержится ався интересуемая о файле информация в тои числе и его размер
Кстати признаком конца заголовка является первая встретившаяся пустая строка (\n\n)

(Отредактировано автором: 20 Января, 2009 - 18:47:35)

 
 Top
Ch_chov
Отправлено: 21 Января, 2009 - 16:43:39
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Всё равно fgets тут не причем, вот код, котрый выводит тоже самое:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $fp = fsockopen ("forum.php.su", 80, $errno, $errstr, 30);
  3. if (!$fp) echo "$errstr ($errno)<br>\n";
  4. else {
  5. fputs ($fp, "GET /im/avatars/personal/1420-avatar .jpg HTTP/1.1
  6. Host: forum.php.su
  7.  
  8. ");
  9. while (!feof($fp)) echo fgets ($fp,128);
  10. fclose ($fp);
  11. }
  12. ?>


Выводит:
CODE (text):
скопировать код в буфер обмена
  1. HTTP/1.1 200 OK
  2. Date: Wed, 21 Jan 2009 14:23:56 GMT
  3. Server: Apache
  4. Content-Location: 1420-avatar.jpg
  5. Vary: negotiate
  6. TCN: choice
  7. Last-Modified: Thu, 19 Jun 2008 14:24:22 GMT
  8. ETag: "19392b-d4d-bbc2b180;d0cbd940"
  9. Accept-Ranges: bytes
  10. Content-Length: 3405
  11. Connection: close
  12. Content-Type: image/jpeg
  13.  
  14. яШяаJFIF``ябExifII*яЫC          
  15. 
  16.  $.' ",#(7),01444'9=82<.342яЫC                       
  17.  
  18. 2!!22222222222222222222222222222222222222222222222222яАSa"яД      
  19. яДµ}!1AQa"q2Ѓ‘Ў#B±БRСр$3br‚  
  20. %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzѓ„…†‡€‰Љ’“”•–—&#732;™љўЈ¤Ґ¦§Ё©ЄІіґµ¶·ё№єВГДЕЖЗИЙКТУФХЦЧШЩЪбвгдежзийкстуфхцчшщъяД 
  21. ...............................


Думаю все зависти от того каким образом был открыт файл. Если пользоваться fopen то заголовки действительно игнорируются.

(Отредактировано автором: 21 Января, 2009 - 16:44:05)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB