1.设计数据库
为了防止上传下载文件的时候出现文件重复的问题,考虑用uuid重新生成文件名
CREATE TABLE `record_files` (
`file_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '文件id',
`file_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文件名',
`file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '文件路径',
`server_storage_path` varchar(255) DEFAULT NULL COMMENT '服务器路径',
`create_time` datetime DEFAULT NULL COMMENT '文件创建时间',
`create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '文件更新时间',
`update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新人',
`new_file_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'uuid',
PRIMARY KEY (`file_id`) USING BTREE,
KEY `file_name` (`file_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文件信息记录表';

1.1编写uuid工具类,或者直接用
public class UUIDUtils {
//获取32位uuid
public static String getUUID()
{
return UUID.randomUUID().toString().replace("-", "");
}
/*public static void main(String[] args) {
System.out.println(getUUID()); //19cd115270e648feb88f59785998d1f3
}*/
}
2.编写Controller层
/**
* 上传文件并记录文件信息
* @yc
* @param file 上传文件
* @param recordFiles
* @return
* @throws IOException
*/
@ApiOperation("上传文件并记录文件信息")
@PreAuthorize("@ss.hasPermi('axa:files:add')")
@Log(title = "文件信息记录", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestPart("file") MultipartFile file, RecordFiles recordFiles) throws IOException {
if (file.isEmpty()) {
System.out.println("所上传文件为空");
}
//1. 导入文上传到指定的文件:根据日期生成目录
//1.1 判断如果是正斜杠改成反斜杠
String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String dateDirPath= "D:" + filePath + dateFormat;
File dateDir=new File(dateDirPath);
if(!dateDir.exists()){
dateDir.mkdirs();
}
String NewFileName = UUIDUtils.getUUID();
//1.2 获取后缀,加上后缀提供服务器端访问图片
String fileName = file.getOriginalFilename();
String suffix = null;
if (fileName != null && fileName.length() > 0){
suffix = fileName.substring(fileName.lastIndexOf("."));
}
StringBuilder stringBuilder = new StringBuilder(NewFileName);
String uploadfilepathname = stringBuilder.append(suffix).toString();
//1.3 文件上传到服务器,文件命名为:uuid+后缀名suffix
file.transferTo(new File(dateDir,uploadfilepathname));
//2. 设置到数据库
recordFiles.setFilePath(dateDirPath);
recordFiles.setCreateBy(getUsername());
recordFiles.setFileName(fileName);
recordFiles.setNewFileName(NewFileName);
recordFiles.setCreateTime(DateUtils.getNowDate());
recordFiles.setServerStoragePath(filePath);
return toAjax(recordFilesService.insertRecordFiles(recordFiles));
}
/**
* 下载文件
* @param id
* @param response
* @throws Exception
*/
@ApiOperation("下载文件")
@PreAuthorize("@ss.hasPermi('axa:files:download:resource')")
@GetMapping("/download/resource")
public void resourceDownload(Long id, HttpServletResponse response) throws Exception {
FileInputStream is = null;
ServletOutputStream os = null;
try {
//获取upload文件夹的 路径和UUID
RecordFiles recordFiles = recordFilesService.selectRecordFilesByFileId(id);
//通过流读取文件
String newFileName = recordFiles.getNewFileName();
String fileName = recordFiles.getFileName();
String suffix = null;
if (fileName != null && fileName.length() > 0){
suffix = fileName.substring(fileName.lastIndexOf("."));
}
StringBuilder stringBuilder = new StringBuilder(newFileName);
String DownLoadFilePath = stringBuilder.append(suffix).toString();
is = new FileInputStream(new File(recordFiles.getFilePath(),DownLoadFilePath));
//获得响应流
os = response.getOutputStream();
//设置响应头信息
response.setHeader("content-disposition", "attachment;fileName=" + URLEncoder.encode(recordFiles.getFileName(), "UTF-8"));
//通过响应流将文件输入流读取到的文件写出
IOUtils.copy(is, os);
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}
}
3.编写service,dao,mapper,xml
此处省略。。。。。。
4.在Swagger访问测试
上传测试:

数据库查看:

下载测试:

