下载大文件时,断点续传是很有必要的,特别是网速度慢且不稳定的情况下,很难保证不出意外,一旦意外中断,又要从头下载,会很让人抓狂。断点续传就能很好解决意外中断情况,再次下载时不需要从头下载,从上次中断处继续下载即可,这样下载几G或十几G大小的一个文件都没问题。本文介绍利用miniframe开源Web框架分别在lazarus、delphi下实现文件HTTP下载断点续传的功能,本文Demo还实现了批量下载文件,同步服务器上的文件到客户端的功能。文件断点续传原理:分块下载,下载后客户端逐一合并,同时保存已下载的位置,当意外中断再次下载时从保存的位置开始下载即可。这其中还要保证,中断后再次下载时服务器上相应的文件如果更新了,还得重新下载,不然下载到的文件是错了。说明:以下代码lazarus或delphi环境下都能使用。全部源码及Demo请到miniframe开源web框架下载: miniframe开源Web框架(适配delphi、lazarus)或https://github.com/dajingshan/miniframe。
服务器端代码
文件下载断点续传服务器端很简单,只要提供客户端要求下载的开始位置和指定大小的块即可。
以下是服务器获取文件信息和下载一个文件一块的代码:
- <%@//Script头、过程和函数定义
- program codes;
- %>
- <%!//声明变量
- var
- i,lp: integer;
- FileName, RelativePath, FromPath, ErrStr: string;
- json: TminiJson;
- FS: TFileStream;
- function GetOneDirFileInfo(Json: TminiJson; Path: string): string;
- var
- Status: Integer;
- SearchRec: TSearchRec;
- json_sub: TminiJson;
- begin
- Path := PathWithSlash(Path);
- SearchRec := TSearchRec.Create;
- Status := FindFirst(Path + '*.*', faAnyFile, SearchRec);
- try
- while Status = 0 do
- begin
- if SearchRec.Attr and faDirectory = faDirectory then
- begin
- if (SearchRec.name <> '.') and (SearchRec.name <> '..') then
- GetOneDirFileInfo(Json, Path + SearchRec.Name + '\');
- end else
- begin
- FileName := Path + SearchRec.Name;
- try
- if FileExists(FileName) then
- begin
- json_sub := Pub.GetJson;
- json_sub.SO; //初始化 或 json.Init;
- json_sub.S['filename'] := SearchRec.name;
- json_sub.S['RelativePath'] := GetDeliBack(FileName, FromPath);
- json_sub.S['FileTime'] := FileGetFileTimeA(FileName);
- json_sub.I['size'] := SearchRec.Size;
- json.A['list'] := json_sub;
- end;
- except
- //print(ExceptionParam)
- end;//}
- end;