fastdfs使用实战(Java实例篇)

标签: fastdfs java 实例 | 发表时间:2014-09-29 18:11 | 作者:love398146779
出处:http://www.iteye.com
一、创建一个maven的webproject,叫file-manager:mvnarchetype:create-DgroupId=platform.activity.filemanager-DartifactId=file-manager-DarchetypeArtifactId=maven-archetype-webapp
二、定义一个fastDFS的客户端文件fdfs_client.conf:
二、定义一个fastDFS的客户端文件fdfs_client.conf:
class="properties" name="code">connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = FastDFS1234567890

tracker_server = 192.168.1.156:22122
#tracker_server = 192.168.1.188:22122

#storage_server = 192.168.1.155:23000 #no need here

三、定义一个配置接口:
/**
 * 
 */
package com.chuanliu.platform.activity.fm.manager;

import java.io.Serializable;

/**
 * @author Josh Wang(Sheng)
 *
 * @email  [email protected]
 */
public interface FileManagerConfig extends Serializable {

	public static final String FILE_DEFAULT_WIDTH 	= "120";
	public static final String FILE_DEFAULT_HEIGHT 	= "120";
	public static final String FILE_DEFAULT_AUTHOR 	= "Diandi";
	
	public static final String PROTOCOL = "http://";
	public static final String SEPARATOR = "/";
	
	public static final String TRACKER_NGNIX_PORT 	= "8080";
	
	public static final String CLIENT_CONFIG_FILE   = "fdfs_client.conf";
	
	
}




四、封装一个FastDFS文件Bean
/**
 * 
 */
package com.chuanliu.platform.activity.fm.manager;


/**
 * @author Josh Wang(Sheng)
 *
 * @email  [email protected]
 */
public class FastDFSFile implements FileManagerConfig {

	private static final long serialVersionUID = -996760121932438618L;

	private String name;
	
	private byte[] content;
	
	private String ext;
	
	private String height = FILE_DEFAULT_HEIGHT;
	
	private String width = FILE_DEFAULT_WIDTH;
	
	private String author = FILE_DEFAULT_AUTHOR;
	
	public FastDFSFile(String name, byte[] content, String ext, String height,
			String width, String author) {
		super();
		this.name = name;
		this.content = content;
		this.ext = ext;
		this.height = height;
		this.width = width;
		this.author = author;
	}
	
	public FastDFSFile(String name, byte[] content, String ext) {
		super();
		this.name = name;
		this.content = content;
		this.ext = ext;
	}

	public byte[] getContent() {
		return content;
	}

	public void setContent(byte[] content) {
		this.content = content;
	}

	public String getExt() {
		return ext;
	}

	public void setExt(String ext) {
		this.ext = ext;
	}

	public String getHeight() {
		return height;
	}

	public void setHeight(String height) {
		this.height = height;
	}

	public String getWidth() {
		return width;
	}

	public void setWidth(String width) {
		this.width = width;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}



五、定义核心的FileManager类,里面包含有上传、删除、获取文件的方法:
/**
 * 
 */
package com.chuanliu.platform.activity.fm.manager;

import java.io.File;
import java.io.IOException;

import org.apache.log4j.Logger;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.FileInfo;
import org.csource.fastdfs.ServerInfo;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;

import com.chuanliu.platform.activity.basic.util.LoggerUtils;

/**
 * File Manager used to provide the services to upload / download / delete the files
 * from FastDFS.
 * 
 * <note>In this version, FileManager only support single tracker, will enhance this later...</note>
 * 
 * @author Josh Wang(Sheng)
 *
 * @email  [email protected]
 */
public class FileManager implements FileManagerConfig {
	
	private static final long serialVersionUID = 1L;

	private static Logger logger  = Logger.getLogger(FileManager.class);
	
	private static TrackerClient  trackerClient;
	private static TrackerServer  trackerServer;
	private static StorageServer  storageServer;
	private static StorageClient  storageClient;

	static { // Initialize Fast DFS Client configurations
		
		try {
			String classPath = new File(FileManager.class.getResource("/").getFile()).getCanonicalPath();
			
			String fdfsClientConfigFilePath = classPath + File.separator + CLIENT_CONFIG_FILE;
			
			logger.info("Fast DFS configuration file path:" + fdfsClientConfigFilePath);
			ClientGlobal.init(fdfsClientConfigFilePath);
			
			trackerClient = new TrackerClient();
			trackerServer = trackerClient.getConnection();
			
			storageClient = new StorageClient(trackerServer, storageServer);
			
		} catch (Exception e) {
			LoggerUtils.error(logger,  e);
			
		}
	}
	
	
	
