最后
现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。
所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。
♋ 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文件的上传和下载
通过上面的步骤,我们完成了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服务器:
3、从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默认的支持编码而定,但是需要将上传的文件名编码这个步骤是确定的),所以目录名或文件名需要转码。
所以在上传文件代码处你会看到下面的对文件解码再编码的代码:
面试准备+复习分享:
为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦
6XorrA=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
面试准备+复习分享:
为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦
[外链图片转存中…(img-6Kh3nS14-1715483694706)]