網站首頁 編程語言 正文
?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訪問測試
上傳測試:
數據庫查看:
下載測試:
?
原文鏈接:https://blog.csdn.net/m0_52767002/article/details/125742852
相關推薦
- 2023-06-17 C或C++報錯:ld?returned?1?exit?status報錯的原因及解決方法_C 語言
- 2022-05-15 C++設計模式中的觀察者模式一起來看看_C 語言
- 2022-10-24 Golang設計模式工廠模式實戰寫法示例詳解_Golang
- 2022-09-25 python mac版本解釋器安裝
- 2022-12-13 Android?DataBinding單向數據綁定深入探究_Android
- 2022-07-23 C++超詳細講解稀疏矩陣_C 語言
- 2022-05-02 C/C++的各種字符串函數你知道幾個_C 語言
- 2022-08-02 linux?shell文件轉碼iconv命令的使用_linux shell
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支