分佈式系統圖片上傳方案 (一)


  今天給你們分享的是分佈式系統圖片上傳方案,若有不足,敬請指正。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了,關於它的介紹咱們將在後面的文章中給出。服務器

版權說明:歡迎以任何方式進行轉載,但請在轉載後註明出處!

相關文章
相關標籤/搜索