【Java】文件上传及下载、限制文件大小

1、后端部分

      Controller代码

    // 上传
    @PostMapping("upload")
    @ResponseBody
    public Result upload(MultipartFile files, Integer id, String type){
        fileService.upload(files, id, type);
        return success().setRet(0);
    }

    // 下载
    @GetMapping("download")
    @ResponseBody
    public void download(HttpServletResponse response, Integer id){
        fileService.download(response, id);
    }

      Service代码

    @Value("${fileServer.storeDir}")
    private String storeDir;

    @Autowired
    private FileMapper fileMapper;

    @Override
    public void upload(MultipartFile file, Integer id, String type) {
        logger.info("文件关联id:{}, 文件名:{}", id, file.getOriginalFilename());
        logger.info("文件后缀名:{}", file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")));
        if(!file.isEmpty()){
            String dir = getStoreDir();

            File tempFile = new File(dir + System.currentTimeMillis() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")));
            try {
                file.transferTo(tempFile);

                FileInfo fileInfo = new FileInfo()
                        .setName(file.getOriginalFilename())
                        .setPath(tempFile.getAbsolutePath())
                        .setSize(tempFile.length())
                        .setTarget(id)
                        .setCreateDate(new Date())
                        .setMd5(FileUtil.md5(tempFile))
                        .setType(type);
                fileMapper.insert(fileInfo);

            } catch (IOException e) {
                logger.error(e.getMessage(), e);
                throw new InternalServerException("file build error");
            }
        }
    }


    @Override
    public void download(HttpServletResponse response, Integer id) {
        FileInfo fileInfo = fileMapper.findFileById(id);
        logger.info("下载文件名:{}", fileInfo.getName());
        File file = new File(fileInfo.getPath());

        if (!FileUtil.isExistingFile(file)) {
            throw new ResourceNotFoundException("file not found");
        }
        try (OutputStream outputStream = response.getOutputStream();
             InputStream inputStream = new FileInputStream(file)) {

            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileInfo.getName(), "UTF-8"));

            FileCopyUtils.copy(inputStream, outputStream);

        } catch (IOException e) {
            logger.error("下载文件失败!",e);
            throw new RemoteServiceUnavailableException("file download error");
        }
    }

    private String getStoreDir(){
        String dir = storeDir + File.separator ;
//        String dir = storeDir + File.separator + System.currentTimeMillis() + File.separator;
        try {
            FileUtil.mkdir(dir);
        } catch (IOException e) {
            logger.error("获取存储目录失败!",e);
            throw new InternalServerException("file build error");
        }
        return dir;
    }

    private void delFile(String path){
        try {
            FileUtil.delete(path);
        } catch (IOException e) {
            logger.error("删除文件失败!",e);
            throw new InternalServerException("file delete error");
        }

    }

      在application.yml配置文件中设置文件存储路径(这里假设是本地的E:\ptms中)、以及限制上传文件大小(这里设置为40M)。

# 应用名称
spring:
  application:
    name: ptms
  resources:
    static-locations: classpath:/static
    cache:
      period: PT1M        # 60 SECONDS
  servlet:
    multipart:
      max-file-size: 40Mb
      max-request-size: 40Mb

fileServer:
  storeDir: E:\ptms

2、前端部分

      前端代码如下,只看核心的上传下载即可。上传的控件采用element的el-upload控件,下载采用的是window.location.href。同时,在表单验证完之后,提交表单之前,还做了文件大小的校验,采用的是遍历this.$refs.upload.uploadFiles。






3、最终效果如下

【Java】文件上传及下载、限制文件大小_第1张图片

【Java】文件上传及下载、限制文件大小_第2张图片

【Java】文件上传及下载、限制文件大小_第3张图片

 

你可能感兴趣的:(Java,点滴记录,Vue)