Delphi 加上一句「;AddStream“;方法将TMultipartFormData与TNetHTTPClient.Post一起使用

Delphi 加上一句「;AddStream“;方法将TMultipartFormData与TNetHTTPClient.Post一起使用,delphi,http-post,Delphi,Http Post,使用Delphi 10.2.3 我想使用TNetHTTPClient.Post和TMultipartFormData将图像从TStream上传到web服务器 我的问题是TMultipartFormData类没有“AddStream”函数(我假设它需要一个文件名来生成mime类型),所以我决定添加我自己的函数,因为我事先知道mime类型(和一个有效的文件名) 在Delphi10.2.3中,我从未使用过类继承或类帮助程序,在阅读并尝试之后,我已经达到了一个明显缺少某些内容但却不知道是什么的程度 我试

使用Delphi 10.2.3

我想使用TNetHTTPClient.Post和TMultipartFormData将图像从TStream上传到web服务器

我的问题是TMultipartFormData类没有“AddStream”函数(我假设它需要一个文件名来生成mime类型),所以我决定添加我自己的函数,因为我事先知道mime类型(和一个有效的文件名)

在Delphi10.2.3中,我从未使用过类继承或类帮助程序,在阅读并尝试之后,我已经达到了一个明显缺少某些内容但却不知道是什么的程度

我试过:

Type
  TMultipartFormDataStream = class (TMultipartFormData)
    procedure AddStream(AStream : TStream; const AFieldName, AFilePath: string);
  end;

procedure TMultipartFormDataStream.AddStream(AStream : TStream; const AFieldName, AFilePath: string);
var
  LType: string;
begin
  AdjustLastBoundary;
  WriteStringLn('--' + FBoundary);
  WriteStringLn(sContentDisposition + ': form-data; name="' + AFieldName + '"; filename="' + ExtractFileName(AFilePath) + '"'); // do not localize
  LType := GetFileMIMEType(AFilePath);
  WriteStringLn(sContentType + ': ' + LType + #13#10); // We need 2 line break here   // do not localize
  try
    FStream.CopyFrom(AStream, 0);
  finally
  end;
  WriteStringLn('');
end;
但是,继承类的所有私有函数都不可访问

我还尝试使用类帮助程序而不是直接继承,但私有函数同样不可访问,我不希望使用RTTI hack


使用TNetHTTPClient从流上载图像的最佳解决方案/解决方案是什么?我真的必须将流保存到一个文件中,才能将其添加到多部分表单数据中吗?

这个问题在Delphi 10.3中得到了解决,在Delphi 10.3中,扩展接口可以直接使用流。

您所要求的是不可行的。您无法访问
t MultipartFormData
的私有内部。向Embarcadero提交功能请求,以添加
TStream
支持,然后在此期间找到另一个解决方案。例如,Indy的
TIdMultipartFormDataStream
有一个重载的
AddFormField()
方法,该方法接受
TStream
输入。提交于-由于我正在开发跨平台,我不能使用Indy,所以目前的解决方法是保存到文件,然后使用AddFile函数。“因为我在开发跨平台,所以我不能使用Indy”-为什么?Indy是跨平台的。它支持Delphi所支持的所有相同平台(以及更多,通过FreePascal)我不知道Indy是跨平台使用Delphi的,特别是关于https,我读到的所有评论似乎都暗示了Indy的https不是跨平台的。Indy的https支持在很大程度上是跨平台的。需要注意的是,Indy默认的TLS库在所有平台上都是OpenSSL,但Google在年放弃了对OpenSSL的操作系统支持安卓6。有些人在某些设备上的安卓6+部署中成功地手动包含了OpenSSL LIB,但其他人没有。因此,Indy在安卓6+上的TLS支持参差不齐,除非您幸运地使OpenSSL正常工作,或者使用另一个TLS库,通过自定义IOHandler类将其连接到Indy。