1、在 github 下載 fastdfs-client-java 源碼:
git clone https://github.com/happyfish100/fastdfs-client-java.git
更多具體配置可參考 github 上的源碼。
2、使用 maven 構建源碼:
(1)構建源碼前,需要先配置好 maven 的環境變量:
如上,當配置成功后,執行 mvn -v 可查看 maven 版本信息。
(2)進入剛下載的源碼目錄,執行 mvn clean install 進行構建:
當出現 build success 提示,表示已構建成功,構建后的 jar 包會存儲在本地的倉庫,比如我的是:
3、代碼配置:
(1)pom.xml 依賴:
<!-- 引入fastdfs --> <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.29-SNAPSHOT</version> <!-- 因為 fastdfs-client-java 使用的也是org.slf4j包,為避免包沖突引起的錯誤,最好排除 --> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency>
(2)在 resources 目錄下新建 fdfs_client.conf 文件,內容如下:
connect_timeout = 10
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 192.168.229.142:22122
(3)FastDFSClientUtil 類:
package spcommon.util; import org.csource.fastdfs.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class FastDFSClientUtil { private static Logger logger = LoggerFactory.getLogger(FastDFSClientUtil.class); private static final String CONFIG_FILENAME = "fdfs_client.conf"; // 加載文件 static { try { ClientGlobal.init(CONFIG_FILENAME); logger.info("初始化 Fastdfs Client 配置信息:{}", ClientGlobal.configInfo()); } catch (Exception e) { logger.error(e.toString(), e); } } /** * 上傳文件 * @param fileContent * @param extName * @return * @throws Exception */ public String[] uploadFile(byte[] fileContent, String extName) { try { TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getTrackerServer(); StorageServer storageServer = trackerClient.getStoreStorage(trackerServer); StorageClient storageClient = new StorageClient(trackerServer, storageServer); return storageClient.upload_file(fileContent, extName, null); } catch (Exception e) { logger.error(e.toString(), e); return null; } } /** * 下載文件 * @param groupName * @param fileId * @return */ public byte[] downloadFile(String groupName, String fileId) { try { TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getTrackerServer(); StorageServer storageServer = trackerClient.getStoreStorage(trackerServer); StorageClient storageClient = new StorageClient(trackerServer, storageServer); byte[] fileByte = storageClient.download_file(groupName, fileId); return fileByte; } catch (Exception e) { logger.error(e.toString(), e); return null; } } /** * 刪除文件 * @param groupName * @param remoteFilename * @return */ public int deleteFile(String groupName, String remoteFilename) { try { TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getTrackerServer(); StorageServer storageServer = trackerClient.getStoreStorage(trackerServer); StorageClient storageClient = new StorageClient(trackerServer, storageServer); int i = storageClient.delete_file(groupName, remoteFilename); logger.info("delete file successfully!!!" + i); return 1; } catch (Exception e) { logger.error(e.toString(), e); return 0; } } }
(4)FdfsClientController:
package spapi.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import spcommon.util.FastDFSClientUtil; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; @RestController public class FdfsClientController { private static Logger logger = LoggerFactory.getLogger(FdfsClientController.class); @Autowired FastDFSClientUtil fastDFSClientUtil; /** * 上傳文件 * @param file * @return */ @RequestMapping("/uploadFile") public String uploadFile(@RequestParam("file") MultipartFile file) { try { // 獲取原文件名 String origFileName = file.getOriginalFilename(); logger.info("原始文件名:{}", origFileName); // 獲取擴展名 String extName = origFileName.substring(origFileName.lastIndexOf(".") + 1); logger.info("原始文件擴展名:{}", extName); // 獲取文件存儲路徑 String[] uriArray = fastDFSClientUtil.uploadFile(file.getBytes(), extName); String groupName = uriArray[0]; String fileId = uriArray[1]; String uri = groupName + "/" + fileId; logger.info("返回的文件存儲路徑:{}", uri); return uri; } catch (Exception e) { logger.error(e.toString(), e); return null; } } /** * 下載文件 * @param groupName * @param fileId * @return */ @RequestMapping("/downloadFile") public void downloadFile(@RequestParam("groupName") String groupName, @RequestParam("fileId") String fileId, HttpServletResponse response) { try { // 獲取文件名 int index = fileId.lastIndexOf("/"); String fileName = fileId.substring(index + 1); /** * 參數格式: * groupName: group1 * fileId: M00/00/00/wKjlj15o9rGAP5MkAACpl5L2fqw700.jpg */ byte[] fileByte = fastDFSClientUtil.downloadFile(groupName, fileId); InputStream inputStream = new ByteArrayInputStream(fileByte); response.setHeader("content-type", "application/octet-stream"); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); byte[] buff = new byte[1024]; BufferedInputStream bis = new BufferedInputStream(inputStream); OutputStream os = response.getOutputStream(); int i = bis.read(buff); while (i != -1) { os.write(buff, 0, buff.length); os.flush(); i = bis.read(buff); } os.close(); bis.close(); logger.info("Download successfully!"); } catch (Exception e) { logger.error(e.toString(), e); } } /** * 刪除文件 * @param groupName * @param fileId * @return */ @RequestMapping("/deleteFile") public String deleteFile(@RequestParam("groupName") String groupName, @RequestParam("fileId") String fileId) { try { /** * 參數格式: * groupName: group1 * fileId: M00/00/00/wKjlj15o9rGAP5MkAACpl5L2fqw700.jpg */ int i = fastDFSClientUtil.deleteFile(groupName, fileId); return (i > 0) ? "刪除文件成功" : "刪除文件失敗"; } catch (Exception e) { logger.error(e.toString(), e); return null; } } }
注:fasdfs 上傳時不能自定義文件名,如果想使用自定義的文件名,通常是當服務器返回文件名后,再自定義一個與之對應的文件名保存到數據庫。