首先安装fastdfs 这里使用docker 简单快捷
1. docker pull delron/fastdfs 下载最新镜像
2.docker run -d --network=host --name tracker -v 宿主机目录:/var/fdfs delron/fastdfs tracker 启动tracker服务
3.docker run -dti --network=host --name storage -e TRACKER_SERVER=宿主机ip地址:22122 -v 宿主机目录:/var/fdfs delron/fastdfs storage 安装storage服务
4. 8888是默认的nginx代理端口,23000是storage服务端口,22122是tracker服务端口。需要开放这几个端口 由于nginx端口是8888 所以文件上传的访问路径端口也是8888
接下来就是与spring boot整合
<dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.27.2</version> </dependency>
maven依赖 然后就是配置文件
#fastdfs配置
fdfs:
#tracker 服务器列表
tracker-list:
- 宿主机ip:22122
#超时时间
connect-timeout: 600
#略缩图
thumb-image:
height: 150
150
spring:
servlet:
multipart:
max-file-size: 10MB #单个文件最大大小
max-request-size: 100MB #一次请求最大文件大小
启动类上加一个注解 导入FdfsClientConfig的配置
@SpringBootApplication @Import(FdfsClientConfig.class) public class App { public static void main(String[] args) { SpringApplication.run(App.class,args); } }
到这里 配置基本完成了 这个依赖是GitHub上的一个开源项目,详细一些可以去GitHub上搜索
贴一下service和controller
/** * @Description: 文件上传下载 * @Author: Tan * @CreateDate: 2020/3/31 **/ @Service public class FileService { @Autowired private FastFileStorageClient storageClient; @Autowired private ThumbImageConfig thumbImageConfig; /** * @Description: 文件上传 返回上传完成以后的文件路径 * @Author: Tan * @Date: 2020/3/31 * @param file: 上传文件对象 * @return: java.lang.String **/ public String uploadFile(MultipartFile file) throws IOException { //参1 文件输入流,参2 文件大小,参3 文件拓展名,参4 元数据集合 StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null); return storePath.getFullPath(); } /** * @Description: 上传图片并且创建缩略图 * @Author: Tan * @Date: 2020/3/31 * @param file: 图片文件对象 * @return: java.lang.String **/ public String uploadImageAndCreateThumbImage(MultipartFile file) throws IOException{ StorePath storePath = storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null); return storePath.getFullPath(); } /** * @Description: 根据文件名获取缩略图路径 * @Author: Tan * @Date: 2020/3/31 * @param filePath: 缩略图路径 * @return: java.lang.String **/ public String getThumbImagePath(String filePath) { return thumbImageConfig.getThumbImagePath(filePath); } /** * @Description: 根据文件路径进行下载 返回一个byte[]数组 包含文件内容 * @Author: Tan * @Date: 2020/3/31 * @param filePath: 下载文件路径 * @return: byte[] **/ public byte[] downFile(String filePath) throws IOException { StorePath storePath = StorePath.parseFromUrl(filePath); return storageClient.downloadFile(storePath.getGroup(), storePath.getPath(), new DownloadCallback<byte[]>() { @Override public byte[] recv(InputStream ins) throws IOException { return org.apache.commons.io.IOUtils.toByteArray(ins); } }); } /** * @Description: 根据文件路径 删除文件 * @Author: Tan * @Date: 2020/3/31 * @param filePath: 文件路径 * @return: void **/ public void deleteFile(String filePath) { StorePath storePath = StorePath.parseFromUrl(filePath); storageClient.deleteFile(storePath.getGroup(), storePath.getPath()); } }
@Controller public class FileUploadAndDownloadController { @Autowired private FileService fileService; @ResponseBody @PostMapping("/fileUpload") public String fileUpload(MultipartFile multipartFile) throws IOException { return "上传成功 文件地址为:"+ fileService.uploadFile(multipartFile); } @RequestMapping("/downloadFile") public void downloadFile(String filePath, HttpServletResponse response) throws IOException { response.setContentType("application/octet-stream"); response.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("中文名.jpg","utf-8")); byte[] bytes = fileService.downFile(filePath); response.getOutputStream().write(bytes); }
基本使用就是这些