日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

SpringBoot實現文件上傳和下載的功能

作者:響叮當! 更新時間: 2022-07-16 編程語言

?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

欄目分類
最近更新