Search code examples
delphiindy

Upload image to website using multipart/form-data idhttp delphi


I need help in solving the problem of uploading a photo to wildberries.ru using IdHTTP. Post data looks like this when loading an image from the site:

------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--

can't figure out how to transfer data via IdHTTP. I am using RAD Studio 10.3.1 Rio, Indy 10.


Solution

  • TIdHTTP has an overloaded Post() method that takes a TIdMultipartFormDataStream as input, which in turn has AddFormField() and AddFile() methods. For example:

    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 to\13927988-2.jpg’, ‘image/jpeg’) do
            ContentTransfer := '';
          HTTP.Post(‘https://www.wildberries.ru/...’, Data);
        finally
          Data.Free;
        end;
      finally
        HTTP.Free;
      end;
    end;