|
Вопрос # 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;
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|