	public static String upload(FastDFSFile file) {
		LoggerUtils.info(logger, "File Name: " + file.getName() + "		File Length: " + file.getContent().length);
		
		NameValuePair[] meta_list = new NameValuePair[3];
	    meta_list[0] = new NameValuePair("width", "120");
	    meta_list[1] = new NameValuePair("heigth", "120");
	    meta_list[2] = new NameValuePair("author", "Diandi");
		
	    long startTime = System.currentTimeMillis();
		String[] uploadResults = null;
		try {
			uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);
		} catch (IOException e) {
			logger.error("IO Exception when uploadind the file: " + file.getName(), e);
		} catch (Exception e) {
			logger.error("Non IO Exception when uploadind the file: " + file.getName(), e);
		}
		logger.info("upload_file time used: " + (System.currentTimeMillis() - startTime) + " ms");
		
		if (uploadResults == null) {
			LoggerUtils.error(logger, "upload file fail, error code: " + storageClient.getErrorCode());
		}
		
		String groupName 		= uploadResults[0];
		String remoteFileName   = uploadResults[1];
		
		String fileAbsolutePath = PROTOCOL + trackerServer.getInetSocketAddress().getHostName() 
				+ SEPARATOR
				+ TRACKER_NGNIX_PORT
				+ SEPARATOR 
				+ groupName 
				+ SEPARATOR 
				+ remoteFileName;
		
		
		LoggerUtils.info(logger, "upload file successfully!!!  " +"group_name: " + groupName + ", remoteFileName:"
				+ " " + remoteFileName);
		
		return fileAbsolutePath;
		
	}
	
	public static FileInfo getFile(String groupName, String remoteFileName) {
		try {
			return storageClient.get_file_info(groupName, remoteFileName);
		} catch (IOException e) {
			logger.error("IO Exception: Get File from Fast DFS failed", e);
		} catch (Exception e) {
			logger.error("Non IO Exception: Get File from Fast DFS failed", e);
		}
		return null;
	}
	
	public static void deleteFile(String groupName, String remoteFileName) throws Exception {
		storageClient.delete_file(groupName, remoteFileName);
	}
	
	public static StorageServer[] getStoreStorages(String groupName) throws IOException {
		return trackerClient.getStoreStorages(trackerServer, groupName);
	}
	
	public static ServerInfo[] getFetchStorages(String groupName, String remoteFileName) throws IOException {
		return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);
	}
}




六、Unit Test测试类
package manager;
/**
 * 
 */


import java.io.File;
import java.io.FileInputStream;

import org.csource.fastdfs.FileInfo;
import org.csource.fastdfs.ServerInfo;
import org.csource.fastdfs.StorageServer;
import org.junit.Test;
import org.springframework.util.Assert;

import com.chuanliu.platform.activity.fm.manager.FastDFSFile;
import com.chuanliu.platform.activity.fm.manager.FileManager;

/**
 * @author Josh Wang(Sheng)
 *
 * @email  [email protected]
 */
public class TestFileManager {

	@Test
	public void upload() throws Exception {
		File content = new File("C:\\520.jpg");
		
		FileInputStream fis = new FileInputStream(content);
	    byte[] file_buff = null;
	    if (fis != null) {
	    	int len = fis.available();
	    	file_buff = new byte[len];
	    	fis.read(file_buff);
	    }
		
		FastDFSFile file = new FastDFSFile("520", file_buff, "jpg");
		
		String fileAbsolutePath = FileManager.upload(file);
		System.out.println(fileAbsolutePath);
		fis.close();
	}
	
	@Test
	public void getFile() throws Exception {
		FileInfo file = FileManager.getFile("group1", "M00/00/00/wKgBm1N1-CiANRLmAABygPyzdlw073.jpg");
		Assert.notNull(file);
		String sourceIpAddr = file.getSourceIpAddr();
	    long size = file.getFileSize();
	    System.out.println("ip:" + sourceIpAddr + ",size:" + size);
	}
	
