【摸鱼高手】搭个自己的FTP服务器玩玩,java面试突击第一季课件

本文介绍如何在Windows系统下搭建FTP服务器,并通过程序实现文件上传和下载功能。涉及FTP服务器原理、搭建步骤、问题排查及编程实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

♊ 3.3、FTP服务器


了解了FTP协议,那FTP服务器就很容易理解了。FTP服务器就是支持FTP协议的服务器,我们平常可以在电脑上安装一个FTP工具就可实现与FTP服务器进行文件传输,FTP服务器常见分为:Windows FTP服务器和Linux FTP服务器。

我们自己的电脑也可以当做一个FTP服务器,如Windows系统就可以通过自带的ISS管理器来搭建一个FTP服务器(本文案例就是使用这个),Linux系统最常用的借助vsftp软件做FTP服务器搭建。

常见的例子: 在学校里上电脑课或者电脑考试时,老师会将上课题目或者考试题目放在某个文件夹中,让学生访问某个地址如:ftp://ip地址,通过这个地址每位同学看到老师共享的文件,下载的对应的试题完成考试。

上面例子上过电脑课的同学应该都经历过(多么美好的学生时代),学生们访问到

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

的其实就是老师搭建好的FTP服务器,老师提前将共享的文件上传到FTP服务器,学生们可以进行下载等操作。

啰啰嗦嗦了一大堆,下面开始进行FTP服务器搭建和上传下载功能开发吧!

♋ 3.4、FTP服务器搭建


安装环境: Win10

步骤一: 安装FTP服务器支持和IIS管理平台。

操作步骤: 电脑 => 控制面板 => 程序和功能 => 启用和关闭Windows功能 => Internet Infomation Services => 勾选【FTP服务器】和Web管理工具的【IIS管理控制台】=> 点击确定等待安装完成

步骤二: 打开IIS管理器

操作步骤: 电脑 => 控制面板 => 管理工具 => Internet Infomation Services(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服务器的搭建,可以手动将文件上传到服务器,让在同一网段的小伙伴自由从上面下载,但是,在实际业务开发中,我们需要的是通过程序实现上传和下载,而不是通过人为手动的方式,下面,就来看看如何实现吧。

💗 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项目

org.springframework.boot

spring-boot-starter-web

commons-net

commons-net

3.6

org.springframework.boot

spring-boot-starter

💚 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、演示代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值