分布式系统图片上传方案 (一)


  今天给你们分享的是分布式系统图片上传方案,若有不足,敬请指正。java

  咱们都知道在咱们开发中,常常要用到图片上传功能。那么在传统的上传方式中,咱们是在项目的根目录下建立upload目录,将图片上传到服务器中。那么在分布式环境下,是有多个Tomcat存在的,当把图片直接上传到Tomcat服务器时,容易出现图片丢失的问题。node

传统方式
  那么怎么解决这个问题呢?咱们会不会有这样的想法:直接将图片上传到一个指定的目录,访问、下载图片都访问这个目录就行了。以下图:
图示

  因为项目最终是要部署到Linux环境,因此直接将图片上传到Linux服务器linux

  这就须要使用vsftpd组件,实现文件传输web


1、vsftpd简介

  1. ftp(File Transfer Protocol)文件传输协议。(实现不一样操做系统之间文件的传输)数据库

  2. vsftpd是一个基于ftp协议的文件传输服务器软件apache

  3. 使用方法vim

  • 在Linux上安装vsftpd服务。
  • 根据图片的地址访问图片。(最终保存到数据库的是图片的路径)
  • web工程中实现图片上传

2、实现步骤

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用户

  • [root@node ~]# useradd ftpuser
  • [root@node ~]# passwd ftpuser

2.1.4 设置防火墙

  • vsftpd服务默认端口号为21,修改防火墙,开放此端口,重启防火墙

2.1.5 修改selinux(Linux安全内核系统)

  • 查看selinux,默认是禁用了ftp访问的
  • 修改selinux,开放ftp访问权限
  1. [root@node ~]# setsebool -P allow_ftpd_full_access on
  2. [root@node ~]# setsebool -P ftp_home_dir on

2.1.6 启动vsftpd服务

  • [root@node vsftpd]# service vsftpd start

2.1.7 经过浏览器访问测试

  • 访问地址:ftp://192.168.23.12:21 ,发现没法访问,缘由是:被动模式下,数据传输服务被防火墙拦截了。
被动模式
主动模式

2.1.8 配置被动模式

  1. 编辑/etc/vsftpd/vsftpd.conf文件
  • [root@node ~]# vim /etc/vsftpd/vsftpd.conf
  1. 添加防火墙范围设置(在文件尾部添加便可)
  • pasv_min_port=30000
  • pasv_max_port=30999
  1. 修改防火墙,开启30000:30999之间全部的端口。
  2. 重启防火墙。
  3. 重启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了,关于它的介绍咱们将在后面的文章中给出。服务器

版权说明:欢迎以任何方式进行转载,但请在转载后注明出处!

相关文章
相关标签/搜索