12.24 使用 Spring Boot 集成 FastDFS

上篇文章介紹瞭如何使用 Spring Boot 上傳文件,這篇文章我們介紹如何使用 Spring Boot 將文件上傳到分佈式文件系統 FastDFS 中。

這個項目會在上一個項目的基礎上進行構建。

1、pom 包配置

<code><dependency>
<groupid>org.csource/<groupid>
<artifactid>fastdfs-client-java/<artifactid>
<version>1.27-SNAPSHOT/<version>
/<dependency>
/<code>

加入了fastdfs-client-java包,用來調用 FastDFS 相關的 API。

2、配置文件

resources 目錄下添加fdfs_client.conf文件

<code>connect_timeout = 60
network_timeout = 60
charset = UTF-8
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = 123456

tracker_server = 192.168.53.85:22122
tracker_server = 192.168.53.86:22122
/<code>

配置文件設置了連接的超時時間,編碼格式以及 tracker_server 地址等信息

詳細內容參考:fastdfs-client-java

3、封裝 FastDFS 上傳工具類

封裝FastDFSFile,文件基礎信息包括文件名、內容、文件類型、作者等。

<code>public class FastDFSFile {
private String name;

private byte[] content;
private String ext;
private String md5;
private String author;
//省略getter、setter
}
/<code>

封裝 FastDFSClient 類,包含常用的上傳、下載、刪除等方法。

首先在類加載的時候讀取相應的配置信息,並進行初始化。

<code>static {
try {
String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();;
ClientGlobal.init(filePath);
trackerClient = new TrackerClient();
trackerServer = trackerClient.getConnection();
storageServer = trackerClient.getStoreStorage(trackerServer);
} catch (Exception e) {
logger.error("FastDFS Client Init Fail!",e);
}
}
/<code>

文件上傳

<code>public static String[] upload(FastDFSFile file) {
logger.info("File Name: " + file.getName() + "File Length:" + file.getContent().length);

NameValuePair[] meta_list = new NameValuePair[1];
meta_list[0] = new NameValuePair("author", file.getAuthor());

long startTime = System.currentTimeMillis();
String[] uploadResults = null;
try {
storageClient = new StorageClient(trackerServer, storageServer);
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) {
logger.error("upload file fail, error code:" + storageClient.getErrorCode());
}
String groupName = uploadResults[0];
String remoteFileName = uploadResults[1];

logger.info("upload file successfully!!!" + "group_name:" + groupName + ", remoteFileName:" + " " + remoteFileName);
return uploadResults;
}
/<code>

使用 FastDFS 提供的客戶端 storageClient 來進行文件上傳,最後將上傳結果返回。

根據 groupName 和文件名獲取文件信息。

<code>public static FileInfo getFile(String groupName, String remoteFileName) {
try {
storageClient = new StorageClient(trackerServer, storageServer);
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;
}
/<code>

下載文件

<code>public static InputStream downFile(String groupName, String remoteFileName) {
try {
storageClient = new StorageClient(trackerServer, storageServer);
byte[] fileByte = storageClient.download_file(groupName, remoteFileName);
InputStream ins = new ByteArrayInputStream(fileByte);
return ins;
} 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;

}
/<code>

刪除文件

<code>public static void deleteFile(String groupName, String remoteFileName)
throws Exception {
storageClient = new StorageClient(trackerServer, storageServer);
int i = storageClient.delete_file(groupName, remoteFileName);
logger.info("delete file successfully!!!" + i);
}
/<code>

使用 FastDFS 時,直接調用 FastDFSClient 對應的方法即可。

4、編寫上傳控制類

從 MultipartFile 中讀取文件信息,然後使用 FastDFSClient 將文件上傳到 FastDFS 集群中。

<code>public String saveFile(MultipartFile multipartFile) throws IOException {
String[] fileAbsolutePath={};
String fileName=multipartFile.getOriginalFilename();
String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
byte[] file_buff = null;
InputStream inputStream=multipartFile.getInputStream();
if(inputStream!=null){
int len1 = inputStream.available();
file_buff = new byte[len1];
inputStream.read(file_buff);
}
inputStream.close();
FastDFSFile file = new FastDFSFile(fileName, file_buff, ext);
try {
fileAbsolutePath = FastDFSClient.upload(file); //upload to fastdfs
} catch (Exception e) {
logger.error("upload file Exception!",e);
}
if (fileAbsolutePath==null) {
logger.error("upload file failed,please upload again!");
}
String path=FastDFSClient.getTrackerUrl()+fileAbsolutePath[0]+ "/"+fileAbsolutePath[1];
return path;
}

/<code>

請求控制,調用上面方法saveFile()。

<code>@PostMapping("/upload") //new annotation since 4.3
public String singleFileUpload(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes) {
if (file.isEmpty()) {
redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
return "redirect:uploadStatus";
}
try {
// Get the file and save it somewhere
String path=saveFile(file);
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded '" + file.getOriginalFilename() + "'");
redirectAttributes.addFlashAttribute("path",
"file path url '" + path + "'");
} catch (Exception e) {
logger.error("upload file failed",e);
}
return "redirect:/uploadStatus";
}
/<code>

上傳成功之後,將文件的路徑展示到頁面,效果圖如下:

使用 Spring Boot 集成 FastDFS

在瀏覽器中訪問此Url,可以看到成功通過FastDFS展示:

使用 Spring Boot 集成 FastDFS


分享到:


相關文章: