Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 436

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты! для загрузки файла по ссылке использую synapse (функция HttpGetBinary из httpsend), вопрос - как узнать точный размер файла перед загрузкой, конечно с помошью этого же компонента?
еще один вопрос для "кучи", при загрузке файла программа висит, возможно ли вставить и куда цикл processmessages в код компонента, так сказать для стабильности?

заранее всех благодарю.

Phoenix Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Phoenix (статус: Посетитель)
Вопрос отправлен: 19 февраля 2009, 23:04
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Phoenix!
Что бы не висело, надо использовать поток (TThread). Другого вменяемого способа нет. В списке моих статей на сайте есть примеры как это делать.
Узнать размер - чуточку сложнее. Наиболее простой способ - это открыть этот же файл (httpsend.pas) и найти там реализацию метода HTTPMethod. Длина получаемых данных определяется в строке, которую найдете поиском слова 'CONTENT-LENGTH:' Осталось дописать туда одну-две строки и готово.
Можно сделать хитрее - отправить с помощью этого же метода HEAD зарпос. Сервер на него ответит размером, датой создания файла и некоторыми другими данными.

И на последок. Это не компонент. Это класс. Любой компонент есть класс, но обратное не верно.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 19 февраля 2009, 23:21
Оценка за ответ: 5

Комментарий к оценке: спасибо еще раз, про поток нашел в вашей статье "скачиваем файлы из интернета", а для получения размера хэдеров дописал в httpsend:
function HttpGetSize(const URL: string): string;
var
  HTTP: THTTPSend;
  sizeheader:string;
begin
  HTTP := THTTPSend.Create;
  try
   HTTP.HTTPMethod('HEAD', URL);
   sizeheader:=HTTP.Headers[5];
   result:=copy(sizeheader, length('Content-Length: '), length(sizeheader)-length('Content-Length: '));
  finally
    HTTP.Free;
  end;
end;

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 29 февраля 2020, 10:45
Выполнено за 0.02 сек.
Рейтинг@Mail.ru