SpringBoot集成FastDFS依赖实现文件上传的示例

这篇文章主要介绍了SpringBoot集成FastDFS依赖实现文件上传,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

目录

前言

1、引入依赖

2、将Fdfs配置引入项目

3、在application.yml当中配置Fdfs相关参数

4、client封装工具类

5、创建Conttoler测试类

5.1 文件上传测试

5.2、下载文件测试

前言

对FastDFS文件系统安装后的使用。

FastDFS的安装请参考这篇:Docker中搭建FastDFS文件系统(多图)

本文环境:IDEA + JDK1.8 + Maven

本文项目代码:fastdfs_jb51.rar

1、引入依赖

简单说一下这个依赖部分,目前大部分都是采用的如下依赖:

net.oschina.zcx7878fastdfs-client-java1.27.0.0

本着不重复造轮子,且为了使用方便我们可以去GitHub找一个集成好的依赖:

https://github.com/tobato/FastDFS_Client

com.github.tobatofastdfs-client1.27.2

2、将Fdfs配置引入项目

只需要创建一个配置类就可以了:

@Configuration @Import(FdfsClientConfig.class) @EnableMBeanExport(registration = RegistrationPolicy.IGnorE_EXISTING) public class ComponetImport { // 导入依赖组件 }

参考截图:

3、在application.yml当中配置Fdfs相关参数

根据自己情况修改相应ip地址及端口号:

server: port: 8080 ip: 10.211.55.4 # 根据自己FastDFS服务器修改 fdfs: so-timeout: 1501 connect-timeout: 601 thumb-image: #缩略图生成参数 width: 150 height: 150 tracker-list: #TrackerList参数,支持多个 - 10.211.55.4:22122 web-server-url: http://${ip}:8888/

4、client封装工具类

创建FastDFSClient.java包装工具类,方便后面使用:

import com.github.tobato.fastdfs.domain.conn.FdfsWebServer; import com.github.tobato.fastdfs.domain.fdfs.StorePath; import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray; import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException; import com.github.tobato.fastdfs.service.FastFileStorageClient; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.multipartfile; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.charset.Charset; @Component 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 文件访问地址 * @return */ public void deleteFile(String fileUrl) { if (StringUtils.isEmpty(fileUrl)) { return; } try { StorePath storePath = StorePath.parseFromUrl(fileUrl); storageClient.deleteFile(storePath.getGroup(), storePath.getPath()); } catch (FdfsUnsupportStorePathException e) { System.out.println(e.getMessage()); /** Todo 只是测试,所以未使用,logger,正式环境请修改打印方式 **/ } } /** * 下载文件 * * @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 = storageClient.downloadFile(group, path, downloadByteArray); return bytes; } }

5、创建Conttoler测试类

5.1 文件上传测试

@RestController @RequestMapping("/file") public class FileUploadController { @Autowired private FastDFSClient fastDFSClient; /** * 上传 * @param file * @return * @throws IOException */ @RequestMapping("/upload") public String uploadFile(multipartfile file) throws IOException { return fastDFSClient.uploadFile(file); } }

执行效果截图:

5.2、下载文件测试

@RestController @RequestMapping("/file") public class FileUploadController { @Autowired private FastDFSClient fastDFSClient; /** * 下载 * @param fileUrl * @param response * @throws IOException */ @RequestMapping("/download") public void downloadFile(String fileUrl, HttpServletResponse response) throws IOException { byte[] bytes = fastDFSClient.downloadFile(fileUrl); /** Todo 这里只是为了整合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(); } } } }

测试下载路径:

http://127.0.0.1:8080/file/download?fileUrl=group1/M00/00/00/CtM3BF84r4SAEPDgAABoGL78QcY682.jpg

拼接的参数为:group1/M00/00/00/CtM3BF84r4SAEPDgAABoGL78QcY682.jpg

大家想修改路径的话,需要同步修改 downloadFile() 方法里的分隔方式。

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...