java springboot 实现文件上传下载(文件服务器,文件统一处理,图片,word,pdf,视频,等)
java springboot 实现文件上传下载(文件服务器,文件统一处理,图片,word,pdf,视频,等)
1.数据库设计
CREATE TABLE `file_handle` (`id` varchar(64) NOT NULL,`file_name` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '文件上传名称',`file_save_name` varchar(128) DEFAULT NULL COMMENT '重命名文件名称UUID',`file_type` int DEFAULT NULL COMMENT '文件类型',`file_path` varchar(255) DEFAULT NULL COMMENT '文件地址',`file_size` float DEFAULT NULL COMMENT '文件大小',PRIMARY KEY (`id`)
)
2.文件预览资源配置(Spring MVC框架中用于配置静态资源处理,不安全可以直接访问静态资源不建议使用)
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class FileHandleConfig implements WebMvcConfigurer {@Value("${file.dir}")private String fileDir;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/fileDownload/**").addResourceLocations("file:" + fileDir);}
}
文件访问地址:http://服务器IP:端口/fileDownload/文件名称(文件名必须要唯一)
3.上传接口
@Value("${file.dir}")private String fileDir;@PostMapping(value = "/upload")// @TokenCheckerpublic String upload(MultipartFile file) throws IOException {String originalFileName = file.getOriginalFilename();if (StringUtils.isBlank(originalFileName)) {return Response.Fail(CommonErrorCode.DataNotFound);}String extension = originalFileName.substring(originalFileName.lastIndexOf("."));String newFileName = UUID.randomUUID().toString().replace("-","") + extension;String upload_file_dir=fileDir;//注意这里需要添加目录信息String destFileName = fileDir + newFileName;try {//第一次运行的时候,这个文件所在的目录往往是不存在的,这里需要创建一下目录(创建到了webapp下uploaded文件夹下)File upload_file_dir_file = new File(upload_file_dir);File targetFile = new File(upload_file_dir_file, newFileName);file.transferTo(targetFile);FileHandle fileHandle = new FileHandle();fileHandle.setId(IdUtils.getSnowflakeId(SnowflakeConstant.SYSTEM_MANAGEMENT_ID));fileHandle.setFileName(originalFileName);fileHandle.setFilePath(destFileName);fileHandle.setFileSaveName(newFileName);fileHandle.setCreateTime(new Date());fileHandle.setFileType(1);fileHandle.setDeleted(0);fileHandle.setFileSize(BigDecimal.valueOf(file.getSize() / (1024.0 * 1024.0)).setScale(2, RoundingMode.HALF_UP));fileHandleService.save(fileHandle);if (!upload_file_dir_file.exists()){upload_file_dir_file.mkdirs();}}catch (Exception e){e.printStackTrace();}return Response.OK();}
4.通过文件ID下载文件(原理也是通过接口下载,这里采取的是文件ID,可以自定义字段下载如文件名称,只要该字段唯一就可以)
@Value("${file.dir}")private String fileDir;@GetMapping("/download/{fileId}")public void download(@PathVariable String fileId, HttpServletResponse response) throws IOException {FileHandle fileHandle = fileHandleService.getById(fileId);if (fileHandle==null) {return;}File file = new File(fileDir+fileHandle.getFileSaveName());if (!file.exists()) {return;}String fileName = fileHandle.getFileName();response.setHeader("Content-Disposition", "attachment;filename=" + URLDecoder.decode(fileName, "UTF-8"));response.setContentType("application/octet-stream");// 创建输出流OutputStream outputStream = response.getOutputStream();// 读取文件并写入输出流FileInputStream inputStream = new FileInputStream(file);byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer)) > 0) {outputStream.write(buffer, 0, len);}// 关闭输出流outputStream.flush();outputStream.close();inputStream.close();}