基于springboot的文件的上传到本地和云上传(阿里云)

1.文件上传

1.介绍

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

2.前端的文件上传–form表单

  • 将静态的页面资源放到static资源包下,upload.html文件代码如下
姓名:
年龄:
头像:

基于springboot的文件的上传到本地和云上传(阿里云)_第1张图片

enctype="multipart/form-data":必须设置表单编码格式参数为multipart/form-data,因为普通默认的编码格式不适合传输大型数据 。

关于enctype的介绍:
基于springboot的文件的上传到本地和云上传(阿里云)_第2张图片

3.服务端接收文件

  • 建立Controller层的代码:
@Slf4j
@RestController
public class UploadController {
   @PostMapping("/upload")
   public Result upLoad(String username, Integer age, MultipartFile image) {
       log.info("文件的上传,参数:{},{},{}", username, age, image);
       return Result.success();
   }
}

接收时的必要参数:MultipartFile(Java中提供的api接口) ,在接收参数时会产生一个临时文件,等待上传成功时候临时文件会自动的删除。

2.文件的存储

1.本地存储

  • 在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。废话不说直接上代码(同样也是Controller层):
@Slf4j
@RestController
public class UploadController {
    @PostMapping("/upload")
    public Result upLoad(String username, Integer age, MultipartFile image) throws IOException {
        log.info("文件的上传,参数:{},{},{}", username, age, image);
        //获取文件原始名
        String originalFilename = image.getOriginalFilename();

        //构造唯一的文件名  uuid(通用唯一识别码--长度固定的字符串 de49685b-6lc0-4b11-80fa-c7le95924018)
        int index = originalFilename.lastIndexOf(".");
        String extName = originalFilename.substring(index);//获取后缀文件名
        String newFileName= UUID.randomUUID().toString()+extName;
        log.info("获取到的文件名:{}",newFileName);

        //将文件存入指定的目录
        image.transferTo(new File("D:\\resources\\" + newFileName));
        return Result.success();
    }
}

但是这种方式只能上传的文件大小只有1MB,超出之后就要配置一下application.properties文件:

#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传大小(一次请求可以上传多个文件,多个文件的总大小不能超过设置值)
spring.servlet.multipart.max-request-size=100MB

2.阿里云介绍

  • 阿里云:阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商。
  1. 阿里云OSS
  • 阿里云对象存储OSS (Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
  1. 第三方服务的通用思路
  • 准备工作->参照官方SDK编写入门程序->集成使用

SDK:Software Development Kit 的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做SDK

  1. 阿里云OSS–使用步骤
  • 准备工作:注册阿里云(实名认证)->充值->开通对象存储服务(0SS)->创建bucket->获取AccessKey(秘钥)

Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。

  1. 参考阿里云文档进行快速入门

3.阿里云OSS集层开发–基于阿里云的云上传

  1. 步骤:
  • (1)引入阿里云OSS上传文件工具类(由官方的示例代码改造而来),示例:
package com.mannor.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
@Component   //交给了IOC容器管理--实现对此工具类进行操作
public class AliOSSUtils {

    private String endpoint = "https://oss-cn-chengdu.aliyuncs.com";
    private String accessKeyId = "yourAccessKeyId";
    private String accessKeySecret = "yourAccessKeySecret";
    private String bucketName = "mannor-tlias";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

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

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

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

}

  • (2)上传图片接口开发,代码:
package com.mannor.Controller;

import com.mannor.pojo.Result;
import com.mannor.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Slf4j
@RestController
public class UploadController {

    @Autowired
    private AliOSSUtils aliOSSUtils;   //使用bean对象
 
    @PostMapping("/upload")
    public Result upLoad(MultipartFile image) throws IOException {
        log.info("文件的上传,文件名:{}", image.getOriginalFilename());
        String url = aliOSSUtils.upload(image);   //返回值为文件的URL
        log.info("文件上传完成,文件URl是:{}", url);
        return Result.success(url);
    }
}

你可能感兴趣的:(后端,spring,boot,阿里云,java)