Здравствуйте, B0BAH, Вы писали:
BBA>Можно ли, и каким образам, получить размер html странички НЕ СКАЧИВАЯ ЕЁ, и возможно ли сделать это если страничка формируестя на сервере из php?
Можно послать серверу команду HEAD.
Далее проверить полученный заголовок на содержание content-length. Если он там есть, то это размер ответа, который пришел бы по команде GET, если нет, то и ответа нет.
Насколько я понял из HTTP/1.1 веб сервер в ответ на запрос HEAD не должен отправлять размер контента, а значит, высока вероятность, что размер контента без отправки команды GET ты не получишь.
Есть еще вариант — послать GET, а скачивание прервать сразу же после считывания заголовков. В ответ на GET нормальный сервер тебе точно даст content-length. Вот и узнаешь размер файла.
P.s. еще могу порекомендовать чаще пользоваться поиском. Например, точно такой же вопрос обсуждался ранее в теме веб-программирования.
Здравствуйте, mikkri, Вы писали:
M>Можно послать серверу команду HEAD. M>Далее проверить полученный заголовок на содержание content-length. Если он там есть, то это размер ответа, который пришел бы по команде GET, если нет, то и ответа нет.
M>Насколько я понял из HTTP/1.1 веб сервер в ответ на запрос HEAD не должен отправлять размер контента, а значит, высока вероятность, что размер контента без отправки команды GET ты не получишь.
M>Есть еще вариант — послать GET, а скачивание прервать сразу же после считывания заголовков. В ответ на GET нормальный сервер тебе точно даст content-length. Вот и узнаешь размер файла.
А можно ли использовать процедуру: procedure Get(AURL: string; const AResponseContent: TStream); overload; (класс TIdHTTP)???
То есть если использовать просто function Get(AURL: string): string; overload; то страница сразу качается, а при вызове процедуры она скачается или нет? Мне вообще не понятно как работает процедура (я по потоки ничего не знаю), но я понял что у потока есть свойство size, может через него получится?
И ещё вопросс как разорвать соединение сразу после получения заголовка если использовалась функция Get?
Здравствуйте, B0BAH, Вы писали:
BBA>А можно ли использовать процедуру: procedure Get(AURL: string; const AResponseContent: TStream); overload; (класс TIdHTTP)??? BBA>То есть если использовать просто function Get(AURL: string): string; overload; то страница сразу качается, а при вызове процедуры она скачается или нет? Мне вообще не понятно как работает процедура (я по потоки ничего не знаю), но я понял что у потока есть свойство size, может через него получится? BBA>И ещё вопросс как разорвать соединение сразу после получения заголовка если использовалась функция Get?
Насколько мне известно, в Indy вся функциональность по работе с HTTP глубоко запрятана. Например, в той версии, которую я изучал, небыло такой вещи, как частичная закачка.
Кстати, можешь попробовать указывать range в заголовках при отправке GET. Если веб-сервер поддерживает докачку, то он тебе отдаст контент только в нужном интервале. Хотя в случае php это вряд ли, но нужно проверить — сам не знаю. Тогда и Indy сойти должны. Опять же если тебе сервер не вернет content-length, а он это может сделать, то без полного скачивания размер контента ты никак не узнаешь.
Еще совет — почитай W3C HTTP спецификацию. Может на какие мысли приведет.