您现在的位置是:首页 >其他 >.net core使用fluentFTP操作远程ftp服务器存储文件/并预览网站首页其他
.net core使用fluentFTP操作远程ftp服务器存储文件/并预览
遇到的问题是:如何在几个不同的服务器之间实现文件的存储和访问,而且这些文件具有一定的机密性,存储在对应的存储服务器B,系统又在另一个服务器A,如何做到对文件的存储和在线预览?
解决方案:在存储服务器上面建立一个FTP站点给外部访问,预览也是在存储服务器上面单独开一个站点用于调用返回预览页面。
1.ftp简介
FTP是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文本协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在ftp的使用当中,用户经常遇到两个概念:“下载”(Download)和“上传”(upload)。“下载”文件就是从远程主机拷贝文件至自己的计算机上;“上传”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
首先得建立远程ftp服务器站点;
如何搭建远程ftp服务器:
参考:
Windows Server 2016搭建部署FTP服务器 - AdairHpn - 博客园 (cnblogs.com)
注意:需要创建一个ftp用户 对其设置对文档访问的读写权限,在后端中用于登录ftp服务器
测试本地可以访问ftp站点?可能问题就是防火墙没有打开 21站点端口,需要在防火墙里面打开端口
本地访问不了还有一个原因就是:
去掉勾选,采用 FTP主动访问的方式,再测试一下应该就可以本地访问远程ftp服务了。
ftp服务器的端口一定要打开。
下面就是使用 :
FluentFTP(Class FtpClient Download · robinrodricks/FluentFTP Wiki (github.com))插件进行对ftp服务器的操作。
参考:.NET Core下好用的FTP框架 FluentFTP_rizon886的博客-CSDN博客
项目中经常涉及到将文件批量上传到其它空间或服务器,这个时候我们有可能需要用到FTP协议进行传输,所以这里我推荐使用FluentFTP,一款很好用的FTP传输框架。
参考文章中对实现的代码描述必须要遵循:
1,登录ftp服务器
2,打开连接
3,操作(上传或者下载等),这里穿插这对字符串类型转换问题,参考文章有写到。
4,关闭连接
字符串操作问题:
ftpClient.Execute("OPTS UTF8 ON");
上传文件,和下载文件可以采用官网(Home · robinrodricks/FluentFTP Wiki (github.com))提供接口文档里面,是采取io流还是采取字节等方式上传或者下载。
这里我采用的是流的方式,具体代码我粘贴在下面:(asp.net core)
#region FTP操作服务
/// <summary>
/// 单文件上传到ftp服务器
/// </summary>
/// <param name="file">文件流</param>
/// <param name="RomotePath">ftp远程地址</param>
/// <param name="address">服务器地址</param>
/// <param name="userName">用户名</param>
/// <param name="passWord">密码</param>
/// <param name="port">端口</param>
/// <returns></returns>
public async Task FtpUpload(IFormFile file, string RomotePath, string address, string userName, string passWord, int port)
{
bool isok = false;
//上传文件
using (AsyncFtpClient ftpClient = new AsyncFtpClient($"ftp://{address}", userName, passWord, port, config: new FtpConfig
{
DataConnectionType = FtpDataConnectionType.PORT //主动ftp连接方式
}))
{
if (!ftpClient.IsConnected)
{
await ftpClient.Connect();
//上传文件
try
{
using (var fs = file.OpenReadStream())
{
FtpStatus status =await ftpClient.UploadStream(fs, RomotePath, FtpRemoteExists.Overwrite,true);//同名覆盖 创建文件夹
isok = status == FtpStatus.Success;
if (isok) isok = true;
}
await ftpClient.Disconnect();
ftpClient.Dispose();//关闭服务 释放连接
}
catch (System.Exception)
{
await ftpClient.Disconnect();
ftpClient.Dispose(); //关闭服务 释放连接
throw Oops.Oh("FTP文件上传出现错误!");
}
}
}
if (!isok)
{
Oops.Oh("FTP文件上传异常");
}
}
/// <summary>
/// 字节方式 下载FTP文件
/// </summary>
/// <param name="filename">返回文件名</param>
/// <param name="filePaths">文件在服务器路径</param>
/// <param name="filesize">现有文件的大小(以字节为单位),如果未知,则为 0</param>
/// <param name="address">服务器ip</param>
/// <param name="userName">用户名</param>
/// <param name="passWord">密码</param>
/// <param name="port">端口</param>
/// <returns></returns>
public async Task<FileStreamResult> FtpDownload(string filename,string filePaths,int filesize, string address, string userName, string passWord,int port) {
byte[] outBuffsinfo = new byte[] { };
using (AsyncFtpClient ftpClient = new AsyncFtpClient($"ftp://{address}", userName, passWord, port, config: new FtpConfig
{
DataConnectionType = FtpDataConnectionType.PORT //主动ftp连接方式
}))
{
if (!ftpClient.IsConnected)
{
await ftpClient.Connect();
outBuffsinfo = await ftpClient.DownloadBytes(filePaths, filesize);
await ftpClient.Disconnect();
ftpClient.Dispose();//关闭服务 释放连接
}
}
var fileName = HttpUtility.UrlEncode(filename, Encoding.GetEncoding("UTF-8"));
MemoryStream streams = new MemoryStream(outBuffsinfo);
FileStreamResult result = new FileStreamResult(streams, "application/octet-stream") { FileDownloadName = fileName };
return result;
}
#endregion
调用上面方法即可,页面正常实现上传或下载:
预览操作远程服务器:
在ftp服务器开设一个站点,位置定位到文档目录,打开预览服务器的端口,访问的时候直接输入对应存储地址即可 比如: http://111.2.3.4:2256/doc/2023/05/26/123456.pdf
这样子即可访问预览到对应的文件。
关于 ftp配置参考 完整版:
(70条消息) Windows中FTP搭建_windows ftp_&淡年华&的博客-CSDN博客
(70条消息) FTP服务器开启防火墙相关配置_weixin_34210740的博客-CSDN博客
遇到问题:
1,如何在C#中将字节数组转换为对象流?
MemoryStream stream = new MemoryStream(byteArray);
2,需要自己设置为访问ftp服务器为主动的方式:(上面完整代码里面有这一段)没注意下面连接需要为: await ftpClient.Connect(); 而不是自动连接。
参考:(70条消息) 防火墙导致ftp无法使用的解决办法_iteye_11700的博客-CSDN博客
DataConnectionType = FtpDataConnectionType.PORT //主动ftp连接方式
3,端口问题(防火墙)导致无法访问问题:
方法一:解决FTP因windows防火墙拦截的方法-百度经验 (baidu.com)
方法二:(70条消息) Windows中FTP搭建_windows ftp_&淡年华&的博客-CSDN博客
方法三: 我自己是参照这个解决的:关于window服务器操作系统开启防火墙之后无法使用FTP问题的解决方法 - 简忆博客
在系统服务器上面建立了入站规则,设置的是对程序的访问,定位到系统程序,运行执行,就完美解决了防火墙不然访问问题。
基本最终实现了,不同服务器之间文件传输存储问题。