赞
踩
遇到的问题是:如何在几个不同的服务器之间实现文件的存储和访问,而且这些文件具有一定的机密性,存储在对应的存储服务器B,系统又在另一个服务器A,如何做到对文件的存储和在线预览?
解决方案:在存储服务器上面建立一个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问题的解决方法 - 简忆博客
在系统服务器上面建立了入站规则,设置的是对程序的访问,定位到系统程序,运行执行,就完美解决了防火墙不然访问问题。
基本最终实现了,不同服务器之间文件传输存储问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。