文件上传和下载

文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。

文件上传:

上传逻辑:

1). 获取文件的原始文件名, 通过原始文件名获取文件后缀

2). 通过UUID重新声明文件名, 文件名称重复造成文件覆盖

3). 创建文件存放目录

4). 将上传的临时文件转存到指定位置

编写文件上传的方法, 通过MultipartFile类型的参数即可接收上传的文件, 方法形参的名称需要与页面的file域的name属性一致。


//进行文件的上传和下载
@RestController
@Slf4j
@RequestMapping("/common")
public class CommonController {
//   从yml获取数据
     @Value("${reggie.path}")
     private String basePath;
//    spring框架封装一个参数
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws IOException {
        //        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(basePath);
//        判断目录是否存在
        if(!dir.exists()){
//            目录不存在,需要创建
            dir.mkdir();
        }

//将临时文件转存到指定位置
        file.transferTo(new File(basePath+fileName));
        return R.success(fileName);
    }

文件下载:

在 CommonController 中定义方法download,并接收页面传递的参数name,然后读取图片文件的数据,然后以流的形式写回浏览器。

具体逻辑如下:

1). 定义输入流,通过输入流读取文件内容

2). 通过response对象,获取到输出流

3). 通过response对象设置响应数据格式(image/jpeg)

4). 通过输入流读取文件数据,然后通过上述的输出流写回浏览器

5). 关闭资源

/文件下载
//通过输出流向页面返回数据 不需要返回值
// 通过流写二进制数据
//  输出流需要response获得
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {
//输入流,通过输入流读取文本内容
        FileInputStream fileInputStream=new FileInputStream(new File(basePath+name));
        //输出流,通过输出流将文件写回浏览器,在浏览器展示图片
        ServletOutputStream outputStream=response.getOutputStream();

//        设置格式
        response.setContentType("image/jpeg");

        int len=0;
        byte[] bytes=new byte[1024];
//        -1表示没有结束
        while ((len=fileInputStream.read(bytes))!=-1){
           outputStream.write(bytes,0,len);
//            刷新
            outputStream.flush();

//            关闭资源
            outputStream.close();
            fileInputStream.close();

        }

    }

通过yml设置图片存放地址,在application.yml中定义文件存储路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值