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. 如何使用 python 接入虹软 ArcFace SDK

    公司需要在项目中使用人脸识别SDK,并且对信息安全的要求非常高,在详细了解市场上几个主流人脸识别SDK后,综合来看虹软的Arcface SDK比较符合我们的需求,它提供了免费版本,并且可以在离线环境下 ...

  2. sql语句 两表关联查询计算数量

    select sum(a1.`num`)   from `order_orderlistrow` as a1 INNER JOIN `order_orderlist` as a2 on a1.`ord ...

  3. new pdo 连接很慢的原因和解决办法

    1.使用IP而不是域名,使用域名会让PDO在连接之前进行一次不必要的dns lookup,当DNS缓存过于巨大的时候,这个问题可能会更严重.(即使是运行在本机,使用 127.0.0.1 而不是 loc ...

  4. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  5. TypeScript的变量声明

    1.全新的变量声明方式 let和const是JavaScript ES6中新添加的变量声明方式.let在很多方面与var是相似的,但是它可以避免一些在JavaScript里常见一些问题. 而const ...

  6. Mac命令行启动关闭Tomcat

    在Tomcat目录的bin目录下执行sh startup.sh或./startup.sh命名启动Tomcat,执行sh shutdown.sh或./shutdown.sh命令关闭Tomcat 浏览器输 ...

  7. mysql 连接远程连接服务器 1130错误

    今天在用sqlyog连接非本地的Mysql服务器的数据库,居然无法连接很奇怪,报1130错误, ERROR 1130: Host 192.168.3.100 is not allowed to con ...

  8. 用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中

    现代生活中,我们很难不与excel表打交道,excel表有着易学易用的优点,只是当表中数据量很大,我们又需要从其他表册中复制粘贴一些数据(比如身份证号)的时候,我们会越来越倦怠,毕竟我们不是机器,没法 ...

  9. 第十章 ZYNQ-MIZ701 DDR3 PS读写操作方案

      本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写. 本文所使用的开发板是Miz701 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4 10.0本章难度 ...

  10. OBB碰撞

    OBB碰撞检测,坐标点逆时针 class OBBTest extends egret.DisplayObjectContainer { private obb1:OBB; private obb2:O ...