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. 如何快速在Github找到你想要的东西

    众所周知 Github是全球最大的xx交友平台,虽然被收购了.但是不并没有什么影响. 使用Git可以做很多事,在这里不再缀述,上面的资源也是多种多样,应有尽有 对于这样一个平台,我们想快速找到自己需要 ...

  2. Java学习笔记-流程控制

    在Java中,最常见的就是顺序结构,另外,还有其他的一些的结构,选择,循环等,这些程序结构的加入,使得程序代码更有选择性 判断结构 if语句 三种格式: if(条件表达式) { 执行语句; } if( ...

  3. 导入/导出 数据库/数据库表(wordpress做例子)

    导入数据库: 1. 数据库层面: 没有wordpress的情况下,建立wordpress数据库 create database wordpress; 进入wordpress数据库 use wordpr ...

  4. Shortest Unsorted Continuous Subarray

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

  5. flannel vxlan工作基本原理及常见排障方法

    写在前面 最近用kubeadm鼓捣了几个cluster集群测试用,网络用的flannel.因为这些机器都不是纯净的环境(以前部署过其他的k8s或者有一些特别的设置),所以部署起来遇到了很多问题.看了下 ...

  6. 剑指offer43:左旋转字符串(字符串):对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。

    1 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”a ...

  7. opencv实现人脸识别(二) 人脸图像采集模块

    这一步我们开始搭建第一个模块,用来检测到图像中的人脸位置,并将它拍下来保存在指定路径 流程图: 代码实现: import cv2 def pic(cam): # 调用笔记本内置摄像头,所以参数为0,如 ...

  8. Python爬虫详解

    Python爬虫详解 Python 之 Urllib库的基本使用 Python中requests库使用方法详解 Beautifulsoup模块基础用法详解 selenium模块基础用法详解 re(正则 ...

  9. 使用Golang时遇到的一些坑

    1. [致命]不是所有Panic都能捕获 我们知道Golang给开发人员提供recover()机制,对堆栈异常(panic)进行捕获并自定义其处理逻辑.下面举个例子: 构造一个除0的异常场景: 输出结 ...

  10. 测试工作小工具~总结&下载连接

    1.Gif录制小工具(动图提单 ≖ᴗ≖) 地址:https://licecap.en.softonic.com/download