概要
vsftp搭建本地文件服务器,并实现上传、下载等功能。
整体架构流程
springboot + nginx + vsftp
- 安装vsftp
//查看当前服务器中是否安装vsftp
rpm -qa | grep vsftpd
//可以查到证明已安装vsftp跳过下一步,否则安装
yum install vsftpd -y
//安装后查看当前服务状态,服务还未运行
systemctl status vsftpd
//下面是命令执行完之后的输出,dead 表示当前服务并未启动
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
//修改配置 使用vsftp最少需要两个端口。默认为21和20端口,21用作连接控制端口,20用作数据传输端口
vi /etc/vsftpd/vsftpd.conf
//需修改如下配置
//关闭匿名访问
anonymous_enable=NO
//用户配置
chroot_local_user=YES
chroot_list_enable=YES
userlist_enable=YES
//最底下新增如下配置 快捷键 shift+g可直接定位到最底下
//vsftp 有两种模式,主动和被动模式,因主动模式存在安全隐患,故使用被动模式。
//开启被动模式,不加也行,默认被动模式
pasv_enable=YES
//被动模式端口取值最小数 范围:1024-63353
pasv_min_port=8020
//被动模式端口取值最大数 范围:pasv_min_port-63353
pasv_max_port=8020
//登录控制所占用端口
listen_port=8021
//仅限访问自身所属目录
allow_writeable_chroot=YES
//因vsftp默认20,21端口不安全,故使用自定义开放端口如上述8021及8020
//修改21端口后需在服务中将21所对应端口改为所配置的端口
vi /etc/services
//如下图将21端口修改为所配置的8021
//添加用户
useradd ftpuser
//添加密码
passwd ftpuser
//登录后默认路径 /home/ftpuser
//如图,需在chroot_list 和 user_list 添加允许登录的用户,一个用户命名占一行。
//user_list 允许登录用户 chroot_list 允许可操作外目录的用户,false所有用户只能在根目录下操作。
//切换根目录
vim/etc/passwd
//修改权限
chown ftpuser /home/ftpuser
chmod 777 -R /home/ftpuser
//添加完毕后 启动vsftp
systemctl start vsftpd
//查看运行状态 看见小点点为绿色,且有running关键字表名服务正式运行起来了
systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2022-07-19 18:04:40 CST; 3h 36min ago
Process: 29983 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 29984 (vsftpd)
CGroup: /system.slice/vsftpd.service
└─29984 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
Jul 19 18:04:40 VM-0-46-centos systemd[1]: Starting Vsftpd ftp daemon...
Jul 19 18:04:40 VM-0-46-centos systemd[1]: Started Vsftpd ftp daemon.
//访问命令 ftp + ip 如下
[root@VM-0-46-centos vsftpd]# ftp ip:port
Connected to ip:port (ip:port).
220 (vsFTPd 3.0.2)
Name (ip:root): ftpuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
//启动后修改配置后重启命令
service vsftpd restart
//设置开机自启动
chkconfig vsftpd on
- 安装nginx负载文件服务
//有nginx或者单服务部署无需nginx做负载可直接忽略
//安装四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
//创建文件夹
cd /usr/local
mkdir nginx
cd nginx
//下载jar包
wget http://nginx.org/download/nginx-1.13.7.tar.gz
//解压
tar -xvf nginx-1.13.7.tar.gz
//进入nginx目录
cd /usr/local/nginx
//进入目录
cd nginx-1.13.7
//执行命令 考虑到后续安装ssl证书 添加两个模块
./configure --with-http_stub_status_module --with-http_ssl_module
//执行make命令
make
//执行make install命令
make install
//启动nginx
cd /usr/local/nginx/sbin/
./nginx
//防火墙开启的情况下开启80端口 nginx监听端口配置哪个开启哪个,默认80
firewall-cmd --zone=public --add-port=80/tcp --permanent
//访问ip即可出现nginx页面
//nginx + vsftp 搭建文件服务
//修改用户权限
chown ftpuser /home/ftpuser
chmod 777 -R /home/ftpuser
//新建目录保存图片
cd /home/ftpuser/
mkdir kyee
cd kyee
mkdir images
cd images
pwd
/home/ftpuser/kyee/images
//修改nginx配置 路径 nginx/conf/nginx.conf
//在server中添加location root后面是刚创建的绝对路径
location /images {
root /home/ftpuser/www/;
autoindex on;
}
//重启nginx
./nginx -s reload
//浏览器输入 http://服务器地址/images , 就可以看到上传目录下的文件列表pringboot集成文件服务
//nginx 负载均衡
//在http中添加upstream,配置服务器列表,myservers是列表名称,内部每个server后面是服务器的IP和端口
upstream pubilcHealth{
server ip:port1;
server ip:port2;
}
//添加server,配置代理将请求发送给myservers处理
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://pubilcHealth;
}
}
- springboot集成实现上传下载等
3.1 添加jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
3.2添加配置文件
FTP:
address: ip:port
port: 8021
username: ftpuser
password: 123456
basepath: /home/ftpuser/www/image
imagebase: http://ip:port/image
3.3工具类
//上传工具类
public class FtpUtil {
/**
* Description: 向FTP服务器上传文件
* @param host FTP服务器ip
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录,/home/ftpuser/images
* @param filePath FTP服务器文件存放路径。例如分日期存放:/2018/05/28。文件的路径为basePath+filePath
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(String host, int port, String username, String password, String basePath,
String filePath, String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
//切换到上传目录
if (!ftp.changeWorkingDirectory(basePath+filePath)) {
//如果目录不存在创建目录,不能多层级创建,只能一层一层创建
String[] dirs = filePath.split("/");
String tempPath = basePath;
for (String dir : dirs) {
if (null == dir || "".equals(dir)) continue;
tempPath += "/" + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {
if (!ftp.makeDirectory(tempPath)) {
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
//设置为被动模式
ftp.enterLocalPassiveMode();
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//上传文件
if (!ftp.storeFile(filename, input)) {
return result;
}
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
}
//时间工具类
public class IDUtils {
/**
* 生成随机图片名
*/
public static String genImageName() {
//取当前时间的长整形值包含毫秒
long millis = System.currentTimeMillis();
//long millis = System.nanoTime();
//加上三位随机数
Random random = new Random();
int end3 = random.nextInt(999);
//如果不足三位前面补0
String str = millis + String.format("%03d", end3);
return str;
}
}