深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 694|回复: 0
打印 上一主题 下一主题

idhttp下载大文件时,总是下一部分就结束,问题研究

[复制链接]

800

主题

1379

帖子

7708

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7708
跳转到指定楼层
楼主
发表于 2019-7-3 17:12:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 13:04 , Processed in 0.024150 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表