1. 程式人生 > >FastDFS實現檔案上傳下載實戰

FastDFS實現檔案上傳下載實戰

       正好,淘淘商城講這一塊的時候,我又想起來當時老徐讓我寫過一個關於實現FastDFS實現檔案上傳下載的使用文件,當時結合我們的ITOO的視訊系統和畢業論文系統,整理了一下,有根據網上查到的知識,總結了一點東西,下面分享一下

一、FastDFS簡介:

        參見部落格:http://blog.csdn.net/liweizhong193516/article/details/53234486

二、FastDFS使用流程介紹:

       我們在itoo的dobbu+zk框架中使用fastdfs+nginx+mysql實現上傳附件的功能,主要原理就是將附件上傳到fastdfs得到一個檔案的連結路徑url,我們獲取到這個url將他以字串形式儲存到我們的mysql中,下載的時候獲取到這個url直接開啟或者下載附件。(url內容參見部落格:http://blog.csdn.net/liweizhong193516/article/details/52556526)

       

        預設的,我們就知道fastdfs後面還有一個nginx伺服器,當我們進行儲存檔案的時候,我們要通過fastdfs給我們生成一個儲存地址,也就是grounpID 和儲存地址,然後將檔案存在fastdfs伺服器中,fastdfs中有許多的16進制命名資料夾,資料夾中套資料夾;當我們進行讀取檔案的時候,我們要通過獲取mysql裡面的相應檔案的儲存地址去nginx伺服器中通過url路徑檔名,從fastdfs檔案中取出我們的檔案進行展示。(所以下載圖,有點問題,在這裡解釋一下)

三、實現流程:

1、配置依賴:因為我們使用的maven來管理工程,所以,我們需要去陪pom檔案

<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>   
	<groupId>com.leech</groupId>  
	<artifactId>fastdfs-demo</artifactId>  
	<version>0.0.1-SNAPSHOT</version>  
	<packaging>jar</packaging>   
	<name>fastdfs-demo</name>  
	<url>http://maven.apache.org</url>   
	<properties>    
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
	</properties>   
	
	<dependencies>    
		<dependency>      
			<groupId>junit</groupId>      
			<artifactId>junit</artifactId>      
			<version>4.11</version>      
			<scope>test</scope>    
		</dependency>         
		<dependency>      
			<groupId>org.csource</groupId>      
			<artifactId>fastdfs-client-java</artifactId>      
			<version>1.25</version>    
		</dependency>         
		<dependency>        
			<groupId>commons-io</groupId>        
			<artifactId>commons-io</artifactId>        
			<version>2.4</version>    
			</dependency>       
		</dependencies>
	</project>
當然,更多時候我們利用maven的繼承特性,直接配置在父工程中,然後繼承下來就o了。

2、新建fdfs_client.conf檔案,在我們的itoo中,我們建立在(src/main/resources底下)

connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 80 
#沒什麼用
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 192.168.17.112:22122 
#tracker_server = 192.168.0.119:22122

3、實現檔案上傳:

       public void save(HttpServletRequest request,HttpServletResponse response){		
		String videoName=request.getParameter("videoName");
		String videoType=request.getParameter("videoType");
		String videoDesc=request.getParameter("videoDesc");
		String videoPath=request.getParameter("videoPath");
		String picturePath=request.getParameter("picturePath");

		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date uploadTime=null;
		try {
			uploadTime = formatter.parse(formatter.format(new Date()));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil ();
		
		String dataBaseName = "itoo_video";
	
		Video video=new Video();
		video.setUserName("why");
		video.setUserID("why");		
		video.setVideoName(videoName);
		video.setVideoPath(videoPath);
		video.setVideoType(videoType);
		video.setVideoDesc(videoDesc);	
		video.setDataBaseName(dataBaseName);
		video.setPicturePath(picturePath);
		video.setUploadTime(uploadTime);
		
		uploadFileService.save(video);		
		
        jackJsonUtil.beanToJson(response,video);
		
	}
	
	/*
	 * 上傳檔案
	 */
	@RequestMapping(value={"/upload"})
	@ResponseBody
	public void upload( MultipartFile file, HttpServletRequest request,HttpServletResponse response){		
		
		String ext_Name = file.getOriginalFilename().split("\\.")[1];
		String videoName=file.getOriginalFilename().split("\\.")[0];
		
        byte[] bytes = null;
		try {
			bytes = file.getBytes();
		} catch (IOException e) {
			e.printStackTrace();
		}
		String videoPath=uploadFile(bytes,ext_Name);
		
		JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil ();
		
		Video video=new Video();
		video.setVideoPath(videoPath);
		video.setVideoName(videoName);		
		
		jackJsonUtil.beanToJson(response,video);
	} 
	
	public String uploadFile(byte[] byteFile, String ext_file) {
		// 拼接服務區的檔案路徑
		StringBuffer sbPath = new StringBuffer();
		sbPath.append("http://192.168.22.252");
		try {
			// 初始化檔案資源
			ClientGlobal
					.init("C:\\Users\\alsr\\Desktop\\ITOO-5.0\\itoo-video-Test\\dmsd-itoo-video-parent\\dmsd-itoo-video-web\\src\\main\\resources\\fdfs_client.conf");

			// 連結FastDFS伺服器,建立tracker和Stroage
			TrackerClient trackerClient = new TrackerClient();
			TrackerServer trackerServer = trackerClient.getConnection();
			StorageServer storageServer = null;
			StorageClient storageClient = new StorageClient(trackerServer,
					storageServer);
			//利用位元組流上傳檔案
			String[] strings = storageClient.upload_file(byteFile, ext_file, null);

			for (String string : strings) {
				sbPath.append("/" + string);
				System.out.println(string);
			}
			// 全路徑
			System.out.println(sbPath);
		} catch (IOException | MyException e) {
			e.printStackTrace();
		}
		return sbPath.toString();
	}
       只要我們能正常接收到一個json型別的字串(url地址),就證明我們已經上傳成功了,如果不信,可以直接用瀏覽器去驗證一下,看看能不能得到檔案展示。

4、FastDFS實現檔案下載:

public void testDownload() {        
		try {             
			ClientGlobal.init(conf_filename);             
			TrackerClient tracker = new TrackerClient();             
			TrackerServer trackerServer = tracker.getConnection();            
			StorageServer storageServer = null;             
			StorageClient storageClient = new StorageClient(trackerServer, storageServer);             
			byte[] b = storageClient.download_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");             
			System.out.println(b);             
			IOUtils.write(b, new FileOutputStream("D:/"+UUID.randomUUID().toString()+".conf"));        
			} 
		catch (Exception e) {             
			e.printStackTrace();         
		}     
	}       

5、FastDFS獲取將上傳檔案資訊:

public void testGetFileInfo(){         
		try {             
			ClientGlobal.init(conf_filename);             
			TrackerClient tracker = new TrackerClient();             
			TrackerServer trackerServer = tracker.getConnection();             
			StorageServer storageServer = null;             
			StorageClient storageClient = new StorageClient(trackerServer, storageServer);             
			FileInfo fi = storageClient.get_file_info("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");             
			System.out.println(fi.getSourceIpAddr());             System.out.println(fi.getFileSize());             
			System.out.println(fi.getCreateTimestamp());             System.out.println(fi.getCrc32());         
			} 	
		catch (Exception e) {             
			e.printStackTrace();         
			}     
		}       

6、FastDFS獲取檔名稱:

	public void testGetFileMate(){         
			try {            
				ClientGlobal.init(conf_filename);             
				TrackerClient tracker = new TrackerClient();             
				TrackerServer trackerServer = tracker.getConnection();             
				StorageServer storageServer = null;             
				StorageClient storageClient = new StorageClient(trackerServer,                     
				storageServer);             
				NameValuePair nvps [] = storageClient.get_metadata("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");             
				for(NameValuePair nvp : nvps){                 
					System.out.println(nvp.getName() + ":" + nvp.getValue());            
					}         
				} 
			catch (Exception e) {             
				e.printStackTrace();         
				}     
		}    

7、FastDFS實現刪除檔案:

             public void testDelete(){         
			try {             
				ClientGlobal.init(conf_filename);             
				TrackerClient tracker = new TrackerClient();             
				TrackerServer trackerServer = tracker.getConnection();             
				StorageServer storageServer = null;             
				StorageClient storageClient = new StorageClient(trackerServer,storageServer);             
				int i = storageClient.delete_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");             
				System.out.println( i==0 ? "刪除成功" : "刪除失敗:"+i);         
				} 
			catch (Exception e) {             
				e.printStackTrace();         
				}     
             }




相關推薦

FastDFS實現檔案下載實戰

       正好,淘淘商城講這一塊的時候,我又想起來當時老徐讓我寫過一個關於實現FastDFS實現檔案上傳下載的使用文件,當時結合我們的ITOO的視訊系統和畢業論文系統,整理了一下,有根據網上查到的知識,總結了一點東西,下面分享一下 一、FastDFS簡介:    

Java Springboot結合FastDFS實現檔案以及根據圖片url將圖片至圖片伺服器

上一篇文章我們已經講解了如何搭建FastDFS圖片伺服器,環境我們準備好了現在就讓我們開始與Java結合將他應用到實際的專案中吧。本篇文章我們將會展示上傳圖片到FastDFS圖片伺服器以及通過外網的圖片url將圖片上傳至我們自己的圖片伺服器中。 1.建立springbo

Struts2 實現檔案下載

檔案上傳對Struts2來說是一件非常容易的事情。Struts2檔案上傳依賴如下jar包 commons-fileupload-x.x.x.jar commons-io-x.x.x.jar 檔案上傳大致步驟: 編寫頁面 配置struts.xml 攔截器會自動接收上傳的檔

JspSmartUpload 實現檔案下載及Mysql實現分頁

一、寫在前面 這篇文章主要是分享使用JspSamrtUpload實現多檔案的上傳下載功能,及使用Mysql資料庫的 limit 函式實現檔案顯示列表的分頁顯示功能。 二、需要的jar包 下載後把它複製到web的lib目錄下即可。 三、關鍵程式碼 3.1 多檔案上傳前

MAC實用SSH連線遠端伺服器,並實現檔案下載

MAC作為程式設計師的神器,在程式設計上的使用遠超window的電腦,而MAC本身提供了SSH功能,配合VIM編輯器對程式設計十分有幫助。 使用ssh連線遠端主機   sudo -i 切換root許可權 ssh [email protected] 其中,

React中使用fetch實現檔案下載

在最近的專案中需要實現檔案上傳下載功能,在以前spring、jsp的專案中實現檔案上傳很簡單,但現在前後端分離,前端使用React,後端使用Spring Boot,實現就沒那麼方便了。 前端React使用fetch而非傳統的XMLHttpRequest從後端獲取

Java中實現檔案下載的三種解決方案

第一點:Java程式碼實現檔案上傳   FormFile file=manform.getFile();    String newfileName = null;   String newpathname=null;   String fileAddre="/numU

SpringMVC——實現檔案下載

一、檔案上傳 1.引入依賴包 在pom.xml檔案中新增如下內容,引入 commons-fileupload 和 commons-io 兩個包。 <dependency> <groupId>commons-f

Flask 實現檔案下載功能

檔案下載的兩種方法, 一是構建檔案url,二是使用flask.send_from_directory(directory, filename, **options),介紹第一種方法,是我寫著寫著就發現的,第二種方法就查api吧,不介紹了。 檔案下載一般都是先有一

Jsp+Servlet實現檔案下載——前臺頁面開發

       JSP和Servlet都是J2EE的規範,JSP全名為Java Server Pages,中文名叫java伺服器頁面,它是在傳統的網頁HTML檔案中插入Java程式段(Scriptlet

spring boot實現檔案下載以及多檔案

首先是很簡單的介面,在resource/static下建立檔案file.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymel

完整實現檔案下載以及輸出下載列表

首先匯入jar包: commons-fileupload-1.2.1.jar 【檔案上傳元件核心jar包】 commons-io-1.4.jar 【封裝了對檔案處理的相關工具類】 jsp程式碼: 功能選擇: &

java實現檔案下載的三種方法

JSP+Servlet 一、檔案上傳下載原理 在TCP/IP中,最早出現的檔案上傳機制是FTP。它是將檔案由客戶端傳送到伺服器的標準機制。但是在jsp程式設計中不能使用FTP方法來上傳檔案,這是由jsp的執行機制所決定的。 通過為表單元素設定Method=“post” en

JSP web 實現檔案下載程式碼

jsp程式碼 實現檔案上傳下載 package util; import java.io.FileInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServle

SSM實現檔案下載總結

需要在SSM環境框架搭建成功的基礎上實現。 主要參考文件: ssm檔案上傳/下載,有詳細的功能描述 http://blog.csdn.net/wjycgl/article/details/55509480 http://blog.csdn.net/nimiky/arti

java實現檔案下載至ftp伺服器

以前做的一個專案,用到了檔案上傳下載至ftp伺服器,現在對其進行一下複習,比較簡單,一下就能看明白。 環境:首先,先安裝ftp伺服器,我是在win8本地用IIS配置的, 百度一下就可以找到安裝文件。 1.在你的專案目錄下建立ftp配置檔案,目錄如下圖

jspSmartUpload 實現檔案下載

一、安裝篇   jspSmartUpload是由www.jspsmart.com網站開發的一個可免費使用的全功能的檔案上傳下載元件,適於嵌入執行上傳下載操作的JSP檔案中。該元件有以下幾個特點: 1、使用簡單。在JSP檔案中僅僅書寫三五行JAVA程式碼就可以搞定檔案的上傳或下載,方便。 2、能全程控制上傳。利

java web 一行程式碼實現檔案下載

       每當要實現檔案上傳下載的功能時,都要複製貼上拼湊程式碼。如果用了不同的框架,程式碼還不一樣,配置啥的一堆,甚是繁瑣,不喜歡。科學家們喜歡把紛繁複雜的自然現象總結為一個個簡潔的公式,我們也來試試,把上傳下載整成一行程式碼~        花了一天時間,整了個通用

iOS開發之結合asp.net webservice實現檔案下載

iOS開發中會經常用到檔案上傳下載的功能,這篇檔案將介紹一下使用asp.net webservice實現檔案上傳下載。 首先,讓我們看下檔案下載。 這裡我們下載cnblogs上的一個zip檔案。使用NSURLRequest+NSURLConnection可以很方便的實現這個功能。 同步下載檔案:

Java 使用 SFTP 實現檔案下載(二)

package com.lijy.util; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraf