Загрузка файла с помощью TIdHTTP в приложении FMX Android может вызвать определенные проблемы, если не учитывать некоторые нюансы. В этом руководстве мы рассмотрим, как решить проблему загрузки файла на основе команды curl и предоставим рабочий пример кода на Object Pascal (Delphi).
Проблема
Пользователь предоставил следующую команду curl для загрузки файла на хост:
curl -T http://<ip-address>:<port> file.txt
При вызове этой команды из командной строки Windows мы получаем следующий вывод:
* Trying <ip-address>...
* TCP_NODELAY set
* Connected to <ip-address> (<ip-address>) port <port> (#0)
> PUT /file.txt HTTP/1.1
> Host: <ip-address>:<port>
> User-Agent: curl/7.55.1
> Accept: */*
> Content-Length: 682
> Expect: 100-continue
>
* Done waiting for 100-continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< content-length: 0
< date: Tue, 16 Jun 2020 19:24:18 GMT
< connection: close
<
* Closing connection 0
Файл успешно загружается на хост, но при попытке воспроизвести это поведение с помощью Indy в приложении FMX Android файл не появляется в указанном каталоге, хотя статус-код 200 возвращается.
Решение
Для решения этой проблемы важно правильно настроить TIdHTTP и TFileStream. Вот рабочий пример кода на Object Pascal (Delphi), который воспроизводит поведение команды curl:
var
FHTTP: TIdHTTP;
file2send: string;
FPutData : TFileStream;
begin
if not OpenDialog1.Execute then Exit;
file2send := OpenDialog1.FileName;
FHTTP := TIdHTTP.Create(nil);
try
FHTTP.Request.UserAgent := 'curl/7.55.1';
FPutData := TFileStream.Create(file2send, fmOpenRead or fmShareDenyWrite);
try
FHTTP.Put(PutURL.Text + '/' + ExtractFileName(file2send), FPutData, TStream(nil));
finally
FPutData.Free;
end;
finally
FHTTP.Free;
end;
end;
Примечания:
Убедитесь, что URL, переданный в метод FHTTP.Put(), имеет следующий формат: 'http://:/file.txt', а не 'http://:'.
Установите свойство FHTTP.Request.UserAgent, так как некоторые веб-серверы отклоняют пользовательский агент по умолчанию Indy.
Убедитесь, что вы освобождаете объекты, особенно если планируете обновить до 10.4 Sydney или более поздней версии, поскольку в 10.4 была удалена ARC для управления ciclo
Приложение FMX Android столкнулось с трудностями при загрузке файла с помощью TIdHTTP, и в руководстве рассматривается решение этой проблемы на основе команды curl, с примерами кода на Object Pascal (Delphi).
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS