Indy TIDHttp与TIdMultiPartFormDataStream “"Range check error"解决
2008-09-29 01:32
666 查看
这两天在用indy http做一个数据上传式工具,在使用TIdMultiPartFormDataStream时,老是了现“Range check error“错误,一开始以为是自己代码中有漏洞,经2个小时调试,排除自身代码问题并DEBUG跟踪INDY源代码后,发现TIdMultiPartFormDataStream.IdRead中:
CopyTIdBytes(FInternalBuffer, 0, VBuffer, LBufferCount, LCount);
CopyTIdBytes(FInternalBuffer, LCount, FInternalBuffer, 0, LExtra)
以上两句代码,无论是何种状态在第次CopyTIdBytes时都会出现“Range Check Error"错误。进入CopyTIdBytes代码
procedure CopyTIdBytes(const ASource:TIdBytes;const ASourceIndex:integer;
var VDest:TIdBytes;const ADestIndex:integer;const ALength:integer);
begin
{$IFDEF DOTNET}
System.Array.Copy(ASource,ASourceIndex,VDest,ADestIndex,ALength);
{$ELSE}
move(ASource[ASourceIndex], VDest[ADestIndex], ALength);
{$ENDIF}
end;
发现在第二次调用CopyTIdBytes时,ALength=0时,切ASourceIndex==Length(ASource),出现数组下标越界,改正为如下代码,问题解决:
procedure CopyTIdBytes(const ASource:TIdBytes;const ASourceIndex:integer;
var VDest:TIdBytes;const ADestIndex:integer;const ALength:integer);
begin
{$IFDEF DOTNET}
System.Array.Copy(ASource,ASourceIndex,VDest,ADestIndex,ALength);
{$ELSE}
if ALength>0 then
move(ASource[ASourceIndex], VDest[ADestIndex], ALength);
{$ENDIF}
end;
另:在网上TIDHttp与TIdMultiPartFormDataStream合用的代码不是很多,下面贴一个关键片段请方家指正:
var
mds:TIdMultiPartFormDataStream;
memStream:TMemoryStream;
begin
mds:=TIdMultiPartFormDataStream.Create;
memStream:=TMemoryStream.Create;
try
with mds do begin
//AddFormField('name','filename="E:/Ibmnbp4/报表.zip"');
AddFile('file','E:/Ibmnbp4/报表.zip','application/octet-stream');//下划线处,要根据自己的文件类型选择,我是根据Fiddler的跟踪
结果硬编码进去,如有动态识别的代码,请回复我,谢谢
AddFormField('unitID','01000135');
AddFormField('unitName','First_1(*空*)');
mds.Position:=0;
memRequest.Lines.LoadFromStream(mds);
mds.Position:=0;
IdHTTP1.Request.ContentType:=RequestContentType;
IdHTTP1.Post(ImpData,mds,memStream);
memContent.Lines.LoadFromStream(memStream);
end;
finally
mds.Free;
memStream.Free;
end;
end;
此代码运用TIDHttp,TIdCookieManager和TIdMultiPartFormDataStream完成客户端向服务端提交数据,同时由于TIDHttp,TIdCookieManager的自动配合,客户/服务端通过cookie建立的Session能够自动得以维护,省了许多麻烦,令我由衷钦佩Indy 控件不愧为经典组件。
CopyTIdBytes(FInternalBuffer, 0, VBuffer, LBufferCount, LCount);
CopyTIdBytes(FInternalBuffer, LCount, FInternalBuffer, 0, LExtra)
以上两句代码,无论是何种状态在第次CopyTIdBytes时都会出现“Range Check Error"错误。进入CopyTIdBytes代码
procedure CopyTIdBytes(const ASource:TIdBytes;const ASourceIndex:integer;
var VDest:TIdBytes;const ADestIndex:integer;const ALength:integer);
begin
{$IFDEF DOTNET}
System.Array.Copy(ASource,ASourceIndex,VDest,ADestIndex,ALength);
{$ELSE}
move(ASource[ASourceIndex], VDest[ADestIndex], ALength);
{$ENDIF}
end;
发现在第二次调用CopyTIdBytes时,ALength=0时,切ASourceIndex==Length(ASource),出现数组下标越界,改正为如下代码,问题解决:
procedure CopyTIdBytes(const ASource:TIdBytes;const ASourceIndex:integer;
var VDest:TIdBytes;const ADestIndex:integer;const ALength:integer);
begin
{$IFDEF DOTNET}
System.Array.Copy(ASource,ASourceIndex,VDest,ADestIndex,ALength);
{$ELSE}
if ALength>0 then
move(ASource[ASourceIndex], VDest[ADestIndex], ALength);
{$ENDIF}
end;
另:在网上TIDHttp与TIdMultiPartFormDataStream合用的代码不是很多,下面贴一个关键片段请方家指正:
var
mds:TIdMultiPartFormDataStream;
memStream:TMemoryStream;
begin
mds:=TIdMultiPartFormDataStream.Create;
memStream:=TMemoryStream.Create;
try
with mds do begin
//AddFormField('name','filename="E:/Ibmnbp4/报表.zip"');
AddFile('file','E:/Ibmnbp4/报表.zip','application/octet-stream');//下划线处,要根据自己的文件类型选择,我是根据Fiddler的跟踪
结果硬编码进去,如有动态识别的代码,请回复我,谢谢
AddFormField('unitID','01000135');
AddFormField('unitName','First_1(*空*)');
mds.Position:=0;
memRequest.Lines.LoadFromStream(mds);
mds.Position:=0;
IdHTTP1.Request.ContentType:=RequestContentType;
IdHTTP1.Post(ImpData,mds,memStream);
memContent.Lines.LoadFromStream(memStream);
end;
finally
mds.Free;
memStream.Free;
end;
end;
此代码运用TIDHttp,TIdCookieManager和TIdMultiPartFormDataStream完成客户端向服务端提交数据,同时由于TIDHttp,TIdCookieManager的自动配合,客户/服务端通过cookie建立的Session能够自动得以维护,省了许多麻烦,令我由衷钦佩Indy 控件不愧为经典组件。
相关文章推荐
- FORM的ENCTYPE="multipart/form-data" 时request.getParameter()值为null问题的解决
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法
- 当提交带文件的的form(enctype="multipart/form-data")时,不能获得参数的解决办法
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法 ?
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法
- FORM的ENCTYPE="multipart/form-data" 时request.getParameter()值为null问题的解决
- 解决腾讯微博错误{"data":null,"errcode":-103,"msg":"check sign error","ret":3}
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法
- 上传文件form表单enctype="multipart/form-data"传值解决办法(代原代码)
- struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null的原因(转http://topic.csdn.net/u/20101210/11/78454a19-7
- INDY 10.0.52 "range check error" fix
- FORM的ENCTYPE="multipart/form-data" 时request.getParameter()值为null问题的解决
- jquery.form附件上传的 $.handleError 、以及 $.httpData报错原因及解决方法
- FORM的ENCTYPE="multipart/form-data" 时request.getParameter()值为null问题的解决
- 上传文件到服务器时,getParamter()方法 与表单 enctype="multipart/form-data"属性
- enctype="multipart/form-data"中Form参数的获取
- 关于input标签带有enctype="multipart/form-data"而导致getParameter获取不到值的解决方法2
- 关于取得enctype="multipart/form-data"表单值的问题
- 在form里提交文件的时候一定要写 enctype="multipart/form-data"