您现在的位置是:首页 >其他 >.net core使用fluentFTP操作远程ftp服务器存储文件/并预览网站首页其他

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

佳佳可爱吃肉 2024-07-01 11:59:07
简介.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问题的解决方法 - 简忆博客

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

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。