public class FtpService
{
#region Fields and attributes
private readonly int BufLen = 2048;
/// <summary>
/// ftp服务器地址
/// </summary>
private readonly string FtpServer = Properties.Settings.Default.FtpServer;
/// <summary>
/// ftp用户名
/// </summary>
private readonly string FtpUser = Properties.Settings.Default.user;
/// <summary>
/// ftp密码
/// </summary>
private readonly string FtpPassword = Properties.Settings.Default.password;
#endregion #region Events
/// <summary>
/// 文件上传结果
/// </summary>
/// <param>true-成功,false-失败</param>
/// <param>信息</param>
public event Action<bool, string> EventUploadResult = null;
/// <summary>
/// 文件上传进度
/// </summary>
/// <param>文件已上传大小</param>
/// <param>文件总大小</param>
/// <param>文件名称</param>
public event Action<long, long, string> EventUploadFileProgress = null;
/// <summary>
/// 所有文件上传进度
/// </summary>
/// <param>文件已上传数</param>
/// <param>文件总总数</param>
public event Action<int, int> EventUploadBatchFilesProgress = null;
/// <summary>
/// 文件下载结果
/// </summary>
/// <param>true-成功,false-失败</param>
/// <param>信息</param>
public event Action<bool, string> EventDonwloadResult = null;
/// <summary>
/// 文件下载进度
/// </summary>
/// <param>文件已下载大小</param>
/// <param>文件总大小</param>
/// <param>文件名称</param>
public event Action<long, long, string> EventDonwloadFileProgress = null;
/// <summary>
/// 所有文件下载进度
/// </summary>
/// <param>文件已下载数</param>
/// <param>文件总总数</param>
public event Action<int, int> EventDonwloadBatchFilesProgress = null;
#endregion #region public methods
/// <summary>
/// 上传文件到FTPServer
/// </summary>
/// <param name="file"></param>
public bool UploadFile(string localFilePath)
{
if (string.IsNullOrEmpty(localFilePath))
return false; bool ret = true;
FtpWebRequest reqFtp = null;
try
{
FileInfo localFileInfo = new FileInfo(localFilePath);
string serverFilePath = $@"{FtpServer}\{ localFileInfo.Name}"; //FtpWebRequest配置
reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword); //设置通信凭据
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.UploadFile;
reqFtp.ContentLength = localFileInfo.Length; //读本地文件数据并上传
using (FileStream fileStream = localFileInfo.OpenRead())
{
using (Stream stream = reqFtp.GetRequestStream())
{
long totalLen = 0;
int contentLen = 0;
byte[] buff = new byte[BufLen];
while ((contentLen = fileStream.Read(buff, 0, BufLen)) > 0)
{
stream.Write(buff, 0, contentLen);
totalLen += contentLen;
if (EventUploadFileProgress != null)
EventUploadFileProgress(totalLen, localFileInfo.Length, localFileInfo.Name);
}
}
} ret = true;
if (EventUploadResult != null)
EventUploadResult(ret, $@"{localFilePath} : 上传成功!");
}
catch (Exception ex)
{
ret = false;
if (EventUploadResult != null)
EventUploadResult(ret, $@"{localFilePath} : 上传失败!Exception : {ex.ToString()}");
}
finally
{
if (reqFtp != null)
reqFtp.Abort();
} return ret;
} /// <summary>
/// 从FTPServer上下载文件
/// </summary>
public bool DownloadFile(string fileName, long length, string localDirectory)
{
if (string.IsNullOrEmpty(localDirectory) || string.IsNullOrEmpty(fileName))
return false; bool ret = true;
FtpWebRequest reqFtp = null;
FtpWebResponse respFtp = null;
string localFilePath = $@"{localDirectory}\{fileName}";
string serverFilePath = $@"{FtpServer}\{fileName}"; try
{
if (File.Exists(localFilePath))
File.Delete(localFilePath); //建立ftp连接
reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword);
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.DownloadFile; //读服务器文件数据并写入本地文件
respFtp = reqFtp.GetResponse() as FtpWebResponse;
using (Stream stream = respFtp.GetResponseStream())
{
using (FileStream fileStream = new FileStream(localFilePath, FileMode.Create))
{
long totalLen = 0;
int contentLen = 0;
byte[] buff = new byte[BufLen];
while ((contentLen = stream.Read(buff, 0, BufLen)) > 0)
{
fileStream.Write(buff, 0, contentLen);
totalLen += contentLen;
if (EventDonwloadFileProgress != null && length > 0)
EventDonwloadFileProgress(totalLen, length, fileName);
}
}
} ret = true;
if (EventDonwloadResult != null)
EventDonwloadResult(ret, $@"{serverFilePath} : 下载成功!");
}
catch (Exception ex)
{
ret = false;
if (EventDonwloadResult != null)
EventDonwloadResult(ret, $@"{serverFilePath} : 下载失败!Exception : {ex.ToString()}");
}
finally
{
if (reqFtp != null)
reqFtp.Abort();
if (respFtp != null)
respFtp.Close();
} return ret;
} /// <summary>
/// 批量上传文件
/// </summary>
/// <param name="localFilePaths"></param>
public void UploadFiles(List<string> localFilePaths)
{
if (localFilePaths == null || localFilePaths.Count == 0)
return; int i = 1;
foreach (var localFilePath in localFilePaths)
{
UploadFile(localFilePath);
if (EventUploadBatchFilesProgress != null)
EventUploadBatchFilesProgress(i++, localFilePaths.Count);
}
} /// <summary>
/// 批量下载文件
/// </summary>
/// <param name="fileNames"></param>
/// <param name="localDirectory"></param>
public void DownloadFiles(List<FileModel> files, string localDirectory)
{
if (files == null || files.Count == 0 || string.IsNullOrEmpty(localDirectory))
return; int i = 1;
foreach (var file in files)
{
DownloadFile(file.Name, file.Size, localDirectory);
if (EventDonwloadBatchFilesProgress != null)
EventDonwloadBatchFilesProgress(i++, files.Count);
}
} /// <summary>
/// 异步上传文件到FTPServer
/// </summary>
/// <param name="file"></param>
public async Task<bool> UploadFileAsync(string localFilePath)
{
if (string.IsNullOrEmpty(localFilePath))
return false; bool ret = true;
FtpWebRequest reqFtp = null;
try
{
FileInfo localFileInfo = new FileInfo(localFilePath);
string serverFilePath = $@"{FtpServer}\{ localFileInfo.Name}"; //FtpWebRequest配置
reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword); //设置通信凭据
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.UploadFile;
reqFtp.ContentLength = localFileInfo.Length; //读本地文件数据并上传
using (FileStream fileStream = localFileInfo.OpenRead())
{
using (Stream stream = await reqFtp.GetRequestStreamAsync())
{
long totalLen = 0;
int contentLen = 0;
byte[] buff = new byte[BufLen];
while ((contentLen = await fileStream.ReadAsync(buff, 0, BufLen)) > 0)
{
await stream.WriteAsync(buff, 0, contentLen);
totalLen += contentLen;
if (EventUploadFileProgress != null)
EventUploadFileProgress(totalLen, localFileInfo.Length, localFileInfo.Name);
}
}
} ret = true;
if (EventUploadResult != null)
EventUploadResult(ret, $@"{localFilePath} : 上传成功!");
}
catch (Exception ex)
{
ret = false;
if (EventUploadResult != null)
EventUploadResult(ret, $@"{localFilePath} : 上传失败!Exception : {ex.ToString()}");
}
finally
{
if (reqFtp != null)
reqFtp.Abort();
} return ret;
} /// <summary>
/// 异步从FTPServer上下载文件
/// </summary>
public async Task<bool> DownloadFileAsync(string fileName, long length, string localDirectory)
{
if (string.IsNullOrEmpty(localDirectory) || string.IsNullOrEmpty(fileName))
return false; bool ret = true;
FtpWebRequest reqFtp = null;
FtpWebResponse respFtp = null;
string localFilePath = $@"{localDirectory}\{fileName}";
string serverFilePath = $@"{FtpServer}\{fileName}"; try
{
if (File.Exists(localFilePath))
File.Delete(localFilePath); //建立ftp连接
reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword);
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.DownloadFile; //读服务器文件数据并写入本地文件
respFtp = await reqFtp.GetResponseAsync() as FtpWebResponse;
using (Stream stream = respFtp.GetResponseStream())
{
using (FileStream fileStream = new FileStream(localFilePath, FileMode.Create))
{
long totalLen = 0;
int contentLen = 0;
byte[] buff = new byte[BufLen];
while ((contentLen = await stream.ReadAsync(buff, 0, BufLen)) > 0)
{
await fileStream.WriteAsync(buff, 0, contentLen);
totalLen += contentLen;
if (EventDonwloadFileProgress != null && length > 0)
EventDonwloadFileProgress(totalLen, length, fileName);
}
}
} ret = true;
if (EventDonwloadResult != null)
EventDonwloadResult(ret, $@"{serverFilePath} : 下载成功!");
}
catch (Exception ex)
{
ret = false;
if (EventDonwloadResult != null)
EventDonwloadResult(ret, $@"{serverFilePath} : 下载失败!Exception : {ex.ToString()}");
}
finally
{
if (reqFtp != null)
reqFtp.Abort();
if (respFtp != null)
respFtp.Close();
} return ret;
} /// <summary>
/// 异步批量上传文件
/// </summary>
/// <param name="localFilePaths"></param>
public async void UploadFilesAsync(List<string> localFilePaths)
{
if (localFilePaths == null || localFilePaths.Count == 0)
return; int i = 1;
foreach (var localFilePath in localFilePaths)
{
await UploadFileAsync(localFilePath);
if (EventUploadBatchFilesProgress != null)
EventUploadBatchFilesProgress(i++, localFilePaths.Count);
}
} /// <summary>
/// 异步批量下载文件
/// </summary>
/// <param name="fileNames"></param>
/// <param name="localDirectory"></param>
public async void DownloadFilesAsync(List<FileModel> files, string localDirectory)
{
if (files == null || files.Count == 0 || string.IsNullOrEmpty(localDirectory))
return; int i = 1;
foreach (var file in files)
{
await DownloadFileAsync(file.Name, file.Size, localDirectory);
if (EventDonwloadBatchFilesProgress != null)
EventDonwloadBatchFilesProgress(i++, files.Count);
System.Threading.Thread.Sleep(1000);
}
} /// <summary>
/// 读取远程文件的内容
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public string ReadFromFile(string serverFilePath)
{
if (string.IsNullOrEmpty(serverFilePath))
return ""; string ret = "";
FtpWebRequest reqFtp = null;
FtpWebResponse respFtp = null; try
{
//建立ftp连接
reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword);
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.DownloadFile; respFtp = reqFtp.GetResponse() as FtpWebResponse;
using (Stream stream = respFtp.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
ret = reader.ReadToEnd();
}
}
}
catch (Exception ex)
{
ret = "";
throw ex;
}
finally
{
if (reqFtp != null)
reqFtp.Abort();
if (respFtp != null)
respFtp.Close();
} return ret;
} /// <summary>
/// 读取远程文件的内容
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public async Task<string> ReadFromFileAsync(string serverFilePath)
{
if (string.IsNullOrEmpty(serverFilePath))
return ""; string ret = "";
FtpWebRequest reqFtp = null;
FtpWebResponse respFtp = null; try
{
//建立ftp连接
reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(serverFilePath));
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(FtpUser, FtpPassword);
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.DownloadFile; respFtp = reqFtp.GetResponse() as FtpWebResponse;
using (Stream stream = respFtp.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
ret = await reader.ReadToEndAsync();
}
}
}
catch (Exception ex)
{
ret = "";
throw ex;
}
finally
{
if (reqFtp != null)
reqFtp.Abort();
if (respFtp != null)
respFtp.Close();
} return ret;
} #endregion
}

  

