第一部分:在Linux上部署vsftpd服务
1. vsftpd简介
1.1 vsftpd是什么?
ftp(File Transfer Protocol)文件传输协议。(实现不同操作系统之间文件的传输),vsftpd是一个基于ftp协议的文件传输服务器软件
1.2 vsftpd作用是什么?
传输文件(跨平台、跨操作系统)
传统上传方式的问题
在传统上传方式中,在项目的跟目录下创建upload目录,将图片上传到tomcat服务器中
但是在分布式环境下,是有多个Tomcat存在的,当把图片直接上传到Tomcat服务器时,容易出现图片丢失的问题。
使用分布式系统图片上传方案
直接将图片上传到一个指定的目录,访问、下载图片都访问这个目录。由于项目最终是要部署到Linux环境,所以直接将图片上传到Linux服务器。
问题:那如何将图片上传到Linux呢?答:使用vsftpd组件,实现文件传输。
1.3 如何使用
- 服务端:在linux安装vsftpd软件,开启服务。
- 客户端:通过FtpClient客户端建立和服务器的连接,向服务器发送请求。
2 实现步骤说明
(1)在Linux上安装vsftpd服务。
(2)根据图片的地址访问图片。(最终保存到数据库的是图片的路径)
(3)web工程中实现图片上传。
2.1 第一部分:在Linux上部署vsftpd服务
思路 :(1)安装软件
(2)测试服务是否可用
2.1.1 第一步:安装vsftpd软件
2.1.2 第二步:关闭匿名访问
修改vsftpd配置文件
2.1.3 第三步:添加一个FTP用户
创建一个y9onghu,专门用来访问vsftpd服务
2.1.4 第四步:设置防火墙
vsftpd服务默认端口号为21,修改防火墙,开放此端口,重启防火墙。
[root@CentOS2 ~]# vim /etc/sysconfig/iptables
2.1.5 第五步:修改selinux(Linux安全内核系统)
1.先查看selinux,默认是禁用了ftp访问的
2.修改selinux,开发ftp访问权限
2.1.6 第六步:启动vsftpd服务
2.1.7 第七步:通过浏览器访问测试
访问地址:ftp://192.XXX.XXX.24:21,发现无法访问
原因:被动模式下,数据传输服务被防火墙拦截了
(1)被动模式
第二次请求过程中,客户端跟服务端建立数据通道;
服务端被动将数据响应给客户端。
第二次请求数据传输,会随机生成一个服务端口。被防火墙禁用。
(2)主动模式
服务端主动向客户端发送数据,会被客户端的防火墙禁掉。
多数客户端不支持主动模式,不安全。
2.1.8 第八步:配置被动模式
2.添加防火墙范围设置(在文件尾部添加即可)
3.修改防火墙,开启30000:30999之间所有的端口。
[root@CentOS2 ~]# vim /etc/sysconfig/iptables
4.重启防火墙。
5.重启vsftpd服务
6.再次访问浏览器,发现可以正常连接了。
2.19 第九步:java代码测试上传功能
Java代码中,是通过FtpClient客户端建立和服务端的连接的。在ego-base工程中测试。
1.在ego-base中添加ftp服务的依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>cn.gzsxt.ego.1115</groupId> <artifactId>ego-project</artifactId> <version>1.0</version> </parent> <artifactId>ego-base</artifactId> <dependencies> <!-- Mybatis --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> </dependency> </dependencies> </project>
2.创建测试类
说明:使用ftpuser用户上传,指定上从目录/home/ftpuser/ego/images
注意:为了保证ftpuser有这个目录下的写权限,我们要用ftpuser用户创建这个目录。
su命令:切换用户
测试类TestFtp
package cn.gz.base.test; import java.io.File; import java.io.FileInputStream; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; public class TestFtp { public static void main(String[] args) { try { //1.创建ftp客户端 FTPClient client = new FTPClient(); //2.连接服务端 client.connect("192.168.232.24",21); //3.登录,认证身份 boolean flag = client.login("ftpuser", "ftpuser"); if(flag){ /** * 4.指定图片上传的目录,默认路径在ftpuser用户的家目录下 * 确保ftpuser用户有这个目录下的写权限 * 在linux上,使用ftpuser这个用户,去创建这个目录 */ client.changeWorkingDirectory("/home/ftpuser/ego/images"); //5.指定上传为被动上传 因为,很多的客户端禁止主动模式 client.enterLocalPassiveMode(); //6.指定上传方式为二进制,即使用字节流 client.setFileType(FTP.BINARY_FILE_TYPE); //7.上传 File pic = new File("D:/img/123.jpg"); boolean result = client.storeFile(System.currentTimeMillis()+".jpg", new FileInputStream(pic)); if(result){ System.out.println("上传成功!"); }else{ System.out.println("上传失败!!!"); } } client.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }