Вопрос, с которым столкнулся разработчик, заключается в использовании компонента WinInet для отправки файла на веб-сервер через приложение на Delphi. При выполнении операции InternetWriteFile возникает исключение с сообщением "Controlador no válido". Проблема связана с неправильным использованием объектов Indy и WinInet.
Оригинальный заголовок:
Загрузка файла с использованием WinInet в Delphi
Описание проблемы (вопрос):
Разработчик использует приложение на Delphi с компонентом WinInet для отправки JSON-метода и загрузки файла на веб-сервер. При использовании кода, модифицированного для этих целей, при выполнении функции InternetWriteFile происходит сбой с сообщением об ошибке "Controlador no válido". Попытка использовать FTPOpenFile не увенчалась успехом, так как сервер использует HTTP, а не FTP.
Решение проблемы:
Проблема заключается в неправильном подходе к использованию объектов Indy и WinInet. Необходимо предварительно сгенерировать MIME-данные с помощью TIdMultipartFormDataStream, а затем отправить их через WinInet. Для этого необходимо сохранить сгенерированные данные в TMemoryStream, после чего их можно будет отправить с помощью HTTPSendRequest.
Подтвержденный ответ:
Нельзя смешивать Indy и WinInet таким образом, как это пытается сделать разработчик. Попытка напрямую отправить объект TIdMultipartFormDataStream из памяти не увенчается успехом. Необходимо сначала сгенерировать MIME-данные, а затем отправить их через WinInet, используя отдельный TMemoryStream для хранения этих данных.
Важные моменты для решения:
Необходимо включить параметр границы (boundary) в заголовок Content-Type, чтобы сервер мог корректно обработать MIME-части. TIdMultipartFormDataStream генерирует эту границу динамически.
Нельзя использовать HTTPSendRequest и InternetWriteFile вместе для отправки тела запроса, необходимо выбрать один из них.
Пример кода на Object Pascal (Delphi):
PostData := TMemoryStream.Create;
try
Parameters := TIdMultiPartFormDataStream.Create;
try
Parameters.AddFile('archivo', Archivo, '');
PostData.CopyFrom(Parameters, 0);
Header := 'Host: ' + Server + ':' + IntToStr(Port) + #13#10 +
'Content-Type: ' + Parameters.RequestContentType + #13#10;
finally
Parameters.Free;
end;
// Добавьте другие заголовки, если необходимо
if iftoken then
begin
Header := Header + 'auth_token: '+token+#13#10;
Header := Header + 'Csrf-token: no-check'#13#10;
end;
// Добавьте заголовки запроса с помощью HttpAddRequestHeaders
if not HttpAddRequestHeaders(pRequest, PChar(Header), Length(Header), HTTP_ADDREQ_FLAG_ADD) then
raise Exception.Create('HttpAddRequestHeaders failed. ' + WinInetErrorMsg(GetLastError));
// Отправьте данные файла с помощью HTTPSendRequest
if not HTTPSendRequest(pRequest, nil, 0, PostData.Memory, PostData.Size) then
raise Exception.Create('HTTPSendRequest failed. ' + WinInetErrorMsg(GetLastError));
Result := True;
finally
PostData.Free;
end;
Заключение:
При правильном использовании компонентов Indy и WinInet в приложении на Delphi можно успешно отправлять файлы на веб-сервер, избегая ошибок, связанных с некорректной обработкой данных.
Разработчик в Delphi сталкивается с необходимостью использовать оба компонента (WinInet и Indy) для отправки файла на веб-сервер через HTTP, что приводит к ошибке 'Controlador no válido' из-за неправильного взаимодействия между этими компонентами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.