[java后端研发]——文件上传与下载(2种方式)

🌈键盘敲烂,年薪30万🌈

目录

一、本地存储:

二、云存储(阿里云OSS):

📕总结


前言:

文件上传在后端开发中经常用到,例如显示一张图片,就需要我们后端保存图片文件,然后将图片文件回显给浏览器。

  • 对于图片文件来说就俩个步骤:
  1. 接收上传的图片保存起来 ->本地 或 云服务器

  2. 回显图片给浏览器 -> 返回本地文件路径 或 云服务器的文件路径

  • 服务器处理图片的两种方式:

①保存在服务器本地的磁盘中

②交给云服务器存储,例如阿里云OSS

  • 注意:

每次请求时,服务器会将文件临时保存在一个地方,请求结束时,临时文件会被删除,所以才要把上传的文件下载到本地或云端。

  • 认识MultipartFile类:

spring框架封装好了用于前后端传输文件的类 -> MultipartFile,前端页面必须有一个type为MultipartFile的From表单,当前端发送请求到后端时,我们后端只需用一个MultipartFile类的对象就可以接收这个文件参数。下面就说一下两种文件存储方式。

一、本地存储:

①文件上传到本地:

注意:

保存的路径可以在配置文件里设置

保存的文件名要用UUID生成,防止文件覆盖

java 复制代码
    //保存到本地
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws Exception {
        //要保存的路径
        String basePath = "D:\\image";
        //file是一个临时文件,当请求结束时,临时文件会删除
        // 先判断转存路径的文件夹有没有
        File dir = new File(basePath);
        if(!dir.exists()){
            dir.mkdirs();
        }

        //这里有两个地方要改
        //1.文件路径要写在配置文件里面
        //2.文件名要用UUID生成
        // 获取源文件名 xxxx.jpg
        String originalFilename = file.getOriginalFilename();
        // 获取后缀 .jpg
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 使用UUID重新生成文件名
        String fileName = UUID.randomUUID().toString() + suffix;
        file.transferTo(new File(basePath + fileName));

        return R.success(fileName);
    }

②文件下载到浏览器:

注意:

用输出流从服务器本地向浏览器输出数据

java 复制代码
        //文件下载到浏览器
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {
        //从服务器读取文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basePath + name));
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());

        response.setContentType("image/jpeg");

        int len = 0;
        byte[] bytes = new byte[1204];
        while( (len = bis.read(bytes)) != -1 ){
            bos.write(bytes, 0, len);
            bos.flush();
        }
        bos.close();
        bis.close();

    }

二、云存储(阿里云OSS):

①文件上传到阿里云:

注意:

需要导入阿里OSS的相关包,使用putObject方法以流的方式写道云服务器。

java 复制代码
    public String upload(MultipartFile file) throws IOException, ClientException {

        String endpoint = propertiesUtils.getEndpoint();
        String bucketName = propertiesUtils.getBucketName();

        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider=CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

②将阿里云的图片路径返回给数据库:

存储到阿里云中的图片直接赋值路径从浏览器就能打开,所以直接在数据库中创建一个字段存储图片的url即可回显图片。

📕总结

  • 本地存储不安全,数据一旦丢失,维护成本高。通过transerForTo方法转存到本地服务器。
  • 云存储通过阿里OSS工具类提供的putObject方法,将文件保存到阿里云OSS服务器。
相关推荐
@CLoudbays_Martin1112 分钟前
CDN是否能有效检测并且同时防御Ddos 和 CC 攻击?
java·服务器·网络·数据库·git·数据库开发·时序数据库
Bellafu66624 分钟前
项目中遇到pom文件里使用systemPath的例子记录
开发语言
爱喝水的鱼丶34 分钟前
SAP-MM:SAP采购组织全面学习指南:从概念到实战配置图解
运维·开发语言·数据库·学习·sap·mm模块·采购组织
楼田莉子39 分钟前
Python学习——字典和文件
开发语言·python·学习·pycharm
知彼解己1 小时前
字符串大数相加:从初稿到优化的思路演进
java·开发语言·算法
好多171 小时前
《JVM如何排查OOM》
开发语言·jvm·python
学计算机的1 小时前
Python:OpenCV 教程
开发语言·python
计算机毕业设计指导1 小时前
基于Spring Boot + Vue 3的社区养老系统设计与实现
vue.js·spring boot·后端
拾忆,想起1 小时前
Redisson 分布式锁的实现原理
java·开发语言·分布式·后端·性能优化·wpf
焰火19991 小时前
[Java][SpringBoot]AspectJ切面配合自定义注解实现权限校验
java