Http组传送和接收大数据量字符串问题。(100分)

  • 主题发起人 主题发起人 tanghz
  • 开始时间 开始时间
T

tanghz

Unregistered / Unconfirmed
GUEST, unregistred user!
我试过用IdHttp like this:
memo2.Text:= IdHTTP1.Post('http://www.ncbi.nlm.nih.gov/blast/Blast.cgi',memo1.Lines);
返回的数据很大。但是被截断了。memo2中只显示了部分结果?如何解决?

我试过用 synapse 完成同样的操作。当发送的数据短时,工作正常,发送长字符串(大约4K-1.5M)时则发生错误。
不知如何解决?
最好有代码。
 
TMemo本身最多只能保存64K数据。
 
你用的是那个版本的D?
我的memo可以开几兆的文本。
而且,即便是62K也没戏。
 
使用HttpClient发送大数据时,客户端必须指定一个Http Head,应该是:
Content-Type: multipart/form-data; boundary=13415123650151043
这样的格式,其中boundary字符可以自定义。

这是向服务器端通告客户端的数据较大,是多节发送的。

在服务器端,CGI程序必须有能力通过Content-Type和boundary来识别和处理多节数据,如
果不这样,Http Server将只读出数据的前48K。

通常,对于Indy和synapse这样的成型的Http Server Component,会自动识别multipart/form-data,
你要做的,可能只是在客户端加入Head。但是,也许你还必须改写'Blast.cgi',因为它可能
是根本不识别multipart/form-data的。
 
多谢答复,不过这样不是很麻烦?我必须要自己设定boundary字符,把要传送的数据切分,
能否给断代码什么的?
远端server 是别人的,无法修改。你知道IE用的是什么吗?
用IE发同样的数据,没有问题。

另外,IdHTTP的接受问题该如何解决?
 
哈~~~原来如此。

如果Server已经能接受IE中的大文件了,则证明它已经识别multipart/form-data。不用改了。

我刚才又读了一下Indy的源代码。发大数据并不难啊,indy自带了对多节数据的支持呢。如下:
AObj := TIdMultiPartFormDataStream.Create;
AObj.AddFile('aFieldName', 'c:/abcd.DAT', 'AContentType');
s := IdHTTP.Post(AURL, AObj);

其中,AContentType可以通过读文件的Mime类型来取得。如下例:
function GetMIMETypeFromFile(AFile: TFileName): string;
begin
with TIdMimeTable.Create(true) do
try
result := GetFileMIMEType(AFile);
finally
Free;
end;
end;

其它的,你应该更多地读我以前发的这个贴子,已经很详细了:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1221113
 
hi.请看清问题

memo2.Text:= IdHTTP1.Post('http://www.ncbi.nlm.nih.gov/blast/Blast.cgi',memo1.Lines);
返回的数据很大。但是被截断了。memo2中只显示了部分结果?如何解决?
 
哈。我看错问题了。哈哈哈~~~~~~~

我想,可能与返回的内容有关系。因为返回内容可能是任意的,这样的话,也就可能存在#0。
在代码中:
procedure TIdCustomHTTP.Post(AURL: string; const ASource: TStrings; const AResponseContent: TStream);
var
LParams: TStringStream;
begin
//...
LParams := TStringStream.Create(SetRequestParams(ASource));
try
Post(AURL, LParams, AResponseContent);
finally
LParams.Free;
end;
end;

返回字符串是不处理#0的,这样会导致字符串被截断。

你可以用这样一个函数:
procedure FullPost(AURL: string; const ASource: TStrings);
var
LParams: TMemoryStream;
begin
//...
LParams := TMemoryStream.Create(SetRequestParams(ASource));
try
IdHttp.Post(AURL, LParams, AResponseContent);
ShowMessage(IntToStr(LParams));
Memo1.Lines.LoadFromStream(LParams);
finally
LParams.Free;
end;
end;
来调入全部的字符串,并显示长度。如果这样显示的长度仍然字节数不够。哈哈,就是TIdHttp
写错了。
上面这个过程只是个示例,具体的,你自己写。:)
 
多谢。
问题解决,使用memortsream 收取返回的结果。可以收全。
看来,还是Indy 的部件bug 最少,功能最强。
 
大哥,帮我看看吧,我都要疯了,555555555555555555555555555555
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2393713
 
问题自行解决!
 
后退
顶部