当前位置: 首页 > news >正文

Spring Boot 3 文件管理:上传、下载、预览、查询与删除(全网最全面教程)

      在现代Web应用中,文件管理是一个非常重要的功能。Spring Boot作为Java开发领域的热门框架,提供了丰富的工具和API来简化文件管理的操作。本文将详细介绍如何使用Spring Boot 3进行文件的上传、下载、预览、查询与删除操作,并提供一个完整的示例代码。

文件预览支持多格式!!!(文档/图片/视频/音频.....)

 废话不多说,直接开撸。

                                                                  

1.pom.xml 和 yml

        <!--File 文件Util--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.20</version></dependency><!--StringUtils--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency>
# 自定义信息
customInfo:# 获取文件存放信息路径file:storagePath: "/static/file/"

2.Util 工具类

public class ToolUtil {/*** 判断权限是否存在*/public static Boolean bollPurviewTool(String[] list, String str){String[] list2 = str.split(",");for (String item:list) {for (String item2:list2) {if (item.equals(item2)){return true;}}}return false;}/*** 获取当前系统路径的上一级*/public static String currentParentPath(){String currentDirectory = System.getProperty("user.dir");File file = new File(currentDirectory);String parentDirectory = file.getParent();return  parentDirectory;}}

3.FileController

备注:@RateLimit  @VerifySign 注解是我的自定义注解你可以删除, 

         JwtRedistService  是我的权限判定方法,你可以删除

         JwtInfo  是我的token令牌涉及相关方法 ,这些方法你都可以去掉

import com.portalwebsiteservice.demos.web.Dto.JwtInfo;
import com.portalwebsiteservice.demos.web.Dto.Result;
import com.portalwebsiteservice.demos.web.Enum.PurviewEnum;
import com.portalwebsiteservice.demos.web.Enum.ResultEnum;
import com.portalwebsiteservice.demos.web.Service.FileService;
import com.portalwebsiteservice.demos.web.Service.JwtRedistService;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;import static com.portalwebsiteservice.demos.web.Util.ToolUtil.bollPurviewTool;/*** 文件管理*/
@RestController
@RequestMapping("/file")
public class FileController {@Resourceprivate FileService fileService;@Resourceprivate JwtRedistService jwtRedistService;/*** 文件上传*/@PostMapping("/upload")public Result uploadFile(@RequestParam("file") MultipartFile file) {Result result = new Result();if (file==null) {result.setCode(400);result.setMsg("至少选择一个文件上传!");return result;}else {return fileService.uploadFileService(file);}}/*** 文件下载*/@RateLimit@GetMapping("/download/{id}")public ResponseEntity<FileSystemResource> downloadFile(@PathVariable String id,@RequestHeader("Authorization") String token) {JwtInfo jwtInfo = jwtRedistService.getUserInfo(token);return fileService.downloadFileService(jwtInfo,id);}/*** 文件预览*/@RateLimit@GetMapping("/visit/{path}")public void downloadFile(@PathVariable String path, HttpServletResponse response) {fileService.viewFile(path,response);}/*** 文件查询 (管理端)*/@RateLimit@VerifySign@GetMapping("/queryAll")public Result queryFileAll(@RequestParam Integer page,@RequestParam Integer limit, @RequestParam(required = false) String keyword, @RequestHeader("Authorization") String token){Result result = new Result();try {JwtInfo jwtInfo = jwtRedistService.getUserInfo(token);//需要超级管理员if (bollPurviewTool(jwtInfo.getPurview(), PurviewEnum.ADMINISTRATOR.getValue())){return fileService.queryAllFileService(jwtInfo,keyword,page,limit);}else {result.setCode(ResultEnum.ADMIN.getCode());result.setMsg(ResultEnum.ADMIN.getData());}}catch (Exception e){result.setCode(ResultEnum.UNKNOWNERROR.getCode());result.setMsg(ResultEnum.FORBIDDEN.getData());result.setData(e.getCause());}return result;}/*** 文件查询 (服务端)*/@RateLimit@GetMapping("/query")public Result queryFile(@RequestParam String id, @RequestHeader("Authorization") String token){Result result = new Result();try {JwtInfo jwtInfo = jwtRedistService.getUserInfo(token);return fileService.queryFileService(jwtInfo,id);}catch (Exception e){result.setCode(ResultEnum.UNKNOWNERROR.getCode());result.setMsg(ResultEnum.FORBIDDEN.getData());result.setData(e.getCause());}return result;}/*** 文件删除*/@VerifySign@RateLimit(limit = 5)@PostMapping("/delete")public Result deleteFile(List<String> ids ,@RequestHeader("Authorization") String token) {Result result = new Result();try {JwtInfo jwtInfo = jwtRedistService.getUserInfo(token);return fileService.deleteFileService(jwtInfo,ids);}catch (Exception e){result.setCode(ResultEnum.UNKNOWNERROR.getCode());result.setMsg(ResultEnum.FORBIDDEN.getData());result.setData(e.getCause());}return result;}
}

