您的位置:首页 > 编程语言 > PHP开发

实现FTP下载进度展示

2017-09-14 10:07 211 查看
功能描述:FTP服务器上存有指定路径的文件夹,需要下载文件夹中的所有文件到本地,而且前台界面需要看到文件下载的进度和下载完成后需要通知界面。

问题难点:FTP提供查询某一个文件的大小的方法,但是不提供查询某一个文件夹大小的方法。(如有人知道如何查询文件夹大小的方法可以告知,谢谢!)

解决办法:下载进度不通过已下载/整个文件夹大小的方法展示,通过已下载文件数量/文件夹内整体文件数量的方法展示。

代码:

重新开线程,该线程用于下载FTP文件夹中的文件

Task.Factory.StartNew(() => { ftp.DownFtpDir("ftp://" + ftpip + "/" + caseresult.ModelGUID + "/" + caseresult.CaseName + "/" + caseresult.DRAW_TYPE + "_" + caseresult.DataType + "/" + username + "/", dir); });

FTP上下载文件夹中的文件
/// <summary>
/// 从FTP下载整个文件夹
/// </summary>
/// <param name="ftpDir">FTP文件夹路径</param>
/// <param name="saveDir">保存的本地文件夹路径</param>
public void DownFtpDir(string ftpDir, string saveDir)
{
bool start = true;
while (start)
{
try
{
List<FileStruct> files = ListFilesAndDirectories(ftpDir);
if (!Directory.Exists(saveDir))
{
Directory.CreateDirectory(saveDir);
}
foreach (FileStruct f in files)
{
if (f.IsDirectory) //文件夹,递归查询
{
DownFtpDir(ftpDir + "/" + f.Name, saveDir + "\\" + f.Name);
}
else //文件,直接下载
{
DownLoadFile(ftpDir + "/" + f.Name, saveDir + "\\" + f.Name);
}
}
start = false;
}
catch (Exception ex)
{

}
}
}

前台JavaScript代码,如果下载的进度小于0.95则继续获取下载的进度,大于0.95则认为下载已经完成
function getProcess(url, modelguid, casename, imagesArray) {
$.ajax({
type: "GET",
url: url,
success: function (data) {
if (data < 0.95) {            //////////可能后台由于某个问题终止下载,data永远小于0.95,程序进入死循环,后期解决
alert(data);
getProcess(url, modelguid, casename, imagesArray);
}
else {
$.ajax({
type: "GET",
url: 'WaterAnimateHandler.ashx?mode=GetImagesPath&DownLoaded=false&modelguid=' + modelguid + '&casename=' + casename + "&ParamName=" + results.options[cases.selectedIndex].value + "&dir=" + "",
success: function (data) {                              ///////返回的数据 第一位:标识是否本地文件与服务器文件数量一致;第二位:本地文件地址;第三位。。最后图片名称
var imagesArray = new Array();
imagesArray = data.split('\n');
ImagesAnimate(imagesArray, casename, modelguid);
}
});
}
}
});
}


后台访问本地文件夹,获取本地文件内当前文件的数量,通过本地文件的数量/FTP服务器上的文件的数量获得当前下载的进度
public void GetDownLoadProcess(HttpContext context)
{
string path = context.Request.QueryString["dir"];
DirectoryInfo file = new DirectoryInfo(path);
FileInfo[] filesCount = file.GetFiles();
double process = (double)filesCount.Count() / (double)imagescount;
context.Response.Write(process.ToString());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: