Справочные материалы по программированию
- Андрей
- Архитектор
- Сообщения: 7305
- Зарегистрирован: 06 май 2015, 14:10
- Откуда: Чехов
- Благодарил (а): 517 раз
- Поблагодарили: 462 раза
- Контактная информация:
Re: Справочные материалы по программированию
Всем привет!
Использую объект Indy 10 IdHTTP для закачки файла с сервера. Естественно хотелось бы оформить этот животрепещущий процесс в виде формочки с ProgressBar и какими-нито информативными надписями, типа "Скачано 100 байт из 23456 байт".
Для получения информации о размере файла на сервере пользую следующий код:
в результате Edit1.Text выглядит примерно так:
а Label4.Caption = '4294967295', что ничто иное как 4 * 1024 * 1024 * 1024 - 1...
поле Memo1 содержит текст:
Файл при этом удачно закачивается с помощью кода:
Кстати, Дельфи 7, Indy 10...
Хотя на Indy 9 было тоже самое...
Использую объект 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;
так вот, почему-то 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);
Хотя на 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. Данное событие используется для отображения завершения процесса.
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. Данное событие используется для отображения завершения процесса.