SpringBoot实现文件上传和下载的功能

 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='文件信息记录表';

 SpringBoot实现文件上传和下载的功能_第1张图片

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访问测试

上传测试:

SpringBoot实现文件上传和下载的功能_第2张图片

数据库查看:

下载测试:

SpringBoot实现文件上传和下载的功能_第3张图片

 SpringBoot实现文件上传和下载的功能_第4张图片

你可能感兴趣的:(java,spring,spring,boot,mybatis,maven)