.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服务器的端口一定要打开。

下面就是使用  :

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)

    #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#中将字节数组转换为对象流?

参考:如何在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问题的解决方法 - 简忆博客

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这是一个比较完整的问题,我来给您提供一些思路: 1. 后端获取 FTP 文件列表 可以使用 C# 的 `FtpWebRequest` 类库来连接 FTP,并获取文件列表。这个类库可以通过设置 `Method` 属性为 `ListDirectoryDetails` 来获取文件列表。获取到的文件列表可以通过将其转换为字符串,然后按照换行符或空格分割,再进行处理,得到文件名称、大小、创建时间等信息。 2. 将文件列表返回给前端展示 可以使用 ASP.NET Core 的 MVC 或者 Web API 框架来将获取到的文件列表返回给前端。如果使用 MVC,可以在 Controller 中定义一个 Action 来处理请求,并将获取到的文件列表通过 ViewBag 或者 Model 传递到 View 中。如果使用 Web API,可以定义一个返回 JSON 格式数据的方法,直接将获取到的文件列表序列化为 JSON 格式返回。 3. 前端展示文件列表并生成下载按钮 可以使用 HTML、CSS 和 JavaScript 来展示文件列表和生成下载按钮。可以使用 jQuery 或者其他 JavaScript 库来实现异步请求文件列表,并通过 DOM 操作将获取到的文件列表渲染到页面上。当用户点击下载按钮时,可以通过设置 `window.location.href` 来实现下载文件的功能。 需要注意的是,在连接 FTP 时,需要提供用户名、密码和 FTP 服务器地址等信息。为了保证安全性,建议将这些敏感信息存储在配置文件中,并通过 ASP.NET Core 的配置系统来读取。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值