springboot+nginx+vsftp实现本地文件服务器

概要

vsftp搭建本地文件服务器,并实现上传、下载等功能。

整体架构流程

springboot + nginx + vsftp

  1. 安装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
  1. 安装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;
        }
}
  1. 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;
	}
}
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值