Справочные материалы по программированию

Программирование, Хакинг, Безопасность, Софт, Железо, а также всё связанное с компьютерами
Аватара пользователя
Андрей
Архитектор
Сообщения: 7305
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 517 раз
Поблагодарили: 462 раза

Re: Справочные материалы по программированию

Сообщение Андрей »

Всем привет!
Использую объект Indy 10 IdHTTP для закачки файла с сервера. Естественно хотелось бы оформить этот животрепещущий процесс в виде формочки с ProgressBar и какими-нито информативными надписями, типа "Скачано 100 байт из 23456 байт".
Для получения информации о размере файла на сервере пользую следующий код:

Код: Выделить всё

Edit1.Text := Format('http://%s/%s%s', [HostEdit.Text, 'cgi-bin/doclibrary.cgi?', FileURLEdit.Text]);
IdHTTP.Head(Edit1.Text);
Label4.Caption := Format('%u', [IdHttp.Response.ContentLength]);
Memo1.Clear;
IdHttp.Response.RawHeaders.ConvertToStdValues(Memo1.Lines);
CheckBox1.Checked := IdHttp.Response.HasContentLength;
в результате Edit1.Text выглядит примерно так:
так вот, почему-то HasContentLength = False,
а Label4.Caption = '4294967295', что ничто иное как 4 * 1024 * 1024 * 1024 - 1...
поле Memo1 содержит текст:
Server=Apache/1.3.31 (Unix) mod_perl/1.29 mod_ssl/2.8.19 OpenSSL/0.9.7d
Content-Disposition=attachment; filename=blablabla.doc
Content-Transfer-Encoding=binary;
Connection=close
Content-Type=application/force-download
Подскажите плиз, почему я не могу получить размер файла? Что я не так делаю?
Файл при этом удачно закачивается с помощью кода:

Код: Выделить всё

CurrentTask.FileStream := TFileStream.Create(FileName, fmCreate);
CurrentTask.URL := Edit1.Text;
IdHTTP.Get(CurrentTask.URL, CurrentTask.FileStream);
Кстати, Дельфи 7, Indy 10...
Хотя на Indy 9 было тоже самое...
Аватара пользователя
Андрей
Архитектор
Сообщения: 7305
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 517 раз
Поблагодарили: 462 раза

Re: Справочные материалы по программированию

Сообщение Андрей »

Его просто нет, узнаешь после того как скачаешь.
Особенности протокола http
Это уж дело сервера, выставлять заголовок: Content-Length или нет...
И не заставишь.
Аватара пользователя
Андрей
Архитектор
Сообщения: 7305
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 517 раз
Поблагодарили: 462 раза

Re: Справочные материалы по программированию

Сообщение Андрей »

есть такая книга "Indy in Depth", там есть это:

8.5.1. События OnWork
События OnWork состоят из трех событий и используется для связи состояний транзакций. Эти три события следующие: OnWorkBegin, OnWork и OnWorkEnd.

При начале транзакции возникает событие OnWorkBegin.
В событие OnWorkBegin передаются Sender, WorkMode и WorkCount.
Параметр Sender это соединение, к которому относится транзакция.
Параметр WorkMode указывает режим работы – читающая или пишущая транзакция.
Транзакции Read и Write могут возникать одновременно и транзакции могут быть вложенными.
Параметр WorkCount указывает размер транзакции. Во многих транзакциях, размер не может быть определен, и в этом случае, WorkCount имеет значение 0. Иначе, WorkCount показывает количество байт. Обычно данное событие используется для отображения начала процесса.

Затем возникает серия событий OnWork. В событие OnWork передаются Sender, WorkMode и текущий WorkCount. Данное событие используется для отображения прогресса.

Когда транзакция заканчивается, возникает событие OnWorkEnd. В событие OnWorkEnd OnWork передаются только Sender и WorkMode. Данное событие используется для отображения завершения процесса.