深圳全飞鸿

标题: idhttp下载大文件时,总是下一部分就结束,问题研究 [打印本页]

作者: zhgc    时间: 2019-7-3 17:12
标题: idhttp下载大文件时,总是下一部分就结束,问题研究
本帖最后由 zhgc 于 2019-7-3 17:26 编辑

用idhttp下载文件,碰到神奇的问题。
测试下载外面的大文件(大于100M)也正常 ,
但是下自己的apache中的大文档 ,每次都是60M左右就结束

用filestream 和 memorystream都一样的问题:
  1. var
  2.    MyStream:TFileStream;
  3. begin
  4.     MyStream:=TFileStream.Create('c:\002.sql', fmCreate);
  5.   try
  6.     IdHTTP1.Get('http://192.168.2.10/002.sql', MyStream);
  7.     ShowMessage('Download Success!');
  8.   except
  9.     ShowMessage('Download Fail!');
  10.   end;
  11.   MyStream.Free;
  12. end;
复制代码

  1. var
  2.   tStream: TMemoryStream;
  3. begin
  4.   tStream := TMemoryStream.Create;
  5.   try
  6.     IdHTTP1.Get('http://192.168.2.10/bartender_bdald.exe', tStream);
  7.     tStream.Position:=0;
  8.     tStream.SaveToFile('c:\bartender_bdald.exe');
  9.     ShowMessage('Download Success!');
  10.   except
  11.     ShowMessage('Download Fail!');
  12.   end;
  13.   tStream.Free;
  14. end;
复制代码



怀疑是header头的问题。抓包比对确实有差异
但改了cookies ,改了content_type, 改了accept,几乎改成了一样,还是不行

后来干脆清掉所有header信息:
  1.     idhttp1.Request.RawHeaders.Clear;
  2.     idhttp1.Request.CustomHeaders.Clear;
复制代码


奇迹般好了, 但是只好了一次,又不行了。

于是怀疑到了缓存上,清掉IE缓存果然可以好(为什么 idhttp还是饶不开IE缓存?


在代码 里加清缓存的功能 :
  1. uses WinInet

  2.      DeleteUrlCacheEntry(PChar('http://192.168.2.10/bartender_bdald.exe'));
  3.     IdHTTP1.Get('http://192.168.2.10/bartender_bdald.exe', tStream);
复制代码



到此问题似乎是解决了!


控件有个CacheControl :

  1.      IdHTTP1.Request.CacheControl := 'no-cache';
  2.     IdHTTP1.Get('http://192.168.2.10/bartender_bdald.exe', tStream);
复制代码



测试了一下,似乎无效!


最后的解决方案,暂定:
  1. uses WinInet

  2. procedure TForm1.Button2Click(Sender: TObject);
  3. var
  4.    MyStream:TFileStream;
  5. begin
  6.     MyStream:=TFileStream.Create('c:\bartender_bdald.exe', fmCreate);
  7.   try
  8.     idhttp1.Request.RawHeaders.Clear;
  9.     idhttp1.Request.CustomHeaders.Clear;
  10.     DeleteUrlCacheEntry(PChar('http://192.168.2.10/bartender_bdald.exe'));
  11.     DeleteUrlCacheEntry(PChar('http://192.168.2.10'));
  12.     IdHTTP1.Request.CacheControl := 'no-cache';
  13.     IdHTTP1.Get('http://192.168.2.10/bartender_bdald.exe', MyStream);
  14.     ShowMessage('Download Success!');
  15.   except
  16.     ShowMessage('Download Fail!');
  17.   end;
  18.   MyStream.Free;
  19. end;
复制代码









欢迎光临 深圳全飞鸿 (http://www.nagomes.com/disc/) Powered by Discuz! X3.2