Загрузить изображение на веб-сайт с помощью multipart / form-data idhttp delphi

#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 свойства и, которые вы можете очистить. Я обновил свой ответ, чтобы показать это.