通过 RESTClient 或 INDY 或任何其他方式将图像上传到 Delphi 10.4 中的 WordPress WP REST api

Uploading images to a WordPress WP REST api in Delphi 10.4 via RESTClient or INDY or any others

在 Delphi 10.4 中无法通过 REST api 将图像上传到我的 Wordpress 网站。 我通过 REST api(在 REST 调试器中和直接在程序中)发布了一个 post,但是没有图片就没有意义。

RESTClient 组件的最新代码:

procedure TForm1.Button1Click(Sender: TObject);
var jpgFoto: TMemoryStream;
begin
  HTTPBasicAuthenticator1.Username := 'myuser';
  HTTPBasicAuthenticator1.Password := 'mypass';

  RESTRequest1.Method := TRESTRequestMethod.rmPOST;
  RESTRequest1.Resource := 'wp/v2/media';
  RESTClient1.BaseURL := 'https://*.ru/wp-json';

  RESTRequest1.Params.AddHeader('Content-Disposition', 'attachment; filename="00s.jpg"');//I tried different options
  RESTRequest1.Params.AddHeader('Content-Type', 'image/jpeg');//tried different types, for example multipart or without this line

  RESTRequest1.Params.AddItem('data-binary', 'D:\Europe[=12=]s.jpg');//does it make sense?
  RESTRequest1.Params[0].Kind := pkGETorPOST;

  jpgFoto := TMemoryStream.Create;
  jpgFoto.LoadFromFile('D:\Europe[=12=]s.jpg');
  RESTRequest1.AddBody(jpgFoto, TRESTContentType.ctIMAGE_JPEG);
  jpgFoto.Position := 0;

  try
    RESTRequest1.Execute;
  except
    memo1.Text := RESTResponse1.Content;
  end;

  jpgFoto.Free;

end;

引发异常:rest_upload_invalid_disposition、rest_upload_invalid_disposition 或 rest_upload_no_data(取决于我在 Header RESTRequest 中使用的设置)

我找到了一个 至少帮助了一个人:切换到 INDY 到 idHTTP 组件。但是没有细节。我无法通过基本身份验证方法登录。我在 IDHTTP.Request.Username 和 IDHTTP.Request.Password 中设置了参数,但收到了 Wordpress 的响应 - 403 Forbidden。填充参数的格式不明确,在 JSON 或只是 parameter = value.

我刚开始学习 REST,卡住了好几个小时。请不要留下麻烦,请使用 delphi REST 或 Indy 组件或任何其他工作方式帮助在 Wordpress api REST 中上传图像,我将非常感激

成功了:

var
   Params: TIdMultipartFormDataStream;
begin
 Params := TIdMultipartFormDataStream.Create;
 Params.AddFormField('content-type','image/jpeg');
 Params.AddFile('file', 'c:\images\sdsd.jpg', '');
 idhttp2.Request.Accept := 'application/json; charset= UTF-8';
 idhttp2.Request.Authentication := TIdBasicAuthentication.Create;
 idhttp2.Request.Authentication.Username:= 'Username';
 idhttp2.Request.Authentication.Password := 'Password';
 idhttp2.Request.BasicAuthentication := true;

 idhttp2.Request.ContentDisposition := 'form-data; filename="anyname.jpg"';//
 idhttp2.Request.ContentType := 'application/json; charset= UTF-8';

 try
     idhttp2.Post('htts://mysite/wp-json/wp/v2/media/', Params);
 except
   memo1.Text :=  idhttp2.ResponseText;
 end;

end;