ftp上传文件和下载文件的更多相关文章

  1. Jenkins通过FTP上传站点太多文件导致太慢且不稳定,切换为压包上传再解压的思路(asp.net)

    在本地先处理好要上传的站点文件之后,可能会因为一些网页切图导致ftp上传不稳定,中断,或者文件占用的问题. 那么换了一种实现思路,要借助jenkins的工具jenkins-cli.jar. 解决思路: ...

  2. 批处理向FTP上传指定属性的文件 批处理增量备份的例子

    使用windows批处理向FTP上传具有指定属性的文件,类似增量备份功能. 对一个目录里的几个文件自动上传FTP时只上传有归档属性的文件,然后FTP上传成功后自动清除(本机)刚上传文件的归档属性. 类 ...

  3. 20160113006 asp.net实现ftp上传代码(解决大文件上传问题)

    using System;using System.Configuration;using System.Data;using System.Linq;using System.Web;using S ...

  4. Xshell 本地上传、远程下载文件

    1.Xshell登录工具在创建会话的时候,点击最下面的ZMODEM,可以填写下载的路径和加载的路径:2个路径可以一样也可以不一样: 在下载的时候可以下载到相应的路径去.(我设置的是下载前始终询问) 2 ...

  5. Selenium(十一):设置元素等待、上传文件、下载文件

    1. 设置元素等待 前面我们接触了几个元素等待方法,sleep.implicitly_wait方法,这一章我们就来整体学一下. 现在大多数Web应用程序使用的都是AJAX技术.当浏览器加载页面时,页面 ...

  6. ftp上传html文件

    在用ftp上传当个html文件时,发现html文件会被压缩成一行,在html中的单行注释将后面的代码都注释掉了,导致网页不能正常访问. 8uftp.FlashFXP.filezilla 在这三个ftp ...

  7. Java ftp 上传文件和下载文件

    今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...

  8. ftp上传与下载文件

    准备工作 服务器已经配置好ftp服务 服务器linux centos 7.4 搭建ftp服务器:https://www.cnblogs.com/mmzs/p/10601683.html 需要用到的ja ...

  9. ftp上传或下载文件工具类

    FtpTransferUtil.java工具类,向ftp上传或下载文件: package utils; import java.io.File; import java.io.FileOutputSt ...

  10. java客户端调用ftp上传下载文件

    1:java客户端上传,下载文件. package com.li.utils; import java.io.File; import java.io.FileInputStream; import ...

