springboot实现文件上传下载功能

SpringBoot实现文件上传下载功能

开发环境

- SpringBoot 2.2.1.RELEASE
- web依赖
   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

配置参数介绍

#启用文件上传,默认为true
- spring.servlet.multipart.enabled=true
#文件大于该阈值时,将写入磁盘(KB/MB)
- spring.servlet.multipart.file-size-threshold=0KB
#单个文件最大值(KB/MB)
- spring.servlet.multipart.max-file-size=10MB
#单个请求多个文件的最大值(KB/MB)
- spring.servlet.multipart.max-request-size=10MB

文件上传

前端(单个文件上传)
- pom文件导入tymeleaf
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
- 配置tymeleaf
	spring.thymeleaf.mode=HTML
	spring.thymeleaf.encoding=UTF-8
	spring.thymeleaf.cache=false
  • 文件上传
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>thymeleaf test</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data"
          action="/upload" target="uploadFrame">
        <input type="file" name="file"/>
        <input type="submit" name="Submit" value="上传"/>
    </form>
</body>
</html>
后端接口以及功能实现(单个文件上传)
  • Controller接口
	@Autowired
    private FileManageService fileManageService;

    @PostMapping("/upload")
    @ResponseBody
    public String fileUpload(@RequestParam("file") MultipartFile file){
        if (Objects.isNull(file)){
            return "文件上传失败,请重新选择文件";
        }
        return fileManageService.upload(file);
    }
  • service实现
private static final Logger LOGGER = LoggerFactory.getLogger(FileManageService.class);

    @Value("${file_hostpath}")
    private String fileHostPath;

    @Override
    public String upload(MultipartFile file) {
        File test = new File(fileHostPath+file.getOriginalFilename());
        if (!test.exists()){
            test.mkdirs();
        }
        try {
            file.transferTo(test);
        }catch (IOException e){
            LOGGER.error(file.getOriginalFilename()+"文件上传失败", e);
        }
        return "文件上传成功";
    }

文件下载

  • Controller接口
@GetMapping("/download")
    @ResponseBody
    public String fileDownload(@RequestParam("fileName") String fileName, HttpServletResponse response){
        if (Objects.isNull(fileName)){
            return "文件下载失败,请选择文件要下载的文件";
        }
        return fileManageService.download(fileName, response);
    }
  • service实现
public String download(String fileName, HttpServletResponse response){
        File file = new File(fileHostPath + fileName);
        if (!file.exists()){
            return "文件不存在";
        }
        byte[] bytes = new byte[SIZE];
        BufferedInputStream bufferedInputStream = null;
        OutputStream outputStream = null;
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(file);
            bufferedInputStream = new BufferedInputStream(fileInputStream);

            response.setContentType(MediaType.APPLICATION_OCTET_STREAM.toString());
            response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
            outputStream = response.getOutputStream();
            int length;
            while ((length = bufferedInputStream.read(bytes)) != -1){
                outputStream.write(bytes, 0, length);
            }
            outputStream.flush();
        }catch (Exception e){
            LOGGER.error("文件下载失败", e);
        }finally {
            try {
                if (bufferedInputStream != null){
                    bufferedInputStream.close();
                }

                if (outputStream != null){
                    outputStream.close();
                }

                if (fileInputStream != null){
                    fileInputStream.close();
                }
            }catch (IOException e){
                LOGGER.error(e.getMessage(), e);
            }
        }
        return "success";
    }
  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值