#delphi #indy
#delphi #indy
Вопрос:
Мне нужна помощь в решении проблемы загрузки фотографии в wildberries.ru использование IdHTTP. Данные Post выглядят так при загрузке изображения с сайта:
------WebKitFormBoundaryCpJAFY6AlIHK7dZt
Content-Disposition: form-data; name="nmId"
13927988
------WebKitFormBoundaryCpJAFY6AlIHK7dZt
Content-Disposition: form-data; name="photos"; filename="13927988-2.jpg"
Content-Type: image/jpeg
{here these photos are most likely}
------WebKitFormBoundaryCpJAFY6AlIHK7dZt--
не могу понять, как передавать данные через IdHTTP. Я использую RAD Studio 10.3.1 Rio, Indy 10.
Комментарии:
1. Пожалуйста, отредактируйте свой вопрос. Ваше последнее предложение сбивает с толку. «Загрузка» означает «загрузка» или «Загрузка»? Это «загрузить», затем «… на сайт». Также добавьте код, который вы используете, и сообщения об ошибках, которые вы получаете.
Ответ №1:
TIdHTTP
имеет перегруженный Post()
метод, который принимает a TIdMultipartFormDataStream
в качестве входных данных, который, в свою очередь, имеет AddFormField()
AddFile()
методы and . Например:
uses
..., IdHTTP, IdSSLOpenSSL, IdMultipartFormData;
var
HTTP: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
HTTP := TIdHTTP.Create;
try
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
SSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
HTTP.IOHandler := SSL;
Data := TIdMultipartFormDataStream.Create;
try
with Data.AddFormField(‘nmId’, ‘13927988’) do
begin
ContentType := '';
ContentTransfer := '';
end;
with Data.AddFile(‘photos’, ‘full path to13927988-2.jpg’, ‘image/jpeg’) do
ContentTransfer := '';
HTTP.Post(‘https://www.wildberries.ru/...’, Data);
finally
Data.Free;
end;
finally
HTTP.Free;
end;
end;
Комментарии:
1. Спасибо за ответ, Реми. Я немного изменил ваш код. Я попытался отправить запрос, но в ответ я получил сообщение об ошибке от сервера 400 Bad Request. Есть предположение, что дело находится на границе. Мой запрос выглядит так:
Content-Disposition: form-data; name = "nmId" Content-Type: text / plain Content-Transfer-Encoding: quoted-printable 13927987 ---------- 092520110009823 Content-Disposition: form-data; name = "photos"; filename = "3.jpg" Content-Type: image / jpeg Content-Transfer-Encoding: binary
как сгенерировать границу, аналогичную WebKitFormBoundaryefyWRVXQv7B4XPBt?2. И как удалить следующие строки:
Content-Type: text / plain request Content-Transfer-Encoding: quoted-printable
,Content-Transfer-Encoding: binary
?3. @Yaroslav » Как создать границу, похожую на … » —
TIdMultiPartFormDataStream.Boundary
свойство доступно только для чтения, но егоFBoundary
поле естьprotected
, поэтому вы можете изменить его напрямую с помощью класса доступа, напримерtype TIdMultipartFormDataStreamAccess = class(TIdMultipartFormDataStream) end; TIdMultipartFormDataStreamAccess(Data).FBoundary := ...;
. Однако фактическое граничное значение не должно иметь значения, если оно уникально, каковыTIdMultiPartFormDataStream
границы по умолчанию. Фактическое граничное значение отправляется в запросеContent-Type
, чтобы сервер знал, что искать4. @Yaroslav » как удалить следующие строки » —
Add...
методы возвращают указатель наTIdFormDataField
объект, который имеетContentType
ContentTransfer
свойства и, которые вы можете очистить. Я обновил свой ответ, чтобы показать это.