怎样用DELPHI实现文件下载?(50分)

  • 主题发起人 主题发起人 dream20000
  • 开始时间 开始时间
D

dream20000

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样用DELPHI实现文件下载?比如http://www.skycn.com/soft/654987.zip用DELPHI的程序如何下载,最好写好代码。谢谢。
 
参阅:http://vcl.vclxx.com/DELPHI/D32FREE/ICS.ZIP
 
是想通过FTP吗,D下面有例子的,好好看看,我的银行批扣就是用的这个!
 
补充一下:我用的是DELPHI 7, fei_1,你的例子无法下载呀。
我用的是http不是ftp
 
indy控件的idhttp可以,用 get方法,demo有
 
www.tmssoftware.com
www.asta.com
 
下载一下Thttpscan控件(51delphi)中有
 
我收藏的代码,是用 TClientSocket 完成的
procedure TForm1.Button1Click(Sender: TObject);
var
url1:string;
buf1:Tbuf_byte;
rec1:longint;
f1:file;

cmd1:string; //这一行的内容
reclen1,real_reclen1:longint; //服务器返回的长度;实际已经收到的长度
value1:string; //标志们的值
total_len1:longint; //数据总长

begin
try

//self.filename1:='c:/temp1.dat';
assignfile(f1,self.filename1);
can_rec1:=false;
self.stop1:=false;

if FileExists(self.filename1)=true then
begin
reset(f1,1);
pos1:=filesize(f1);
end
else
begin
rewrite(f1,1);
pos1:=0;
end;

seek(f1,pos1);


ClientSocket1.Active:=false;
ClientSocket1.Host:=get_host1(edit1.Text);
ClientSocket1.Port:=80;


url1:='';

self.serfilename:=get_file1(edit1.Text);
self.serhost1:=get_host1(edit1.Text);

//取得文件长度以确定什么时候结束接收[通过"head"请求得到]

ClientSocket1.Active:=false;
ClientSocket1.Active:=true;
url1:='';

url1:=url1+'HEAD /'+self.serfilename+' HTTP/1.1'+#13#10;

//不使用缓存,我附加的
//与以前的服务器兼容
url1:=url1+'Pragma: no-cache'+#13#10;
//新的
url1:=url1+'Cache-Control: no-cache'+#13#10;

//不使用缓存,我附加的_end;

url1:=url1+'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)'+#13#10;
//下面这句必须要有
//url1:=url1+'Host: clq.51.net'+#13#10;
url1:=url1+'Host: '+self.serhost1+#13#10;
url1:=url1+#13#10;

ClientSocket1.Socket.SendText(url1);

while ClientSocket1.Active=true do
begin

if self.stop1=true then break;

cmd1:=socket_rec_line1(ClientSocket1.Socket,60*1000);

//计算文件的长度

if pos(lowercase('Content-Length: '),lowercase(cmd1))=1 then
begin
value1:=copy(cmd1,length('Content-Length: ')+1,length(cmd1));
total_len1:=strtoint(trim(value1));
end;

//计算文件的长度_end;

if cmd1=#13#10 then break;
end;

//取得文件长度以确定什么时候结束接收_end;

//发送get请求,以得到实际的文件数据

clientsocket1.Active:=false;
clientsocket1.Active:=true;

url1:='';

//url1:=url1+'GET http://clq.51.net/textfile.zip HTTP/1.1'+#13#10;
//url1:=url1+'GET /textfile.zip HTTP/1.1'+#13#10;
url1:=url1+'GET /'+self.serfilename+' HTTP/1.1'+#13#10;
url1:=url1+'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*'+#13#10;
//应该可以不要url1:=url1+'Accept-Language: zh-cn'+#13#10;
//应该可以不要url1:=url1+'Accept-Encoding: gzip, deflate'+#13#10;

//不使用缓存,我附加的
//与以前的服务器兼容
//url1:=url1+'Pragma: no-cache'+#13#10;
//新的
//url1:=url1+'Cache-Control: no-cache'+#13#10;

//不使用缓存,我附加的_end;

url1:=url1+'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)'+#13#10;
//接受数据的范围,可选
//url1:=url1+'RANGE: bytes=533200-'+#13#10;
url1:=url1+'RANGE: bytes='+inttostr(pos1)+'-'+#13#10;
//下面这句必须要有
//url1:=url1+'Host: clq.51.net'+#13#10;
url1:=url1+'Host: '+self.serhost1+#13#10;
//应该可以不要
//url1:=url1+'Connection: Keep-Alive'+#13#10;
url1:=url1+#13#10;
ClientSocket1.Socket.SendText(url1);

while ClientSocket1.Active=true do
begin

if self.stop1=true then break;

cmd1:=socket_rec_line1(ClientSocket1.Socket,60*1000);

//是否可接收
if pos(lowercase('Content-Range:'),lowercase(cmd1))=1 then
begin
can_rec1:=true;
end;

//是否可接收_end;

//计算要接收的长度

if pos(lowercase('Content-Length: '),lowercase(cmd1))=1 then
begin
value1:=copy(cmd1,length('Content-Length: ')+1,length(cmd1));
reclen1:=strtoint(trim(value1));
end;

//计算要接收的长度_end;

//头信息收完了
if cmd1=#13#10 then break;
end;

real_reclen1:=0;
while ClientSocket1.Active=true do
begin


if self.stop1=true then break;

//不能接收则退出
if can_rec1=false then break;

//如果文件当前的长度大于服务器标识的长度,则是出错了,不要写入文件中
if filesize(f1)>=total_len1 then
begin
showmessage('文件已经下载完毕了!');
break;
end;

zeromemory(@buf1,sizeof(buf1));
rec1:=ClientSocket1.Socket.ReceiveBuf(buf1,sizeof(buf1));

//如果实际收到的长度大于服务器标识的长度,则是出错了,不要写入文件中
if real_reclen1>=reclen1 then
begin
showmessage('文件已经下载完毕了!');
break;

end;
//如果当前的长度大于服务器标识的长度,则是出错了,不要写入文件中
if pos1=reclen1 then
begin
showmessage('文件已经下载完毕了!');
break;

end;

blockwrite(f1,buf1,rec1);

real_reclen1:=real_reclen1+rec1;

Label1.Caption:=FormatFloat('#,##',real_reclen1)+'/'+FormatFloat('#,##',reclen1);
Label1.Caption:=Label1.Caption+'->'+inttostr(trunc((real_reclen1/reclen1)*100))+'%';
application.ProcessMessages;



end;

closefile(f1);
showmessage('ok');

//发送get请求,以得到实际的文件数据_end;

ClientSocket1.Active:=false;

except
closefile(f1);
showmessage('discon...');
end;


end;
 
接受答案了.
 
后退
顶部