In this article, we describe how to use Spring Boot to upload files to distributed file system FastDFS.
This project will be built on the basis of the previous project.
1. Pom package configuration
We use Spring Boot's latest version 1.5.9, jdk uses 1.8, tomcat8.0.
<dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.27-SNAPSHOT</version></dependency>
Added the fastdfs-client-java package to call FastDFS-related APIs.
2. Configuration file
Add fdfs_client.conf file in the resources directory
connect_timeout = 60network_timeout = 60charset = UTF-8http.tracker_http_port = 8080http.anti_steal_token = nohttp.secret_key = 123456tracker_server = 192.168.53.85:22122tracker_server = 192.168.53.86:22122
The configuration file sets the connection timeout time, encoding format, tracker_server address and other information.
Reference for details: fastdfs-client-java
3. Encapsulate the FastDFS upload tool class
Encapsulate FastDFSFile, and the basic file information includes file name, content, file type, author, etc.
public class FastDFSFile { private String name; private byte[] content; private String ext; private String md5; private String author; //Omit getter and setterEncapsulate the FastDFSClient class, including commonly used methods such as upload, download, and delete.
First, read the corresponding configuration information when the class is loaded and initialize it.
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); }}File upload
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;}Use the client storageClient provided by FastDFS to upload files, and finally return the upload result.
Get file information based on groupName and file name.
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;}Download the file
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;}Delete files
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);}When using FastDFS, just call the corresponding method of FastDFSClient.
4. Write upload control class
Read file information from MultipartFile and upload the file to the FastDFS cluster using FastDFSClient.
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;}Request control, call the above method saveFile().
@PostMapping("/upload") //new annotation since 4.3public 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";}After the upload is successful, display the file path to the page, and the renderings are as follows:
Visit this Url in your browser and you can see that it is successfully displayed through FastDFS:
This is done using Spring Boot to integrate FastDFS.
Sample code - github
The above is all the content of this article. I hope it will be helpful to everyone's learning and I hope everyone will support Wulin.com more.