文件上传和下载

环境

  • **SpringBoot: ** 2.5.14

  • **Vue3: ** ^3.2.47

  • **element-plus: ** ^2.3.4,

  • **axios: **^1.4.0,

代码

后端

@PostMapping("/upload")
    public R uploadFile(@RequestParam(value = "file") MultipartFile[] files,
                        @Value("${file.server.resource-location}") String filePath) {
        // 这里允许上传多个文件
        for (MultipartFile file: files) {
            // 首先判断文件是否存在
            if (file == null || file.isEmpty()) {
                continue;
            }
            try {
                // 本地文件保存位置
                File uploadDir = new File(filePath);
                if (!uploadDir.exists()) {
                    uploadDir.mkdir();
                }
                log.info(uploadDir.getAbsolutePath());
                String fileName = file.getOriginalFilename();
                if (fileName != null) {
                    // uuid 文件名工具类方法
                    String uniqueFileName = ProposalUtil.getUniqueFileID(fileName);
                    String fileFullPath = uploadDir.getAbsolutePath() + File.separator + uniqueFileName;
                    File localFile = new File(fileFullPath);
                    // transfer to local
                    file.transferTo(localFile);
                   
                }
            } catch (Exception e) {
                log.error("文件上传失败:" + file.getOriginalFilename());
            }
        }
        // R为后端返回值封装类
        return R.ok();
    }

    @GetMapping("/download")
    public void downloadFile(@RequestParam(value = "file") String fileName,
                             @Value("${file.server.resource-location}") String filePath,
                             HttpServletResponse response) throws IOException {
        response.reset();
        response.setContentType("application/octet-stream");
        String encoded = URLEncoder.encode(fileName, "UTF-8");
        // 解决中文文件名乱码问题,必须要对文件名进行utf-8编码
        response.setHeader("Content-disposition",
                "attachment;filename=" + encoded + ";filename*=UTF-8" + encoded);
        // 这里使用原生response会失去Springboot的config,需要手动配置一下跨域
        response.setHeader("Access-Control-Allow-Origin", "*");
        // 从文件读到servlet response输出流中

        File fileDir = new File(filePath);
        // 默认文件名是带扩展名的!!!
        File file = new File(fileDir.getAbsoluteFile() + File.separator + fileName);
        try (FileInputStream inputStream = new FileInputStream(file)) {
            byte[] b = new byte[1024];
            int len;
            while ((len = inputStream.read(b)) > 0) {
                response.getOutputStream().write(b, 0, len);
            }
            log.info("File downloaded successfully: " + fileDir.getAbsoluteFile() + File.separator + fileName );
        } catch (IOException e) {
            if (e instanceof FileNotFoundException) {
                // 设置返回值为500
                response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                log.error("File not found: " + fileDir.getAbsoluteFile() + File.separator + fileName );
            }
        }
    }

前端

部分样式可能不合理可以自行调正

上传

下载

最后更新于

这有帮助吗?