FastDFS文件管理知识点+案例分析

一 介绍FastDFS 原理

        FastDFS开源分布式文件系统由C语言编写实现, 可以通过专有API访问,目前提供了C、Java和PHP API。

        FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

二 FastDFS 工作原理

FastDFS文件管理知识点+案例分析_第1张图片

通过原理图,我们可知道有以下组件构成:

1、 tracker server跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。记录storage server的状态,是连接Client和storage server的枢纽。

2、 storage server存储服务器(存储节点或数据服务器),文件和meta data都保存到该存储服务器上。

3、 group(volume)组,也可以称为卷,group是相对storage server而言的,即资源存放地,一个组可以有多个storage server,且数据相互备份。同组内服务器上的文件是完全相同的。

4、 meta data文件相关属性,以键值对方式存储。

5、 client:客户端,作为业务请求的发起方,通过专有接口(API),使用TCP/IP协议与跟踪服务器或存储服务器进行数据交互。

和tomcat相比,有哪些优点?

FastDFS相比于Tomcat :不存在单点故障问题、支持容灾。

FastDFS相比于Tomcat:集群 (安全) 保存图片过多时 扩容   分配合理   。

FastDFS相比于Tomcat: 具有备份功能、不怕磁盘损坏。

三 集成spring

3.1 编写工具类FastDFS.java,代码如下:

package com.utils;


import org.apache.commons.io.FilenameUtils;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.core.io.ClassPathResource;

/**
 * fastDFS文件上传工具类
 *
 */
public class FastDFSUtils {
	
	

	/**
	 * 
	 * @param pic     	byte数组类型文件
	 * @param fileName	文件名称
	 * @param size		文件大小
	 * @return
	 * @throws Exception
	 */
	public static String uploadFile(byte[] pic, String fileName, long size) throws Exception {
		//1. 设置管理节点ip和端口
		ClassPathResource resource = new ClassPathResource("fdfs_client.conf");
		ClientGlobal.init(resource.getClassLoader().getResource("fdfs_client.conf").getPath());
		//2. 创建和管理节点的对象
		TrackerClient trackerClient = new TrackerClient();
		//3. 获取管理节点连接
		TrackerServer connection = trackerClient.getConnection();
		//4. 创建存储节点, 第一个参数, 传入管理节点连接, 第二个参数为null, 无用的
		StorageClient1 storageClient = new StorageClient1(connection, null);
		//5. 获取上传文件的扩展名称
		String ext = FilenameUtils.getExtension(fileName);
		
		//6. 创建文件的属性对象
		NameValuePair[] meta_list = new NameValuePair[3];
		meta_list[0] = new NameValuePair("fileName", fileName);
		meta_list[1] = new NameValuePair("fileExt", ext);
		meta_list[2] = new NameValuePair("fileSize", String.valueOf(size));
		
		//7. 上传并返回图片地址
		String path = storageClient.upload_file1(pic, ext, meta_list);
		System.out.println("上传并返回图片地址为:"+path);
		return path;
	}
	/**
	 * 删除文件
	 * path:	group1/M00/00/38/DEwSsFoSQfWAFuXeAAMfubPUZ-U666.jpg
	 */
	public static void deleteFile(String path){
		try {
			//1. 设置管理节点ip和端口
			ClassPathResource resource = new ClassPathResource("fdfs_client.conf");
			ClientGlobal.init(resource.getClassLoader().getResource("fdfs_client.conf").getPath());
			//2. 创建和管理节点的对象
			TrackerClient trackerClient = new TrackerClient();
			//3. 获取管理节点连接
			TrackerServer connection = trackerClient.getConnection();
			//4. 创建存储节点, 第一个参数, 传入管理节点连接, 第二个参数为null, 无用的
			StorageClient1 storageClient = new StorageClient1(connection, null);
			int i = storageClient.delete_file1(path);
			System.out.println("删除图片的结果为:"+i);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

3.2 修改配置文件fdfs_client.conf,修改url以及端口号,找运维要

 

你可能感兴趣的:(java)