Springboot上传和下载文件

文件上传与下载实现详解
本文介绍了如何使用multipart格式进行文件上传,通过Spring框架简化服务端处理,以及如何实现文件下载,涉及到文件的存储、流处理和HTTP响应的设置。

一、上传文件

1.采用multipart格式上传文件
举例:
<form method="post" action="/common/upload" enctype="multipart/form-data">
<input name="myFile" type="file" />
<input type="submit" value="提交" />
</form>
2.服务端接收上传的文件通常会用到Apache的两个组件

  • commons-fileupload
  • commons-io
    Spring框架在spring-web包中对文件上传进行了封装,大大的简化了服务端代码,我们只需要在Controller的方法中声明一个MultipartFile类型的参数即可接受上传的文件。
    代码如下:
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
	//在application.yml配置文件中读取路径
    @Value("${reggie_filePath.path}")
    private String filePath;
    @PostMapping("/upload")//文件上传,参数名必须与前端的name属性一直
    public R<String> upload(MultipartFile file){
        //file是一个临时文件,需要转存到指定位置
//        log.info(file.toString());
        //原始文件名
        String originalFilename = file.getOriginalFilename();
        //截取后缀名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //使用UUID重新生成文件名,防止文件名重复发生文件覆盖
        String fileName = UUID.randomUUID().toString() + suffix;
        //创建一个目录对象
        File dir = new File(filePath);
        //判断目录是否存在
        if (!dir.exists()) {
            //不存在创建目录
            dir.mkdirs();
        }
        try {
            //将临时文件转存到指定位置
            file.transferTo(new File(filePath+fileName));
        }catch (IOException e){
            e.printStackTrace();
        }
        return R.success(fileName);
    }
}

二、文件下载

通过浏览器进行文件下载,本质上就是通过流的形式写回浏览器的过程,代码如下:

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
	//在application.yml配置文件中读取路径
    @Value("${reggie_filePath.path}")
    private String filePath;
    //文件下载
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {
        try {
            //通过输入流读取文件内容
            FileInputStream fis = new FileInputStream(filePath+name);
            //通过输出流将文件内容写入到浏览器
            ServletOutputStream outputStream = response.getOutputStream();
            //设置响应的数据类型
            response.setContentType("image/jpeg");
            int len=0;
            byte[] bytes = new byte[1024];
            while ((len=fis.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }
            //关闭资源
            outputStream.close();
            fis.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝朽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值