关于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
对接快麦接口时,使用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);
联系客服