随机推荐

  1. 关于sws安全助手企业政府版的停止维护以及无法购买(官方已公开永久可用免费序列号并将软件开源)

    sws安全助手企业政府版官方公布的永久可用系列号:XGVPP-NMH47-7TTHJ-W3FW7-8HV2C 安装程序官网下载地址:https://swssoftwareshare.gitee.io/ ...

  2. 最新 4399java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.4399等10家互联网公司的校招Offer,因为某些自身原因最终选择了4399.6.7月主要是做系统复习.项目复盘.Leet ...

  3. 【转】Windows 7下用VMware Workstation 10虚拟机安装 Ubuntu 14.04

    一.软件下载 1.VMware Workstation v10.0.1虚拟机官方简体中文版下载(附永久KEY注册密钥) http://www.linuxidc.com/Linux/2012-11/73 ...

  4. 1.3.1 Lock接口及其实现

    1.锁的本质 2.Lock接口使用ReentrenLock 3.读写锁使用 4.读写锁实现 Lock接口方法 有点意思的是lockInterruptibly(), 只要没有获取到锁就会一直等待,直到某 ...

  5. Win10默认输入法怎么打顿号

    这个问题发现于一个月之前,解决于今天,方式百度. 一.主要是想纪念一下我这一个月的蠢操作(贴图证蠢): 这一个月我的顿号都是这样打出来的,(′д` )…彡…彡 二.闲话少叙,说一下解决方式: 之前用的 ...

  6. 【转】三种方法让你在I2C通信中同时和多个从机通信

    ref:http://tieba.baidu.com/p/3769008030 对于不同地址的模块就不用多说了,直接分别对其地址进行通信即可.那么若拿到相同地址的模块,或者直接是相同的多个模块怎么办呢 ...

  7. 怎样查看 MySQL 版本号

    1. 在命令行中直接查看版本号 mysql -V 2. 在 mysql --help 中查找与版本相关的信息 mysql --help | grep Ver 3. 在mysql命令行里面查看版本信息 ...

  8. django+uwsgi+nginx: websock 报502/400

    耽搁了近2个月,终于解决了,主要是nginx/uwsgi/django相关的配置: 一.django工程settings.py,添加 WEBSOCKET_FACTORY_CLASS = "d ...

  9. json字符转java bean忽略大小写

    使用objectMapper进行json字符的解析 com.fasterxml.jackson.databind.ObjectMapper ob =new com.fasterxml.jackson. ...

  10. 【php设计模式】桥接模式

    定义: 将抽象与实现分离,使它们可以独立变化.它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度. 角色: 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现 ...