转载

10-21Spring Boot 整合 FastDFS 客户端

一、前言

前两篇整体上介绍了通过 Nginx 和 FastDFS 的整合来实现文件服务器。但是,在实际开发中对图片或文件的操作都是通过应用程序来完成的,因此,本篇将介绍 Spring Boot 整合 FastDFS 客户端来实现对图片/文件服务器的访问。

如果有不了解 FastDFS 的读者可以先浏览《FastDFS 环境搭建》 和 《Nginx 整合 FastDFS 实现文件服务器》 来普及内容,或是另行查阅网上相关资料。

二、整合编码

# 2.1 添加依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-test</artifactId>
  8. <scope>test</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-devtools</artifactId>
  13. <optional>true</optional>
  14. <scope>true</scope>
  15. </dependency>
  16. <dependency>
  17. <groupId>com.github.tobato</groupId>
  18. <artifactId>fastdfs-client</artifactId>
  19. <version>1.26.3</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>commons-io</groupId>
  23. <artifactId>commons-io</artifactId>
  24. <version>2.6</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  29. </dependency>

上边的 fastdfs-client 是并非 FastDFS Client 原作者编写的整合包,具体详情可以访问 https://github.com/tobato/FastDFS_Client 。

# 2.2 application.properties

  1. server.port=8080
  2. # fastDFS 配置
  3. fdfs.so-timeout=1501
  4. fdfs.connect-timeout=601
  5. fdfs.thumb-image.width=150
  6. fdfs.thumb-image.height=150
  7. fdfs.web-server-url=192.168.10.110/
  8. fdfs.tracker-list[0]=192.168.10.110:22122

# 2.3 后端代码

  • 加载 FastDFS 配置类:
  1. @Configuration
  2. @Import(FdfsClientConfig.class)
  3. // 解决jmx重复注册bean的问题
  4. @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
  5. public class ComponetImport {
  6. // 导入依赖组件
  • FastDFS 工具类:
  1. @Component
  2. public class FastDFSClient {
  3. private final Logger logger = LoggerFactory.getLogger(FastDFSClient.class);
  4. @Autowired
  5. private FastFileStorageClient storageClient;
  6. @Autowired
  7. private FdfsWebServer fdfsWebServer;
  8. /**
  9. * 上传文件
  10. * @param file 文件对象
  11. * @return 文件访问地址
  12. * @throws IOException
  13. */
  14. public String uploadFile(MultipartFile file) throws IOException {
  15. StorePath storePath = storageClient.uploadFile(file.getInputStream(),file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()),null);
  16. return getResAccessUrl(storePath);
  17. /**
  18. * 上传文件
  19. * @param file 文件对象
  20. * @return 文件访问地址
  21. * @throws IOException
  22. */
  23. public String uploadFile(File file) throws IOException {
  24. FileInputStream inputStream = new FileInputStream (file);
  25. StorePath storePath = storageClient.uploadFile(inputStream,file.length(), FilenameUtils.getExtension(file.getName()),null);
  26. return getResAccessUrl(storePath);
  27. /**
  28. * 将一段字符串生成一个文件上传
  29. * @param content 文件内容
  30. * @param fileExtension
  31. * @return
  32. */
  33. public String uploadFile(String content, String fileExtension) {
  34. byte[] buff = content.getBytes(Charset.forName("UTF-8"));
  35. ByteArrayInputStream stream = new ByteArrayInputStream(buff);
  36. StorePath storePath = storageClient.uploadFile(stream,buff.length, fileExtension,null);
  37. return getResAccessUrl(storePath);
  38. // 封装图片完整URL地址
  39. private String getResAccessUrl(StorePath storePath) {
  40. String fileUrl = fdfsWebServer.getWebServerUrl() + storePath.getFullPath();
  41. return fileUrl;
  42. /**
  43. * 下载文件
  44. * @param fileUrl 文件url
  45. * @return
  46. */
  47. public byte[] download(String fileUrl) {
  48. String group = fileUrl.substring(0, fileUrl.indexOf("/"));
  49. String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
  50. byte[] bytes = storageClient.downloadFile(group, path, new DownloadByteArray());
  51. return bytes;
  52. /**
  53. * 删除文件
  54. * @param fileUrl 文件访问地址
  55. * @return
  56. */
  57. public void deleteFile(String fileUrl) {
  58. if (StringUtils.isEmpty(fileUrl)) {
  59. return;
  60. try {
  61. StorePath storePath = StorePath.praseFromUrl(fileUrl);
  62. storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
  63. } catch (FdfsUnsupportStorePathException e) {
  64. logger.warn(e.getMessage());
  • controller 类:
  1. @RestController
  2. @RequestMapping("/fdfs")
  3. public class FastDFSController {
  4. @Autowired
  5. private FastDFSClient fdfsClient;
  6. /**
  7. * 文件上传
  8. * @param file
  9. * @return
  10. * @throws Exception
  11. */
  12. @RequestMapping("/upload")
  13. public Map<String,Object> upload(MultipartFile file) throws Exception{
  14. String url = fdfsClient.uploadFile(file);
  15. Map<String,Object> result = new HashMap<>();
  16. result.put("code", 200);
  17. result.put("msg", "上传成功");
  18. result.put("url", url);
  19. return result;
  20. /**
  21. * 文件下载
  22. * @param fileUrl url 开头从组名开始
  23. * @param response
  24. * @throws Exception
  25. */
  26. @RequestMapping("/download")
  27. public void download(String fileUrl, HttpServletResponse response) throws Exception{
  28. byte[] data = fdfsClient.download(fileUrl);
  29. response.setCharacterEncoding("UTF-8");
  30. response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("test.jpg", "UTF-8"));
  31. // 写出
  32. ServletOutputStream outputStream = response.getOutputStream();
  33. IOUtils.write(data, outputStream);

# 2.4 前端页面

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>文件上传</title>
  6. <link rel="stylesheet" th:href="@{/css/bootstrap.css}">
  7. <style>
  8. form {
  9. margin-top: 30px;
  10. </style>
  11. </head>
  12. <body>
  13. <div class="container">
  14. <div class="row">
  15. <div class="col-md-4 col-sm-4"></div>
  16. <div class="col-md-4 col-sm-4">
  17. <h2> FastDFS 文件上传</h2>
  18. <form th:action="@{/fdfs/upload}" method="post" enctype="multipart/form-data">
  19. <div class="form-group">
  20. <input type="file" name="file" id="exampleInputFile">
  21. </div>
  22. <button type="submit" class="btn btn-default">上传</button>
  23. </form>
  24. </div>
  25. <div class="col-md-4 col-sm-4"></div>
  26. </div>
  27. </div>
  28. </body>
  29. </html>

三、测试

本篇只测试文件上传和访问的效果,演示图如下:

10-21Spring Boot 整合 FastDFS 客户端

整合成功~~

原文  https://www.extlight.com/2018/10/21/Spring-Boot-整合-FastDFS-客户端/
正文到此结束
Loading...