java fastdfs客戶端使用實(shí)例代碼
本文研究的主要是java fastdfs客戶端使用實(shí)例的相關(guān)內(nèi)容,具體實(shí)現(xiàn)如下。
什么是FastDFS?
FastDFS是用c語(yǔ)言編寫的一款開(kāi)源的分布式文件系統(tǒng)。FastDFS為互聯(lián)網(wǎng)量身定制,充分考慮了冗余備份、負(fù)載均衡、線性擴(kuò)容等機(jī)制,并注重高可用、高性能等指標(biāo),使用FastDFS很容易搭建一套高性能的文件服務(wù)器集群提供文件上傳、下載等服務(wù)。
FastDFS架構(gòu)
FastDFS架構(gòu)包括 Tracker server和Storage server。客戶端請(qǐng)求Tracker server進(jìn)行文件上傳、下載,通過(guò)Tracker server調(diào)度最終由Storage server完成文件上傳和下載。Tracker server作用是負(fù)載均衡和調(diào)度,通過(guò)Tracker server在文件上傳時(shí)可以根據(jù)一些策略找到Storage server提供文件上傳服務(wù)??梢詫racker稱為追蹤服務(wù)器或調(diào)度服務(wù)器。Storage server作用是文件存儲(chǔ),客戶端上傳的文件最終存儲(chǔ)在Storage服務(wù)器上,Storage server沒(méi)有實(shí)現(xiàn)自己的文件系統(tǒng)而是利用操作系統(tǒng) 的文件系統(tǒng)來(lái)管理文件??梢詫torage稱為存儲(chǔ)服務(wù)器。

實(shí)例
一、創(chuàng)建一個(gè)maven的webproject,叫
file-manager:mvnarchetype:create-DgroupId=platform.activity.filemanager-DartifactId=file-manager-DarchetypeArtifactId=maven-archetype-webapp
二、定義一個(gè)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
三、定義一個(gè)配置接口:
package com.chuanliu.platform.activity.fm.manager;
import java.io.Serializable;
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";
}
四、封裝一個(gè)FastDFS文件Bean
package com.chuanliu.platform.activity.fm.manager;
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;
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測(cè)試類
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 josh_wang23@hotmail.com
*/
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());
}
}
}
總結(jié)
以上就是本文關(guān)于java fastdfs客戶端使用實(shí)例代碼的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
迅速掌握J(rèn)ava容器中常用的ArrayList類與Vector類用法
這篇文章主要介紹了Java容器中常用的ArrayList類與Vector類用法,文中只對(duì)其最基本的功能給出了示例代碼,需要的朋友可以參考下2015-11-11
Java漢字轉(zhuǎn)拼音類庫(kù)Pinyin4j詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了Java漢字轉(zhuǎn)拼音類庫(kù)Pinyin4j詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02
關(guān)于Jackson的JSON工具類封裝 JsonUtils用法
這篇文章主要介紹了關(guān)于Jackson的JSON工具類封裝 JsonUtils用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Spring?多數(shù)據(jù)源方法級(jí)別注解實(shí)現(xiàn)過(guò)程
多數(shù)據(jù)源管理是Spring框架中非常重要的一部分,它可以提高應(yīng)用程序的靈活性和可靠性,從而更好地滿足業(yè)務(wù)需求,這篇文章主要介紹了Spring?多數(shù)據(jù)源方法級(jí)別注解實(shí)現(xiàn),需要的朋友可以參考下2023-07-07
mybatis報(bào)Query?was?Empty異常的問(wèn)題
這篇文章主要介紹了mybatis報(bào)Query?was?Empty異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
java Socket編程實(shí)現(xiàn)I/O多路復(fù)用的示例
本文主要介紹了java Socket編程實(shí)現(xiàn)I/O多路復(fù)用的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09

