|
本帖最后由 zhgc 于 2019-7-3 17:26 编辑
用idhttp下载文件,碰到神奇的问题。
测试下载外面的大文件(大于100M)也正常 ,
但是下自己的apache中的大文档 ,每次都是60M左右就结束
用filestream 和 memorystream都一样的问题:
- var
- MyStream:TFileStream;
- begin
- MyStream:=TFileStream.Create('c:\002.sql', fmCreate);
- try
- IdHTTP1.Get('http://192.168.2.10/002.sql', MyStream);
- ShowMessage('Download Success!');
- except
- ShowMessage('Download Fail!');
- end;
- MyStream.Free;
- end;
复制代码
- var
- tStream: TMemoryStream;
- begin
- tStream := TMemoryStream.Create;
- try
- IdHTTP1.Get('http://192.168.2.10/bartender_bdald.exe', tStream);
- tStream.Position:=0;
- tStream.SaveToFile('c:\bartender_bdald.exe');
- ShowMessage('Download Success!');
- except
- ShowMessage('Download Fail!');
- end;
- tStream.Free;
- end;
复制代码
怀疑是header头的问题。抓包比对确实有差异
但改了cookies ,改了content_type, 改了accept,几乎改成了一样,还是不行
后来干脆清掉所有header信息:
- idhttp1.Request.RawHeaders.Clear;
- idhttp1.Request.CustomHeaders.Clear;
复制代码
奇迹般好了, 但是只好了一次,又不行了。
于是怀疑到了缓存上,清掉IE缓存果然可以好(为什么 idhttp还是饶不开IE缓存?)
在代码 里加清缓存的功能 :
- uses WinInet
- DeleteUrlCacheEntry(PChar('http://192.168.2.10/bartender_bdald.exe'));
- IdHTTP1.Get('http://192.168.2.10/bartender_bdald.exe', tStream);
复制代码
到此问题似乎是解决了!
控件有个CacheControl :
- IdHTTP1.Request.CacheControl := 'no-cache';
- IdHTTP1.Get('http://192.168.2.10/bartender_bdald.exe', tStream);
复制代码
测试了一下,似乎无效!
最后的解决方案,暂定:
- uses WinInet
- procedure TForm1.Button2Click(Sender: TObject);
- var
- MyStream:TFileStream;
- begin
- MyStream:=TFileStream.Create('c:\bartender_bdald.exe', fmCreate);
- try
- idhttp1.Request.RawHeaders.Clear;
- idhttp1.Request.CustomHeaders.Clear;
- DeleteUrlCacheEntry(PChar('http://192.168.2.10/bartender_bdald.exe'));
- DeleteUrlCacheEntry(PChar('http://192.168.2.10'));
- IdHTTP1.Request.CacheControl := 'no-cache';
- IdHTTP1.Get('http://192.168.2.10/bartender_bdald.exe', MyStream);
- ShowMessage('Download Success!');
- except
- ShowMessage('Download Fail!');
- end;
- MyStream.Free;
- end;
复制代码
|
|