打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
HTTP上传文件
userphoto

2022.11.30 湖南

关注

关于HTTP上传文件报文代码片记录

HTTP上传POST报文通过使用TIdMultiPartFormDataStream类,在网上看到有人说这个TIdMultiPartFormDataStream类使用释放有问题,BUG很多,暂时我没遇到,至少解决了我的问题,期待有高手写一个更加好更加完美的类能替代这个。

引用单元

uses

  IdGlobal, IdMultipartFormData,idhttp;

代码片

function UploadFile(AUrl, AFileName, ATicket, AProjectid, AVersion, AVersionTime: WideString): WideString;

  procedure _InitFormDataStream(var ASendStream: TIdMultiPartFormDataStream);

  begin

    if not Assigned(ASendStream) then Exit;

    ASendStream.AddFormField('ticket',        ATicket,      'utf-8').ContentTransfer := '8bit';

    ASendStream.AddFormField('projectTreeId', AProjectid,   'utf-8').ContentTransfer := '8bit';

    ASendStream.AddFormField('version',       AVersion,     'utf-8').ContentTransfer := '8bit';

    ASendStream.AddFormField('versionTime',   AVersionTime, 'utf-8').ContentTransfer := '8bit';

    ASendStream.AddFile('file',               AFileName,    'multipart/form-data');

  end;

var

  LSendStream: TIdMultiPartFormDataStream;

  IdHttp: TIdHTTP;

begin

  if AUrl = '' then Exit;

  if AFileName = '' then Exit;

  LSendStream := TIdMultiPartFormDataStream.Create;

  IdHttp := TIdHTTP.Create(nil);

  try

    _InitFormDataStream(LSendStream);

    IdHttp.Request.ContentType := LSendStream.RequestContentType;

    IdHttp.Request.CharSet := 'utf-8';

    IdHttp.Request.ContentEncoding := 'utf-8';

    Result := IdHttp.Post(AUrl, LSendStream);

  finally

    FreeAndNil(IdHttp);

    FreeAndNil(LSendStream);

  end;

end;


记踩过delphi中indy的TIdMultiPartFormDataStream的一个坑

VIP文章

时间漩涡

于 2021-07-15 16:29:09 发布

1261

 收藏

分类专栏: delphi 文章标签: delphi

版权

delphi用indy的idhttp组件进行formData方式提交或上传文件的时候,有一个坑。

就是

formData:=TIdMultiPartFormDataStream.Create;

formData.AddFormField('someStr','[someStr]');  <==这句有坑

坑的原因:

如果AddFormField的值太长的时候(比如base64编码(base64也有一个坑,在下面讲)的某些东西),indy组件默认会在固定长度时加上“=”。。

加上的“=”会直接导致服务端接收到的数据有误(比如base64解码直接失败!)。

解决方法:

formData.AddFormField('someStr','[someStr]').ContentTransfer:=sContentTransferBinary;

在addformField后面指定一下ContentTransfer的类型。

————————————————

版权声明:本文为CSDN博主「时间漩涡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/timer0677/article/details/118762043


Delphi7 TIdMultiPartFormDataStream 的坑

对接快麦接口时,使用TIdMultiPartFormDataStream 多表单提交数据。

因为TIdMultiPartFormDataStream  每加一个字段时,总会在最后多加一个回车。这也就导致了最后总是有一个回车,接口在读取最后一个值时会多一个回车字符。导致签名过不了。

要处理一下,这里不改源码。有可能其他厂商是有处理这个问题的,但是对接快麦没有。

var
FormData: TIdMultiPartFormDataStream;
FormDataStr: TStringStream;
FormDataStr2:string;
DelStr:string;begin
FormData := TIdMultiPartFormDataStream.Create;
FormData.AddFormField('TEST','123');
FormData.AddFormField('TEST2','234');
FormDataStr := TStringStream.Create('');
FormData.Position := 0;
FormDataStr.CopyFrom(FormData,FormData.Size); //要截取掉的字符
DelStr := #13#10#13#10+'--'+FormData.Boundary+'--';
FormDataStr2 := copy(FormDataStr.DataString,1,Length(FormDataStr.DataString)-Length(DelStr))+'--'+FormData.Boundary+'--';
mmo1.Lines.Add(FormDataStr2);
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
indy中的TIdMultiPartFormDataStream提交中文乱码怎么解决
delphi请求http接口并上传附件
Indy TIDHttp与TIdMultiPartFormDataStream “"Range check error"解决
delphi验证码识别控件【AspriseOCR】源码及其下载
关于fromdata的上传文件问题
[js] 第68天 formData主要是用来做什么的?它的操作方法有哪些?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服