有哪位高手知道怎样实现idFtp上传续传方法.
解决方案 »
- 久其软件的.dbf和.jqi文件可以用什么工具打开?
- 时间的比较问题
- 用delphi编一个网络小游戏,它的通信用的是什么控件?
- DgGridEH的DEMO例子中,标题下面的第一行,是固定的,而且可以有下拉框。是怎么设置呢?
- 明天结婚办喜事,只有80分了(巴适),全散了,祝大家国庆快乐!
- IntraWeb运行在什么WEB服务器的?IIS可以吗?
- 关于TQuery的错误处理的问题!
- Var SA:string, SA的长度是否有限制?,是否可大于254?
- 菜鸟60分求教全排列最优算法。
- 急!急!急!有关SQL查询的参数问题
- 请教:怎么把对象转存到byte()数组?
- 请教大家在SQL中的日期处理问题,在人事表怎样用SQL语句更新全部员工的的工龄和年龄?
idFtp有个CanResume属性,可以检测站点是否支持断点续传。
idFtp的Get/Set方法中有个参数AResume,用来控制上传/下载文件时是否支持断点续传。
如果没有AResume参数,那可能是idFTP版本较早。
我用的是idFTP V9.0是有AResume参数的。
procedure TFTPModel.Upload;function RemoveExt(const AFileName: String): String;
{ Helper function to removes the extension from a file name. }
begin
if Pos('.', AFileName) <> 0 then
Result := Copy(AFileName, 1, Pos('.', AFileName)-1)
else
Result := AFileName;
end;var
FileName : string;
sZipFileName:string;
Item : TListItem;
QueueItem : TListItem;
begin
//没有登录文件服务器,不进行上传处理。
if not FFTPClient.Connected Then
begin
Application.MessageBox('没有登录文件传输服务器,不能上传文件',SysHintMsgTitle);
Exit;
end;
//没有选中目录
if FLVLocalFile.Selected = nil then Exit; Item := FLVLocalFile.Selected;
FLVQueue.Clear;
while Item <> nil do
begin
//这里加了约束,是文件夹的话,不加到上传队列,
//也就是说不支持文件夹的上传。
if Item.SubItems[0]<>'文件夹' then
begin
QueueItem := FLVQueue.Items.Add;
QueueItem.Caption := Item.Caption;
QueueItem.SubItems.Add(FLocaLPath);
QueueItem.SubItems.Add(Item.SubItems[1]);
QueueItem.SubItems.Add('->');
QueueItem.SubItems.Add('');
QueueItem.SubItems.Add(FRemotePath);
end;
Item:=FLVLocalFile.GetNextItem(Item,sdAll, [isSelected]);
end;
FLVQueue.Refresh;
{
LViewLocalFile.Enabled:=false;
LViewRemoteFile.Enabled:=False;
RemoteUpDir.Enabled:=false;
}
//上传文件。表示正在上传
FLoadOption:=loUpLoad;
try
while FLVQueue.Items.Count > 0 do
begin
FileName:=FLVQueue.Items[0].Caption;
FLVQueue.Items[0].SubItems[3]:='正在上传';
FLVQueue.Refresh;
//本来上传语句是下面这句,由于,怕出现 中断上传 的问题,也就是服务端有该目录,
//所以注释这句。采用下面这句,追加上传。
// 2005-3-11 中午,覆盖模式。
//FFTPClient.Put(FLocalPath+'\'+FileName, FileName);
//追加模式,再文件后面追加内容。
{//断点传输解决方案。
问: 请问idftp能否做到断点续传,下载倒是蛮好实现的,但是不知道上传要怎么做到断点续传???
且如果文件名未改变,但文件改变了,下载(断点续传)时是否会自动判断???
答: 上传断点续传原理是这样的:
假设有个 file.zip 传了50%断掉后
先 resumepoint:=idftp1.size('file.zip');
再 打开 本地 file.zip 到fileStream,seek 到 resumepoint;
idftp1.Quote('REST '+floattostr(resumepoint));
idftp1.put(fileStream,Orderputfilename,true);
关键一点是要修改indy 的源代码
indy是用sendcmd 'APPE' 方式续上传的,要改为sendcmd 'STOR'
---
注:本方法在serv-u 5.0 ,indy 9.0.4上测试通过
} //压缩文件
{sZipFileName:=RemoveExt(FileName)+'.Zip';
FVCLZip.FilesList.Clear;
FVCLZip.FilesList.Add(FLocalPath+'\'+FileName);
FVCLZip.ZipName:=FLocalPath+'\'+sZipFileName;
FVCLZip.Zip;} //以前的代码注释于 2005年4月14日
(* 用Size方法就可以!返回 550就文件不存在 213就存在 *)
//远程存在,则删除
if FFTPClient.Size(FRemotePath+sZipFileName)>-1 then
begin
FFTPClient.Delete(FRemotePath+sZipFileName);
end; //上传文件函数
FFTPClient.Put(FLocalPath+'\'+sZipFileName, sZipFileName,True);
//删除本地临时文件
DeleteFile(PChar(FLocalPath+'\'+sZipFileName)); //更新远程路径。
//*********
RemoteChangeDir;
FLVQueue.items[0].Delete;
FLVQueue.Refresh;;
end;
FLoadOption:=loNone;
except
FLVQueue.Items[0].SubItems[3]:='错误';
FLoadOption:=loNone;
end;
end;
上传还是不可以续传!