| 
| 
 | Вопрос # 2 436/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты! для загрузки файла по ссылке использую synapse (функция HttpGetBinary из httpsend), вопрос - как узнать точный размер файла перед загрузкой, конечно с помошью этого же компонента?еще один вопрос для "кучи", при загрузке файла программа висит, возможно ли вставить и куда цикл processmessages в код компонента, так сказать для стабильности?
 
 заранее всех благодарю.
 
|  |   Вопрос задал: 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;
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |