【实战-干货】手把手带你搭建自己的FTP服务器,实现文件上传、下载_搭建ftp服务器

在这里插入图片描述

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

步骤二: 打开IIS管理器

操作步骤: 电脑 => 控制面板 => 管理工具 => Internet Infomation Services(IIS)管理器

IIS管理平台

步骤三: 创建FTP服务器

操作1: 在某个盘符如D盘,创建一个FTP共享文件夹,用于FTP共享文件存放地址

步骤2: 右键IIS管理器左边导航栏 => 添加FTP站点

在这里插入图片描述

步骤3: 指定【站点名称】和【FTP共享的文件夹路径】

在这里插入图片描述

步骤4: 配置FTP服务器相关信息

在这里插入图片描述

步骤5: 配置FTP服务器验证和权限信息【注意:如果想通过程序实现上传、下载功能,身份验证中的基本选项需要勾选上,后面程序需要通过这个方式使用账号和密码登录到FTP服务器

在这里插入图片描述

步骤5: 到这一步,一个FTP服务器就已经搭建完成了,在IIS管理器还可以对搭建好的FTP服务器进行配置管理。

在这里插入图片描述

步骤6: 在同一网段的小伙伴可以通过:ftp://ftp配置的ip地址 格式访问到FTP服务器。

在这里插入图片描述

♌ 3.5、FTP服务器搭建出现的问题

问题一: FTP按照流程搭建完成后,在同一网段的小伙伴却无法访问!

原因: 可能是开启了防火墙拦截,需要在防火墙放行FTP服务器。

解决: 电脑 => 控制面板 => Windows Defender 防火墙 => 允许应用通过Windows Defender 防火墙进行通信 => 勾选【FTP服务器】

在这里插入图片描述

四、通过程序实现FTP文件的上传和下载

🏡 四、通过程序实现FTP文件的上传和下载

通过上面的步骤,我们完成了FTP服务器的搭建,可以手动将文件上传到服务器,让在同一网段的小伙伴自由从上面下载,但是,在实际业务开发中,我们需要的是通过程序实现上传和下载,而不是通过人为手动的方式,下面,就来看看如何实现吧。

说明: 文章只贴出部分代码,全部案例代码已经上传到Gitee,需要者可直接访问下载(有帮助记得给个star呀):【实战-FTP服务器搭建,实现上传、下载

💗 4.1、项目结构

在这里插入图片描述

💙 4.2、实现技术

1、Apache下的commons-net依赖包: 它包含了一组网络实用工具和协议实现,支持的协议包括:FTP、NNTP、NTP、POP3(S)、SMTP(S)、Telnet、Whois等等,可以用它来实现文件的上传和下载功能。

2、spring-boot-starter-web: web相关支持

3、SpringBoot依赖: 快速构建JAVA项目

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.6</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

💚 4.2、相关配置

ftp:
  client:
    # ftp客户端文件使用的字符集
    charset: GBK
  server:
    # ftp服务器绑定ip或者域名
    hostname: 127.0.0.1
    # 端口
    port: 21
    # 连接ftp服务器的用户名
    username: user
    # 密码
    password: 123456
    # ftp的共享文件路径
    workingPath: D:/share/FTPServer
    # ftp服务器文件使用的字符集(用于上传包含中文名的文件和下载包含中文名的文件 - 很重要)
    charset: ISO-8859-1


💛 4.3、核心代码

因为FTP服务器的上传、下载都是很通用的功能,所以博主封装成了一个工具类,有需要的小伙伴可以引入依赖和相关配置后,直接就可以使用该工具类。

1、上传核心代码:

/\*\*
 \* 上传
 \*
 \* @return
 \*/
    public boolean upload(FtpUploadParam param) {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        //1 测试连接
        if (connect(ftpClient, param.getHostname(), param.getPort(), param.getUsername(), param.getPassword())) {
            try {
                //2 检查工作目录是否存在,不存在则创建
                if (!ftpClient.changeWorkingDirectory(param.getWorkingPath())) {
                    ftpClient.makeDirectory(param.getWorkingPath());
                }
                // 将文件编码成Ftp服务器支持的编码类型(FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。)
                String fileName = new String(param.getSaveName().getBytes(ftpClientCharset), ftpServerCharset);
                // 3 上传文件
                if (ftpClient.storeFile(fileName, param.getInputStream())) {
                    flag = true;
                } else {
                    log.warn("FtpUtils uploadFile unsuccessfully!!");
                }
            } catch (IOException e) {
                log.error("FtpUtils upload in error:{}", e);
            } finally {
                disconnect(ftpClient);
            }
        }
        return flag;
    }

2、下载核心代码:

public boolean download(FtpDownloadParam param, String downloadFileName) {
        FTPClient ftpClient = new FTPClient();
        FileOutputStream out = null;
        //1 测试连接
        if (connect(ftpClient, param.getHostname(), param.getPort(), param.getUsername(), param.getPassword())) {
            try {
                File file;
                String localPath = param.getDownloadPath() + param.getFileName();
                out = new FileOutputStream(new File(localPath));
                //2 检查工作目录是否存在,不存在返回
// if (!ftpClient.changeWorkingDirectory(param.getWorkingPath())) {
// return false;
// }
                /\*
 \* 打开FTP服务器的PASS模式(不记得FTP协议支持的模式请翻到文章第一阶段)
 \* 这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据. 因为ftp
 \* server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,可能出现出现阻塞
 \*/
                ftpClient.enterLocalPassiveMode();
                // 设置文件的传输方式
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                // 将文件编码成Ftp服务器支持的编码类型(FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。)
                // 缺少编码转换会导致:从FTP服务器下载下来的文件是破损的,无法被打开
                boolean b = ftpClient.retrieveFile(new String(downloadFileName
                        .getBytes(clientCharset), serverCharset), out);
                out.flush();
            } catch (IOException e) {
                log.error("FtpUtils upload in error:{}", e);
                return false;
            } finally {
                try{
                    if(Objects.nonNull(out)){
                        out.close();
                    }
                }catch (Exception e){
                    log.error("FtpUtils upload in error:{}", e);
                }
                disconnect(ftpClient);
            }
        }
        return true;
    }

💜 4.4、执行结果

1、演示代码:

演示代码

2、上传文件到FTP服务器:

上传文件到FTP服务器

3、从FTP服务器下载文件到本地:

从FTP服务器下载文件到本地

💝 4.5、开发过程中遇到的坑

问题1、连接FTP服务器失败:

问题描述: 在配置文件中指定了账号和密码,但是却连接失败。

解决方案 经过排查,发现是在搭建FTP服务器的时候只开启了匿名验证,没有开启基本验证(账号和密码登录的方式),只需要到IIS管理器中开启【基本验证】即可。

解决步骤: 电脑 => 控制面板 => 管理工具 => IIS管理器 => 搭建好的FTP服务器 => FTP身份验证 => 开启基本身份验证模式。

在这里插入图片描述

问题2、FTP上传中文文件失败:

问题描述: 选择文件名为英文的文件上传正常,但是选择中文的文件名上传却失败,错误信息:550-The filename, directory name, or volume label syntax is incorrect. 。

解决方案 经过排查,发现 FTP协议里面,规定文件名编码为iso-8859-1(注意:这个现在是在Windows搭建的FTP服务器出现的情况,如果是Linux环境的话,还需要查看linux默认的支持编码而定,但是需要将上传的文件名编码这个步骤是确定的),所以目录名或文件名需要转码。 所以在上传文件代码处你会看到下面的对文件解码再编码的代码:

在这里插入图片描述

问题3、调用FTPClient的切换目录方法changeWorkingDirectory总是失败

原因和解决: FTP服务器搭建的时候需要我们制定共享的一个文件路径,当我们和FTP服务器建立连接后,默认就在这个目录下了,如果想切换到该目录下的子目录,不需要写全路径。

示例: 如果FTP服务器共享的文件夹路径为:D:/ftpserver,此时我们需要切换到ftpserver文件夹下的子文件demo中,正确的写法:fTPClient.changeWorkingDirectory("demo") 而不是 fTPClient.changeWorkingDirectory(“D:/ftpserver/demo”)

在这里插入图片描述

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值