一、前言
《FastDFS安装与nginx整合》 介绍了FastDFS的安装与基本使用,本节我们重点介绍下在springboot项目中,如何使用FastDFS。
二、项目搭建
2.1 创建项目
创建一个springboot项目,我们将引入thymeleaf作为前端测试,pom文件具体如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.github.tobato/fastdfs-client --> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.27.2</version> </dependency>
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
|
2.2 配置application.yml
1 2 3 4 5 6 7 8 9
| fdfs: so-timeout: 1500 connect-timeout: 600 thumb-image: height: 300 width: 300 web-server-url: 192.168.33.10:10005/ #nginx代理访问路径 tracker-list: - 192.168.33.10:22122
|
2.3 加载FastDFS配置类
ComponetImport.java
1 2 3 4 5 6
| @Configuration @Import(FdfsClientConfig.class) // 解决jmx重复注册bean的问题 @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) public class ComponetImport { }
|
2.4 FastDFS工具类
FastDFSClient.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| @Component @Slf4j public class FastDFSClient {
@Autowired private FastFileStorageClient storageClient;
@Autowired private FdfsWebServer fdfsWebServer;
/** * 上传文件 * @param file 文件对象 * @return 文件访问地址 * @throws IOException */ public String uploadFile(MultipartFile file) throws IOException { StorePath storePath = storageClient.uploadFile(file.getInputStream(),file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()),null); return getResAccessUrl(storePath); }
/** * 上传文件 * @param file 文件对象 * @return 文件访问地址 * @throws IOException */ public String uploadFile(File file) throws IOException { FileInputStream inputStream = new FileInputStream (file); StorePath storePath = storageClient.uploadFile(inputStream,file.length(), FilenameUtils.getExtension(file.getName()),null); return getResAccessUrl(storePath); }
/** * 将一段字符串生成一个文件上传 * @param content 文件内容 * @param fileExtension * @return */ public String uploadFile(String content, String fileExtension) { byte[] buff = content.getBytes(Charset.forName("UTF-8")); ByteArrayInputStream stream = new ByteArrayInputStream(buff); StorePath storePath = storageClient.uploadFile(stream,buff.length, fileExtension,null); return getResAccessUrl(storePath); }
// 封装图片完整URL地址 private String getResAccessUrl(StorePath storePath) { String fileUrl = fdfsWebServer.getWebServerUrl() + storePath.getFullPath(); return fileUrl; }
/** * 下载文件 * @param fileUrl 文件url * @return */ public byte[] download(String fileUrl) { String group = fileUrl.substring(0, fileUrl.indexOf("/")); String path = fileUrl.substring(fileUrl.indexOf("/") + 1); byte[] bytes = storageClient.downloadFile(group, path, new DownloadByteArray()); return bytes; }
/** * 删除文件 * @param fileUrl 文件访问地址 * @return */ public void deleteFile(String fileUrl) { if (StringUtils.isEmpty(fileUrl)) { return; } try {
String group = fileUrl.substring(0, fileUrl.indexOf("/")); String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
storageClient.deleteFile(group, path); } catch (FdfsUnsupportStorePathException e) { log.warn(e.getMessage()); } }
}
|
三、测试
3.1 编写测试类
FastDFSController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| @RestController @RequestMapping("/fdfs") public class FastDFSController {
@Autowired private FastDFSClient fdfsClient;
/** * 文件上传 * @param file * @return * @throws Exception */ @RequestMapping("/upload") public Map<String,Object> upload(MultipartFile file) throws Exception{
String url = fdfsClient.uploadFile(file);
Map<String,Object> result = new HashMap<>(); result.put("code", 200); result.put("msg", "上传成功"); result.put("url", url);
return result; }
/** * 文件下载 * @param fileUrl url 开头从组名开始 * @param response * @throws Exception */ @RequestMapping("/download") public void download(String fileUrl, HttpServletResponse response) throws Exception{
byte[] data = fdfsClient.download(fileUrl);
response.setCharacterEncoding("UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("test.jpg", "UTF-8"));
// 写出 ServletOutputStream outputStream = response.getOutputStream(); IOUtils.write(data, outputStream); }
/** * 删除下载 * @param fileUrl url 开头从组名开始 * @throws Exception */ @RequestMapping("/delete") public Map<String,Object> delete(String fileUrl) throws Exception{
fdfsClient.deleteFile(fileUrl);
Map<String,Object> result = new HashMap<>(); result.put("code", 200); result.put("msg", "删除成功");
return result; }
}
|
3.2 测试页面
templates\index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>文件上传</title> <style> form { margin-top: 30px; } </style> </head> <body> <div class="container"> <div class="row"> <div class="col-md-4 col-sm-4"></div> <div class="col-md-4 col-sm-4"> <h2> FastDFS 文件上传</h2> <form th:action="@{/fdfs/upload}" method="post" enctype="multipart/form-data"> <div class="form-group"> <input type="file" name="file" id="exampleInputFile"> </div> <button type="submit" class="btn btn-default">上传</button> </form> </div> <div class="col-md-4 col-sm-4"></div> </div> </div> </body> </html>
|
3.3 测试
文件上传与浏览测试
浏览器访问 http://127.0.0.1:8080/
文件删除测试
http://127.0.0.1:8080/fdfs/delete?fileUrl=group1/M00/00/00/wKghCmMUpV2AVmsxAABD4k7DNRw753.jpg
再次访问图片
更多参考:
FastDFS_Client
FastDFS论坛
FastDFS常见问题