Java 客戶端操作 FastDFS 實(shí)現(xiàn)文件上傳下載替換刪除功能
FastDFS 的作者余慶先生已經(jīng)為我們開發(fā)好了 Java 對(duì)應(yīng)的 SDK。這里需要解釋一下:作者余慶并沒有及時(shí)更新最新的 Java SDK 至 Maven 中央倉(cāng)庫(kù),目前中央倉(cāng)庫(kù)最新版仍舊是 1.27 版。所以我們需要通過 Github:https://github.com/happyfish100/fastdfs-client-java 下載項(xiàng)目源碼,再通過命令 mvn clean install
編譯打包導(dǎo)入 Maven 倉(cāng)庫(kù)使用即可。
接下來我們通過 Java API 操作 FastDFS 實(shí)現(xiàn)文件的上傳、下載、替換、刪除、查詢?cè)獢?shù)據(jù)、查詢?cè)斍榈裙δ堋?/p>
文中案例已同步至:
Github:https://github.com/imrhelloworld/fastdfs-javaGitee:https://gitee.com/imrhelloworld/fastdfs-java
創(chuàng)建項(xiàng)目
添加依賴
在項(xiàng)目的 pom.xml 中添加以下依賴。因?yàn)槲覀冃枰恍┏S霉ぞ甙蛦卧獪y(cè)試,所以需要引入它們。
<!-- fastdfs java client --> <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.29-SNAPSHOT</version> </dependency> <!-- apache commons lang3 工具包 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.11</version> </dependency> <!-- junit 單元測(cè)試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency>
編寫配置文件
fdfs_client.conf
# 超時(shí)時(shí)間 connect_timeout = 10 network_timeout = 30 # 編碼字符集 charset = UTF-8 # tracker 服務(wù)器 HTTP 協(xié)議下暴露的端口 http.tracker_http_port = 8080 # tracker 服務(wù)器的 IP 和端口 tracker_server = 192.168.10.101:22122
工具類
package org.example.client; import org.apache.commons.lang3.StringUtils; import org.csource.common.MyException; import org.csource.common.NameValuePair; import org.csource.fastdfs.*; import java.io.*; /** * FastDFS 分布式文件系統(tǒng) Java 客戶端工具類 * 具體功能:文件上傳、下載、替換、刪除、查詢文件元數(shù)據(jù)、查看文件詳情 */ public class FastDFSClient { // 獲取配置文件地址 private static final String CONF_FILENAME = Thread.currentThread() .getContextClassLoader().getResource("").getPath() + "fdfs_client.conf"; // Storage 存儲(chǔ)服務(wù)器客戶端 private static StorageClient storageClient = null; static { try { // 加載配置文件 ClientGlobal.init(CONF_FILENAME); // 初始化 Tracker 客戶端 TrackerClient trackerClient = new TrackerClient(ClientGlobal.g_tracker_group); // 初始化 Tracker 服務(wù)端 TrackerServer trackerServer = trackerClient.getTrackerServer(); // 初始化 Storage 服務(wù)端 StorageServer storageServer = trackerClient.getStoreStorage(trackerServer); // 初始化 Storage 客戶端 storageClient = new StorageClient(trackerServer, storageServer); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } } /** * 文件上傳 * * @param inputStream 上傳的文件的字節(jié)輸入流 * @param fileName 上傳的文件的原始名 * @return */ public static String[] uploadFile(InputStream inputStream, String fileName) { try { // 準(zhǔn)備字節(jié)數(shù)組 byte[] fileBuff = null; // 文件元數(shù)據(jù) NameValuePair[] metaList = null; if (inputStream != null) { // 查看文件的長(zhǎng)度 int len = inputStream.available(); // 初始化元數(shù)據(jù)數(shù)組 metaList = new NameValuePair[2]; // 第一組元數(shù)據(jù),文件的原始名稱 metaList[0] = new NameValuePair("file_name", fileName); // 第二組元數(shù)據(jù),文件的長(zhǎng)度 metaList[1] = new NameValuePair("file_length", String.valueOf(len)); // 創(chuàng)建對(duì)應(yīng)長(zhǎng)度的字節(jié)數(shù)組 fileBuff = new byte[len]; // 將輸入流中的字節(jié)內(nèi)容,讀到字節(jié)數(shù)組中 inputStream.read(fileBuff); } /* 上傳文件。 參數(shù)含義:要上傳的文件的內(nèi)容(使用字節(jié)數(shù)組傳遞),上傳的文件的類型(擴(kuò)展名),元數(shù)據(jù) */ String[] fileids = storageClient.upload_file(fileBuff, getFileExt(fileName), metaList); return fileids; } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } return null; } /** * 文件上傳 * * @param file 上傳的文件 * @param fileName 上傳的文件的原始名 * @return */ public static String[] uploadFile(File file, String fileName) { try (FileInputStream fis = new FileInputStream(file)) { return uploadFile(fis, fileName); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } /** * 獲取文件后綴名(不帶點(diǎn)) * * @param fileName * @return 如:"jpg" or "" */ private static String getFileExt(String fileName) { if (StringUtils.isBlank(fileName) || !fileName.contains(".")) { return ""; } return fileName.substring(fileName.lastIndexOf(".") + 1); // 不帶最后的點(diǎn) } /** * 獲取文件詳情 * * @param groupName 組/卷名,默認(rèn)值:group1 * @param remoteFileName 文件名,例如:"M00/00/00/wKgKZl9tkTCAJAanAADhaCZ_RF0495.jpg" * @return 文件詳情 */ public static FileInfo getFileInfo(String groupName, String remoteFileName) { try { return storageClient.get_file_info(groupName == null ? "group1" : groupName, remoteFileName); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } return null; } /** * 獲取元數(shù)據(jù) * * @param groupName 組/卷名,默認(rèn)值:group1 * @param remoteFileName 文件名,例如:"M00/00/00/wKgKZl9tkTCAJAanAADhaCZ_RF0495.jpg" * @return 文件的元數(shù)據(jù)數(shù)組 */ public static NameValuePair[] getMetaData(String groupName, String remoteFileName) { try { // 根據(jù)組名和文件名通過 Storage 客戶端獲取文件的元數(shù)據(jù)數(shù)組 return storageClient.get_metadata(groupName == null ? "group1" : groupName, remoteFileName); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } return null; } /** * 文件下載 * * @param groupName 組/卷名,默認(rèn)值:group1 * @param remoteFileName 文件名,例如:"M00/00/00/wKgKZl9tkTCAJAanAADhaCZ_RF0495.jpg" * @return 文件的字節(jié)輸入流 */ public static InputStream downloadFile(String groupName, String remoteFileName) { try { // 根據(jù)組名和文件名通過 Storage 客戶端獲取文件的字節(jié)數(shù)組 byte[] bytes = storageClient.download_file(groupName == null ? "group1" : groupName, remoteFileName); // 返回字節(jié)流對(duì)象 InputStream inputStream = new ByteArrayInputStream(bytes); return inputStream; } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } return null; } /** * 文件刪除 * * @param groupName 組/卷名,默認(rèn)值:group1 * @param remoteFileName 文件名,例如:"M00/00/00/wKgKZl9tkTCAJAanAADhaCZ_RF0495.jpg" * @return 0為成功,非0為失敗 */ public static int deleteFile(String groupName, String remoteFileName) { int result = -1; try { // 根據(jù)組名和文件名通過 Storage 客戶端刪除文件 result = storageClient.delete_file(groupName == null ? "group1" : groupName, remoteFileName); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } return result; } /** * 修改一個(gè)已經(jīng)存在的文件 * * @param oldGroupName 舊組名 * @param oldFileName 舊文件名 * @param file 新文件 * @param fileName 新文件名 * @return */ public static String[] modifyFile(String oldGroupName, String oldFileName, File file, String fileName) { // 先上傳 String[] fileids = uploadFile(file, fileName); if (fileids == null) { return null; } // 再刪除 int delResult = deleteFile(oldGroupName, oldFileName); if (delResult != 0) { return null; } return fileids; } }
測(cè)試
文件上傳
// 文件上傳 @Test public void testUploadFile() { String[] fileids = FastDFSClient.uploadFile(new File("D:/china.jpg"), "china.jpg"); for (String fileid : fileids) { System.out.println("fileid = " + fileid); } }
返回值
fileid = group1 fileid = M00/00/00/wKgKZl9xMdiAcOLdAADhaCZ_RF0096.jpg
文件詳情
// 查看文件詳情 @Test public void testGetFileInfo() { FileInfo fileInfo = FastDFSClient.getFileInfo("group1", "M00/00/00/wKgKZl9xMdiAcOLdAADhaCZ_RF0096.jpg"); System.out.println("fileInfo = " + fileInfo); }
返回值:
fileInfo = fetch_from_server = false, file_type = 1, source_ip_addr = 192.168.10.102, file_size = 57704, create_timestamp = 2020-09-28 08:44:08, crc32 = 645874781
文件元數(shù)據(jù)
// 獲取文件數(shù)據(jù) @Test public void testGetMetaData() { NameValuePair[] metaDatas = FastDFSClient.getMetaData("group1", "M00/00/00/wKgKZl9xMdiAcOLdAADhaCZ_RF0096.jpg"); for (NameValuePair metaData : metaDatas) { System.out.println(metaData.getName() + "---" + metaData.getValue()); } }
返回值:
file_length---57704 file_name---china.jpg
文件下載
// 文件下載 @Test public void testDownloadFile() { InputStream is = FastDFSClient.downloadFile("group1", "M00/00/00/wKgKZl9xMdiAcOLdAADhaCZ_RF0096.jpg"); try (FileOutputStream fos = new FileOutputStream("D:/wKgKZl9xMdiAcOLdAADhaCZ_RF0096.jpg")) { int len = 0; byte[] bytes = new byte[1024]; while ((len = is.read(bytes)) != -1) { fos.write(bytes, 0, len); fos.flush(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
文件刪除
// 文件刪除 @Test public void testDeleteFile() { int result = FastDFSClient.deleteFile("group1", "M00/00/00/wKgKZl9xMdiAcOLdAADhaCZ_RF0096.jpg"); System.out.println("result = " + result); }
返回值:
result = 0
文件替換
// 文件替換 @Test public void testModifyFile() { String[] fileids = FastDFSClient.modifyFile("group1", "M00/00/00/wKgKZl9xOS2ASdu8AADhaCZ_RF0898.jpg", new File("D:/mhw.jpg"), "mhw.jpg"); for (String fileid : fileids) { System.out.println("fileid = " + fileid); } }
返回值:
fileid = group1 fileid = M00/00/00/wKgKZl9xOeaAFO00AACmo7QBGtA298.jpg
至此 Java 客戶端操作 FastDFS 實(shí)現(xiàn)文件上傳下載替換刪除等操作就到這里,下一篇我們帶大家搭建 FastDFS 的集群環(huán)境,多 Tracker 多 Storage 然后通過 Nginx 代理。
到此這篇關(guān)于Java 客戶端操作 FastDFS 實(shí)現(xiàn)文件上傳下載替換刪除功能的文章就介紹到這了,更多相關(guān)java 文件上傳下載替換刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java實(shí)現(xiàn)整合文件上傳到FastDFS的方法詳細(xì)
- Java實(shí)現(xiàn)圖片上傳至FastDFS入門教程
- Java fastdfs客戶端實(shí)現(xiàn)上傳下載文件
- Java使用OSS實(shí)現(xiàn)上傳文件功能
- Java下載https文件并上傳阿里云oss服務(wù)器
- Java微信小程序oss圖片上傳的實(shí)現(xiàn)方法
- java實(shí)現(xiàn)上傳文件到oss(阿里云)功能示例
- java獲取網(wǎng)絡(luò)圖片上傳到OSS的方法
- Java實(shí)現(xiàn)Fast DFS、服務(wù)器、OSS上傳功能
相關(guān)文章
Spring Security獲取用戶認(rèn)證信息的實(shí)現(xiàn)流程
Spring Security是一個(gè)能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應(yīng)用上下文中配置的Bean,充分利用了Spring IoC,DI和AOP功能,為應(yīng)用系統(tǒng)提供聲明式的安全訪問控制功能2022-12-12spring 整合mybatis后用不上session緩存的原因分析
因?yàn)橐恢庇胹pring整合了mybatis,所以很少用到mybatis的session緩存。什么原因呢?下面小編給大家介紹spring 整合mybatis后用不上session緩存的原因分析,需要的朋友可以參考下2017-02-02MyBatis控制臺(tái)顯示SQL語(yǔ)句的方法實(shí)現(xiàn)
這篇文章主要介紹了MyBatis控制臺(tái)顯示SQL語(yǔ)句的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java異常詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
異常是Java語(yǔ)言中的一部分,它代表程序中由各種原因引起的“不正?!币蛩?。下面通過本文給大家介紹java異常的相關(guān)知識(shí),感興趣的朋友一起看看吧2017-06-06