本文研究的主要是java fastdfs客戶端使用實例的相關內容,具體實現如下。
什麼是FastDFS?
FastDFS是用c語言編寫的一款開源的分佈式文件系統。 FastDFS為互聯網量身定制,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並註重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集群提供文件上傳、下載等服務。
FastDFS架構
FastDFS架構包括Tracker server和Storage server。客戶端請求Tracker server進行文件上傳、下載,通過Tracker server調度最終由Storage server完成文件上傳和下載。 Tracker server作用是負載均衡和調度,通過Tracker server在文件上傳時可以根據一些策略找到Storage server提供文件上傳服務。可以將tracker稱為追踪服務器或調度服務器。 Storage server作用是文件存儲,客戶端上傳的文件最終存儲在Storage服務器上,Storage server沒有實現自己的文件系統而是利用操作系統的文件系統來管理文件。可以將storage稱為存儲服務器。
實例
一、創建一個maven的webproject,叫
file-manager:mvnarchetype:create-DgroupId=platform.activity.filemanager-DartifactId=file-manager-DarchetypeArtifactId=maven-archetype-webapp
二、定義一個fastDFS的客戶端文件fdfs_client.conf:
class="properties" name="code">connect_timeout = 2network_timeout = 30charset = UTF-8http.tracker_http_port = 8080http.anti_steal_token = nohttp.secret_key = FastDFS1234567890tracker_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;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;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 configurationstry {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());}}}
總結
以上就是本文關於java fastdfs客戶端使用實例代碼的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!