【问题标题】:Upload image to website using multipart/form-data idhttp delphi使用 multipart/form-data idhttp delphi 将图像上传到网站
【发布时间】:2020-09-25 22:32:13
【问题描述】:

我需要帮助来解决使用 IdHTTP 将照片上传到 wildberries.ru 的问题。从网站加载图片时,发布数据如下所示:

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

【问题讨论】:

  • 请编辑您的问题。你的最后一句话令人困惑。 “加载”是指“上传”还是“下载”?是“上传”然后是“......到网站”。还要添加您使用的代码和您收到的错误消息。

标签: delphi indy


【解决方案1】:

TIdHTTP 有一个重载的Post() 方法,该方法将TIdMultipartFormDataStream 作为输入,而该方法又具有AddFormField()AddFile() 方法。例如:

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;

【讨论】:

  • 感谢雷米的回答。我稍微改变了你的代码。我尝试发送请求,但作为响应,我收到了来自 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: binaryHow to generate a boundary类似于WebKitFormBoundaryefyWRVXQv7B4XPBt?
  • 以及如何删除以下行:Content-Type: text / plain request Content-Transfer-Encoding: quoted-printable, Content-Transfer-Encoding: binary?
  • @Yaroslav "如何生成类似于...的边界" - TIdMultiPartFormDataStream.Boundary 属性是只读的,但其FBoundary 字段是protected ,因此您可以直接通过访问器类对其进行修改,例如type TIdMultipartFormDataStreamAccess = class(TIdMultipartFormDataStream) end; TIdMultipartFormDataStreamAccess(Data).FBoundary := ...;。不过,实际边界值只要是唯一的就无关紧要,TIdMultiPartFormDataStream 的默认边界是。实际边界值在请求的Content-Type 中发送,因此服务器知道要查找的内容
  • @Yaroslav "how to remove the following lines" - Add... 方法返回一个指向 TIdFormDataField 对象的指针,该对象具有 ContentTypeContentTransfer您可以空白的属性。我已经更新了我的答案以显示这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2017-11-16
  • 2011-03-22
  • 1970-01-01
  • 2015-06-01
  • 2011-04-22
  • 1970-01-01
相关资源
最近更新 更多