近期有一问题困扰我好久不得解决,盼有高手来帮一把:
我用基于WinInet 的Api函数InternetOpen,InternetConnnect,HttpOpenRequest,HttpSendRequest,HttpQueryInfo,InternetReadFile等下载文件.
成功下载没问题,但是,如果,第一次下载成功后,随即更新服务器上被下载的文件,以后再下载的,都是更新前的文件。为了防止从缓存中读取,对相关API参数作了强调:
//Internet访问读取标记
InternetFlag := INTERNET_FLAG_RELOAD + INTERNET_FLAG_NO_CACHE_WRITE + INTERNET_FLAG_HYPERLINK+INTERNET_FLAG_PRAGMA_NOCACHE;
但是,问题依旧,下载的还是更新前的文件。部分代码如下:
//********************************************************************************
//使用代理服务器
InternetOpen(PChar(FTAgent),INTERNET_OPEN_TYPE_PROXY, PChar(FGetStyleString), Nil,0)
.......
//使用HTTP的默认端口下载
hConnect := InternetConnect(hSession, PChar(HostName),
INTERNET_DEFAULT_HTTP_PORT, PChar(FTUserName), PChar(FTPassword), INTERNET_SERVICE_HTTP,0, 0);
......
//Internet访问读取标记
InternetFlag := INTERNET_FLAG_RELOAD + INTERNET_FLAG_NO_CACHE_WRITE + INTERNET_FLAG_HYPERLINK+INTERNET_FLAG_PRAGMA_NOCACHE;
......
hRequest := HttpOpenRequest(hConnect, RequestMethod, PChar(FileName), 'HTTP/1.0',
PChar(FTReferer), @AcceptType, InternetFlag, 0);\
......
if FTPostQuery = '' then
HttpSendRequest(hRequest, nil, 0, nil, 0)
else
HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,
PChar(FTPostQuery), Length(FTPostQuery));
......
dwIndex := 0;
dwBufLen := 1024;
GetMem(Buf, dwBufLen); FTResult := HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH,
Buf, dwBufLen, dwIndex);
......
if not InternetReadFile(hRequest, @Data, SizeOf(Data), BytesToRead) then Break
else
if BytesToRead = 0 then Break
else
begin
if FTToFile then
BlockWrite(f, Data, BytesToRead)
else
begin
TempStr := Data;
SetLength(TempStr, BytesToRead);
FTStringResult := FTStringResult + TempStr;
end; inc(BytesReaded, BytesToRead);
end;
end;
我用基于WinInet 的Api函数InternetOpen,InternetConnnect,HttpOpenRequest,HttpSendRequest,HttpQueryInfo,InternetReadFile等下载文件.
成功下载没问题,但是,如果,第一次下载成功后,随即更新服务器上被下载的文件,以后再下载的,都是更新前的文件。为了防止从缓存中读取,对相关API参数作了强调:
//Internet访问读取标记
InternetFlag := INTERNET_FLAG_RELOAD + INTERNET_FLAG_NO_CACHE_WRITE + INTERNET_FLAG_HYPERLINK+INTERNET_FLAG_PRAGMA_NOCACHE;
但是,问题依旧,下载的还是更新前的文件。部分代码如下:
//********************************************************************************
//使用代理服务器
InternetOpen(PChar(FTAgent),INTERNET_OPEN_TYPE_PROXY, PChar(FGetStyleString), Nil,0)
.......
//使用HTTP的默认端口下载
hConnect := InternetConnect(hSession, PChar(HostName),
INTERNET_DEFAULT_HTTP_PORT, PChar(FTUserName), PChar(FTPassword), INTERNET_SERVICE_HTTP,0, 0);
......
//Internet访问读取标记
InternetFlag := INTERNET_FLAG_RELOAD + INTERNET_FLAG_NO_CACHE_WRITE + INTERNET_FLAG_HYPERLINK+INTERNET_FLAG_PRAGMA_NOCACHE;
......
hRequest := HttpOpenRequest(hConnect, RequestMethod, PChar(FileName), 'HTTP/1.0',
PChar(FTReferer), @AcceptType, InternetFlag, 0);\
......
if FTPostQuery = '' then
HttpSendRequest(hRequest, nil, 0, nil, 0)
else
HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,
PChar(FTPostQuery), Length(FTPostQuery));
......
dwIndex := 0;
dwBufLen := 1024;
GetMem(Buf, dwBufLen); FTResult := HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH,
Buf, dwBufLen, dwIndex);
......
if not InternetReadFile(hRequest, @Data, SizeOf(Data), BytesToRead) then Break
else
if BytesToRead = 0 then Break
else
begin
if FTToFile then
BlockWrite(f, Data, BytesToRead)
else
begin
TempStr := Data;
SetLength(TempStr, BytesToRead);
FTStringResult := FTStringResult + TempStr;
end; inc(BytesReaded, BytesToRead);
end;
end;
解决方案 »
- 一个非常怪异的问题
- 初学者delphi中遇到的警告窗口 很急
- 要实现这样一功能 有一DBgrid,这时修改了数据库中某一记录的值,要求同步刷新出来,但没这么简单,进来细说
- Dbgrid只能显示3个字段? 在线急等!!!!
- Delphi程序员认证报名地点在哪里?时间?要多少钱啊?
- 我在用ClientDataSet执行DELETE的时候直接把数据库里的数据删除了,能不能先在缓存里面删掉呢,???
- 如何得取指定SQL server数据库(test)的数据空间及日志空间?
- 各位大哥,小弟做个按纽,要完成的功能是把dbgrid中的选择出来的数据导出到access中,小弟用的是sql server!请各位指教!在线等!
- 轻松一下!!——一切皆天成——崀山山水赛桂林
- 关于在Delphi中调用存储过程的问题!急急急!!!
- 如何把image控件上显示的图像打印出来?
- 请问哪里有比较全的关于delphi命名规则的网页
INTERNET_FLAG_NO_UI or
INTERNET_FLAG_RESYNCHRONIZE or
INTERNET_FLAG_PRAGMA_NOCACHE or
INTERNET_FLAG_RELOAD or
INTERNET_FLAG_NO_CACHE_WRITE
-------------------
曾经考虑过用INDY,但是,有时总出现“Connection reset by peer”的错误,不知道如何处理。