 4.Entity 实体Dao

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.util.Date;@Data
@TableName(value = "sys_file",autoResultMap = true)
public class File {/*** id*/private String id;/*** 文件名称*/private String name;/*** 文件路径*/private String path;/*** 文件类型*/private String type;/*** 文件大小*/private String size;/*** 文件访问权限*/private String purview;/*** 创建时间*/private Date createTime;/*** 更新时间*/private Date updateTime;}
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.portalwebsiteservice.demos.web.Entity.File;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface FileDao extends BaseMapper<File> {
}

5.FileServiceImpl 和 FileService 业务操作

   备注:PurviewEnum 是我定义权限的封装枚举类,涉及该方法是你可以直接删除


import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.portalwebsiteservice.demos.web.Dao.FileDao;
import com.portalwebsiteservice.demos.web.Dto.JwtInfo;
import com.portalwebsiteservice.demos.web.Dto.Result;
import com.portalwebsiteservice.demos.web.Entity.File;
import com.portalwebsiteservice.demos.web.Enum.PurviewEnum;
import com.portalwebsiteservice.demos.web.Service.FileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;import static com.portalwebsiteservice.demos.web.Util.ToolUtil.bollPurviewTool;
import static com.portalwebsiteservice.demos.web.Util.ToolUtil.currentParentPath;@Service
public class FileServiceImpl implements FileService {@Autowiredprivate FileDao fileDao;@Value("${customInfo.file.storagePath}")private String storagePath;/*** 文件上传*/@Overridepublic Result uploadFileService(MultipartFile file) {Result result = new Result();File fileMap = new File();String currentPath = currentParentPath();//创建时间fileMap.setCreateTime(new Date());fileMap.setUpdateTime(new Date());fileMap.setPurview(PurviewEnum.ORDINARY.getValue());//用户IDString uId = UUID.randomUUID().toString().replace("-","");fileMap.setId(uId);//文件nameString fileName = file.getOriginalFilename();fileMap.setName(fileName);//文件大小String fileSize = String.valueOf(file.getSize());fileMap.setSize(fileSize);//文件类型String fileType = null;if (fileName != null) {fileType = fileName.substring(fileName.lastIndexOf(".")+1);}fileMap.setType(fileType);//文件pathString filePathName = uId + "." + fileType;fileMap.setPath(filePathName);//拼接文件存放地址java.io.File dest=new java.io.File(currentPath+storagePath + filePathName);//判断文件路径是否存在  如果不存在就创建文件路径if (dest.getParentFile().exists()) dest.getParentFile().mkdirs();//文件保存try {FileUtil.writeBytes(file.getBytes(), currentPath+storagePath + filePathName);fileDao.insert(fileMap);result.setData(fileMap);result.setMsg("上传成功");} catch (IOException e) {e.fillInStackTrace();result.setData(e);}return result;}/*** 文件下载*/@Overridepublic ResponseEntity<FileSystemResource>  downloadFileService(JwtInfo jwtInfo, String id) {LambdaQueryWrapper<File> lqw = new LambdaQueryWrapper<>();lqw.eq(File::getId,id);if (jwtInfo.getPass()) {String[] purviewList = jwtInfo.getPurview();lqw.in(File::getPurview, Arrays.asList(purviewList));} else {lqw.eq(File::getPurview, PurviewEnum.ORDINARY.getValue());}File fileMap = fileDao.selectOne(lqw);//设置文件完整路径String currentPath = currentParentPath();// 设置响应头HttpHeaders headers = new HttpHeaders();if (fileMap!=null && jwtInfo.getPass()){headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename="+fileMap.getPath());try {// 加载文件作为资源java.io.File file = new java.io.File(currentPath+fileMap.getPath());FileSystemResource resource = new FileSystemResource(file);// 返回文件内容return ResponseEntity.ok().headers(headers).contentLength(file.length()).contentType(MediaType.parseMediaType("application/octet-stream")).body(resource);}catch (Exception e){return ResponseEntity.ok().headers(headers).contentLength(0).contentType(MediaType.parseMediaType("application/octet-stream")).body(null);}}else {return ResponseEntity.ok().headers(headers).contentLength(0).contentType(MediaType.parseMediaType("application/octet-stream")).body(null);}}/*** 文件预览*/@Overridepublic void viewFile(String path, HttpServletResponse response){String currentPath = currentParentPath() + storagePath + path;if (!currentPath.equals(currentParentPath())) {try (ServletOutputStream os = response.getOutputStream()) {Path filePath = Paths.get(currentPath);byte[] b = Files.readAllBytes(filePath);os.write(b);} catch (IOException e) {e.fillInStackTrace();}}}/*** 文件查询(管理端)*/@Overridepublic Result queryAllFileService(JwtInfo jwtInfo, String keyword, Integer page, Integer limit) {Result result = new Result();try {if (jwtInfo.getPass()){if (bollPurviewTool(jwtInfo.getPurview(), PurviewEnum.ADMINISTRATOR.getValue())){if (keyword!=null && !keyword.isEmpty()){LambdaQueryWrapper<File> lqw = new LambdaQueryWrapper<>();lqw.like(File::getId, keyword).or().like(File::getName, keyword).or().like(File::getType, keyword).or().like(File::getPath, keyword);Page<File> pages = new Page<>(page, limit);IPage<File> iPage = fileDao.selectPage(pages,lqw);result.setMsg("模糊查询成功!");result.setData(iPage);}else {Page<File> pages = new Page<>(page, limit);IPage<File> iPage = fileDao.selectPage(pages,null);result.setMsg("文件信息查询成功!");result.setData(iPage);}}else {result.setMsg("暂无操作权限!");result.setCode(400);}}else {result.setMsg("token令牌过期!");result.setCode(400);}}catch (Exception e){result.setData(e.getCause());result.setMsg("程序报错!");result.setCode(500);}return result;}/*** 文件查询(服务端)*/@Overridepublic Result queryFileService(JwtInfo jwtInfo, String id) {Result result = new Result();try {LambdaQueryWrapper<File> lqw = new LambdaQueryWrapper<>();lqw.eq(File::getId,id);if (jwtInfo.getPass()) {String[] purviewList = jwtInfo.getPurview();lqw.in(File::getPurview, Arrays.asList(purviewList));} else {lqw.eq(File::getPurview, PurviewEnum.ORDINARY.getValue());}File file = fileDao.selectOne(lqw);result.setMsg("文件信息查询成功!");result.setData(file);}catch (Exception e){result.setData(e.getCause());result.setMsg("程序报错!");result.setCode(500);}return result;}/*** 文件删除*/@Overridepublic Result deleteFileService(JwtInfo jwtInfo, List<String> ids) {Result result = new Result();if (jwtInfo.getPass()){int res = fileDao.deleteBatchIds(ids);if (res > 0){result.setMsg("文件删除成功!");}else {result.setMsg("文件删除失败!");result.setCode(400);}}else {result.setMsg("token令牌过期!");result.setCode(400);}return result;}}

以上就是完整代码!!有代码问题可以咨询小编。

 代码开发不易,全开源,感谢支持!

再次感谢每一位关注、使用、贡献和支持本项目的朋友!


http://www.mrgr.cn/news/48908.html

相关文章:

  • R语言绘制线性回归图
  • 手写mybatis之解析和使用ResultMap映射参数配置
  • 架构师之路-学渣到学霸历程-11
  • 鸿蒙跨设备协同开发02——RichEditor跨设备获取文件
  • 八大排序--08快速排序
  • 34. 在排序数组中查找元素的第一个和最后一个位置
  • 【网易云音乐】--源代码分享
  • 太阳能电池特性及其应用
  • 24/10/12 算法笔记 NiN
  • Windows环境NodeJS下载配置安装运行
  • 进程与线程
  • 第3关:寻找两个等长有序序列的中位数
  • Linux内核 -- 编译之 Kconfig 字段解析
  • 【功能安全】什么是Aspice?
  • 【C++ 真题】B2078 含 k 个 3 的数
  • Apache Kafka基础认知-Part1
  • Python网络爬虫快速入门指南
  • 【hot100-java】K 个一组翻转链表
  • 字符串拼接方法性能对比和分析
  • 顺序栈与链队列