	@Test
	public void getStorageServer() throws Exception {
		StorageServer[] ss = FileManager.getStoreStorages("group1");
		Assert.notNull(ss);
		
		for (int k = 0; k < ss.length; k++){
			System.err.println(k + 1 + ". " + ss[k].getInetSocketAddress().getAddress().getHostAddress() + ":" + ss[k].getInetSocketAddress().getPort());
	    }
	}
	
	@Test
	public void getFetchStorages() throws Exception {
		ServerInfo[] servers = FileManager.getFetchStorages("group1", "M00/00/00/wKgBm1N1-CiANRLmAABygPyzdlw073.jpg");
		Assert.notNull(servers);
		
		for (int k = 0; k < servers.length; k++) {
    		System.err.println(k + 1 + ". " + servers[k].getIpAddr() + ":" + servers[k].getPort());
    	}
	}
	
}


文章来自: 程序员俱乐部(www.cxyclub.cn) 详文参考:http://www.cxyclub.cn/n/44103/

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [fastdfs java 实例] 推荐:

fastdfs使用实战(Java实例篇)

- - 行业应用 - ITeye博客
一、创建一个maven的webproject,叫file-manager:mvnarchetype:create-DgroupId=platform.activity.filemanager-DartifactId=file-manager-DarchetypeArtifactId=maven-archetype-webapp.

FastDFS FAQ

- - 企业架构 - ITeye博客
定位问题首先要看日志文件. 出现问题时,先检查返回的错误号和错误信息. 然后查看服务器端日志,相信可以定位到问题所在. FastDFS适用的场景以及不适用的场景. FastDFS是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储用户图片、视频、文档等文件. 对于互联网应用,和其他分布式文件系统相比,优势非常明显.

Java NIO服务器实例

- - ImportNew
我一直想学习如何用Java写一个 非阻塞IO服务器,但无法从网上找到一个满足要求的服务器. 我找到了 这个示例,但仍然没能解决我的问题. 还可以选择 Apache MINA框架. 但我的要求相对简单,MINA对我来说还稍微有点复杂. 所以在MINA和一些教程(参见 这篇和 这篇)的帮助下,我自己写了一个非阻塞IO服务器.

k-means聚类JAVA实例

- - CSDN博客互联网推荐文章
《mahout in action》第六章. datafile/cluster/simple_k-means.txt数据集如下:. 1、从D中随机取k个元素,作为k个簇的各自的中心. 2、分别计算剩下的元素到k个簇中心的相异度,将这些元素分别划归到相异度最低的簇. 3、根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均数.

Java DelayQueue使用实例

- - Java - 编程语言 - ITeye博客
DelayQueue是一个支持延时获取元素的无界阻塞队列. 队列使用PriorityQueue来实现. 队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素. 只有在延迟期满时才能从队列中提取元素. 我们可以将DelayQueue运用在以下应用场景:. 缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了.

FastDFS分布式文件系统

- - 开源软件 - ITeye博客
       FastDFS是一个开源的轻量级 分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题. 特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等.

FastDFS分布式文件系统架构

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

有了MinIO,你还会用FastDFS么?

- -
Ceph的培训,而且是收费的,真的是吓了一跳. 难道真要搞这么复杂这么强大的存储方案么. 为什么我讨厌FastDFS,其实不是因为它不好用,也不是因为它部署困难,最大的原因就是它的名字. 什么东西加个Fast就变味了,比如:. 开个玩笑,FastDFS还是伴随了我们很多岁月的. FastDFS,感觉真是日了狗了.

[Java 8] Lambda 表达式实例

- - Java - 编程语言 - ITeye博客
Java 8 中的 Lambda 表达式,允许将函数作为形参传递给另外的函数. 为了更好地理解,我们用实例的方式来演示如何使用 Lambda 表达式. 1、Lambda 表达式 Hello World. 这是一个最简单的 Lambda 表达式的例子. 首先在 main 方法的上面声明了一个接口 HelloWorld,在 main 方法中实现了这个接口,随后调用了接口的唯一方法.

Java 实例内部类 总结

- - ITeye博客
private String name = "外部类的字符串成员";. System.out.println(name);// 内部类可以访问外部类的所有成员. // 实例内部类InnerClass:在外部类以外的其他类中,必须通过外部类的实例创建内部类的实例. InnerClass2 mmy = new InnerClass2();    //错误.