springboot整合fastdfs实现上传和下载
FastDFS_Client源码
https://github.com/tobato/FastDFS_Client
友情提示:由于FastDFS_Client这个源码不是很多,并且目前没有找到相关文档,有问题请优先查看作者的源码和单元测试,其次再百度~
我的DEMO
项目包目录结构
springboot版本
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
引入fastdfs
<dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.25.2-RELEASE</version> </dependency>
application-dev.yml(fastdfs配置,请自行替换trackerList属性)
fdfs:
# 读取时间
soTimeout: 1501
# 连接超时时间
connectTimeout: 691
# 编码默认UTF-8,charset属性不能自定义
# charset: UTF-8
# 缩略图
thumbImage:
# 宽
width: 150
# 高
height: 150
# tracker列表
trackerList:
- fastDFS的IP:端口
- fastDFS的IP:端口
引入fastdfs配置
package com.wang.sb.config; import com.github.tobato.fastdfs.FdfsClientConfig; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableMBeanExport; import org.springframework.context.annotation.Import; import org.springframework.jmx.support.RegistrationPolicy; /** * @Author wly * @Date 2018/6/13 9:28 */ @Configuration @Import(FdfsClientConfig.class) @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) public class FdfsConfig { }
上传和下载实现
package com.wang.sb.service; import com.github.tobato.fastdfs.domain.StorePath; import com.github.tobato.fastdfs.proto.storage.DownloadByteArray; import com.github.tobato.fastdfs.service.FastFileStorageClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.IOException; /** * FastDFS客户端包装类 * * @Author wly * @Date 2018/6/13 9:46 */ @Component public class FastDFSClientWrapper { private final Logger logger = LoggerFactory.getLogger(FastDFSClientWrapper.class); @Autowired private FastFileStorageClient fastFileStorageClient; /** * 文件上传 * * @param bytes 文件字节 * @param fileSize 文件大小 * @param extension 文件扩展名 * @return fastDfs路径 */ public String uploadFile(byte[] bytes, long fileSize, String extension) { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); StorePath storePath = fastFileStorageClient.uploadFile(byteArrayInputStream, fileSize, extension, null); System.out.println(storePath.getGroup() + "===" + storePath.getPath() + "======" + storePath.getFullPath()); return storePath.getFullPath(); } /** * 下载文件 * * @param fileUrl 文件URL * @return 文件字节 * @throws IOException */ public byte[] downloadFile(String fileUrl) throws IOException { String group = fileUrl.substring(0, fileUrl.indexOf("/")); String path = fileUrl.substring(fileUrl.indexOf("/") + 1); DownloadByteArray downloadByteArray = new DownloadByteArray(); byte[] bytes = fastFileStorageClient.downloadFile(group, path, downloadByteArray); return bytes; } }
web调用测试
package com.wang.sb.web; import com.wang.sb.service.FastDFSClientWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; /** * @Description * @Author wly * @Date 2018/6/12 17:44 */ @RestController @RequestMapping("/hello") public class HelloController { @Autowired private FastDFSClientWrapper fastDFSClientWrapper; @RequestMapping("/upload") public String uploadFile(MultipartFile file) throws IOException { byte[] bytes = file.getBytes(); String originalFileName = file.getOriginalFilename(); String extension = originalFileName.substring(originalFileName.lastIndexOf(".") + 1); String fileName = file.getName(); long fileSize = file.getSize(); System.out.println(originalFileName + "==========" + fileName + "===========" + fileSize + "===============" + extension + "====" + bytes.length); return fastDFSClientWrapper.uploadFile(bytes, fileSize, extension); } @RequestMapping("/download") public void downloadFile(String fileUrl, HttpServletResponse response) throws IOException { byte[] bytes = fastDFSClientWrapper.downloadFile(fileUrl); // 这里只是为了整合fastdfs,所以写死了文件格式。需要在上传的时候保存文件名。下载的时候使用对应的格式 response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("sb.xlsx", "UTF-8")); response.setCharacterEncoding("UTF-8"); ServletOutputStream outputStream = null; try { outputStream = response.getOutputStream(); outputStream.write(bytes); } catch (IOException e) { e.printStackTrace(); } finally { try { outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
亲测可用!