当前位置:   article > 正文

.net core使用fluentFTP操作远程ftp服务器存储文件/并预览

fluentftp

遇到的问题是如何在几个不同的服务器之间实现文件的存储和访问,而且这些文件具有一定的机密性,存储在对应的存储服务器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服务器的端口一定要打开。

下面就是使用  :

FluentFTPClass 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)

  1. #region FTP操作服务
  2. /// <summary>
  3. /// 单文件上传到ftp服务器
  4. /// </summary>
  5. /// <param name="file">文件流</param>
  6. /// <param name="RomotePath">ftp远程地址</param>
  7. /// <param name="address">服务器地址</param>
  8. /// <param name="userName">用户名</param>
  9. /// <param name="passWord">密码</param>
  10. /// <param name="port">端口</param>
  11. /// <returns></returns>
  12. public async Task FtpUpload(IFormFile file, string RomotePath, string address, string userName, string passWord, int port)
  13. {
  14. bool isok = false;
  15. //上传文件
  16. using (AsyncFtpClient ftpClient = new AsyncFtpClient($"ftp://{address}", userName, passWord, port, config: new FtpConfig
  17. {
  18. DataConnectionType = FtpDataConnectionType.PORT //主动ftp连接方式
  19. }))
  20. {
  21. if (!ftpClient.IsConnected)
  22. {
  23. await ftpClient.Connect();
  24. //上传文件
  25. try
  26. {
  27. using (var fs = file.OpenReadStream())
  28. {
  29. FtpStatus status =await ftpClient.UploadStream(fs, RomotePath, FtpRemoteExists.Overwrite,true);//同名覆盖 创建文件夹
  30. isok = status == FtpStatus.Success;
  31. if (isok) isok = true;
  32. }
  33. await ftpClient.Disconnect();
  34. ftpClient.Dispose();//关闭服务 释放连接
  35. }
  36. catch (System.Exception)
  37. {
  38. await ftpClient.Disconnect();
  39. ftpClient.Dispose(); //关闭服务 释放连接
  40. throw Oops.Oh("FTP文件上传出现错误!");
  41. }
  42. }
  43. }
  44. if (!isok)
  45. {
  46. Oops.Oh("FTP文件上传异常");
  47. }
  48. }
  49. /// <summary>
  50. /// 字节方式 下载FTP文件
  51. /// </summary>
  52. /// <param name="filename">返回文件名</param>
  53. /// <param name="filePaths">文件在服务器路径</param>
  54. /// <param name="filesize">现有文件的大小(以字节为单位),如果未知,则为 0</param>
  55. /// <param name="address">服务器ip</param>
  56. /// <param name="userName">用户名</param>
  57. /// <param name="passWord">密码</param>
  58. /// <param name="port">端口</param>
  59. /// <returns></returns>
  60. public async Task<FileStreamResult> FtpDownload(string filename,string filePaths,int filesize, string address, string userName, string passWord,int port) {
  61. byte[] outBuffsinfo = new byte[] { };
  62. using (AsyncFtpClient ftpClient = new AsyncFtpClient($"ftp://{address}", userName, passWord, port, config: new FtpConfig
  63. {
  64. DataConnectionType = FtpDataConnectionType.PORT //主动ftp连接方式
  65. }))
  66. {
  67. if (!ftpClient.IsConnected)
  68. {
  69. await ftpClient.Connect();
  70. outBuffsinfo = await ftpClient.DownloadBytes(filePaths, filesize);
  71. await ftpClient.Disconnect();
  72. ftpClient.Dispose();//关闭服务 释放连接
  73. }
  74. }
  75. var fileName = HttpUtility.UrlEncode(filename, Encoding.GetEncoding("UTF-8"));
  76. MemoryStream streams = new MemoryStream(outBuffsinfo);
  77. FileStreamResult result = new FileStreamResult(streams, "application/octet-stream") { FileDownloadName = fileName };
  78. return result;
  79. }
  80. #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#中将字节数组转换为对象流?

参考:如何在C#中将字节数组转换为对象流? - 经验笔记

MemoryStream stream = new MemoryStream(byteArray);

2,需要自己设置为访问ftp服务器为主动的方式:(上面完整代码里面有这一段)没注意下面连接需要为:  await ftpClient.Connect(); 而不是自动连接。

参考:(70条消息) 防火墙导致ftp无法使用的解决办法_iteye_11700的博客-CSDN博客

  1. DataConnectionType = FtpDataConnectionType.PORT //主动ftp连接方式

3,端口问题(防火墙)导致无法访问问题

方法一:解决FTP因windows防火墙拦截的方法-百度经验 (baidu.com)

方法二:(70条消息) Windows中FTP搭建_windows ftp_&淡年华&的博客-CSDN博客

方法三: 我自己是参照这个解决的:关于window服务器操作系统开启防火墙之后无法使用FTP问题的解决方法 - 简忆博客

在系统服务器上面建立了入站规则,设置的是对程序的访问,定位到系统程序,运行执行,就完美解决了防火墙不然访问问题。

基本最终实现了,不同服务器之间文件传输存储问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/199854
推荐阅读
相关标签
  

闽ICP备14008679号