今天给大家分享的是分布式系统图片上传方案,如有不足,敬请指正。
我们都知道在我们开发中,经常要用到图片上传功能。那么在传统的上传方式中,我们是在项目的根目录下创建upload目录,将图片上传到服务器中。那么在分布式环境下,是有多个Tomcat存在的,当把图片直接上传到Tomcat服务器时,容易出现图片丢失的问题。
传统方式 |
---|
![]() |
那么怎么解决这个问题呢?我们会不会有这样的想法:直接将图片上传到一个指定的目录,访问、下载图片都访问这个目录就好了。如下图:
图示 |
---|
![]() |
由于项目最终是要部署到Linux环境,所以直接将图片上传到Linux服务器
这就需要使用vsftpd组件,实现文件传输
一、vsftpd简介
-
ftp(File Transfer Protocol)文件传输协议。(实现不同操作系统之间文件的传输)
-
vsftpd是一个基于ftp协议的文件传输服务器软件
-
使用方法
- 在Linux上安装vsftpd服务。
- 根据图片的地址访问图片。(最终保存到数据库的是图片的路径)
- web工程中实现图片上传
二、实现步骤
2.1 在Linux上部署vsftpd服务
2.1.1 安装vsftpd软件
- [root@node ~]# yum -y install vsftpd
2.1.2 关闭匿名访问
- 修改vsftpd配置文件 vim /etc/vsftpd/vsftpd.conf
图示 |
---|
![]() |
2.1.3 添加一个FTP用户
2.1.4 设置防火墙
- vsftpd服务默认端口号为21,修改防火墙,开放此端口,重启防火墙
2.1.5 修改selinux(Linux安全内核系统)
- 查看selinux,默认是禁用了ftp访问的
- 修改selinux,开放ftp访问权限
2.1.6 启动vsftpd服务
- [root@node vsftpd]# service vsftpd start
2.1.7 通过浏览器访问测试
- 访问地址:ftp://192.168.23.12:21,发现无法访问,原因是:被动模式下,数据传输服务被防火墙拦截了。
被动模式 |
---|
![]() |
主动模式 |
---|
![]() |
2.1.8 配置被动模式
- 编辑/etc/vsftpd/vsftpd.conf文件
- [root@node ~]# vim /etc/vsftpd/vsftpd.conf
- 添加防火墙范围设置(在文件尾部添加即可)
- pasv_min_port=30000
- pasv_max_port=30999
- 修改防火墙,开启30000:30999之间所有的端口。
- 重启防火墙。
- 重启vsftpd服务
图示 |
---|
![]() |
再次访问浏览器,发现可以正常连接了
2.1.9 java代码测试上传功能
前提:在maven中添加ftp服务的依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
</dependency>
package com.xkt.base.test;
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
/**
* 测试文件上传
*
* @author lzx
*
*/
public class TestFtp {
public static void main(String[] args) {
try {
// 1.创建ftp客户端
FTPClient client = new FTPClient();
// 2.连接服务器
client.connect("192.168.109.3", 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("F:/图片/3.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();
}
}
}
那么问题来了,在访问浏览器过程中大家是否发现图片加载时间稍微有点长呢?而且这还只是一张图片,那么在我们实际开发中遇到的类似某宝,某猫,某东这种大型网站每个页面需要加载的图片更多,而且对并发量的要求也很高又该怎么解决呢?这就需要用到Tengine了,关于它的介绍我们将在后面的文章中给出。
版权说明:欢迎以任何方式进行转载,但请在转载后注明出处!