欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

轻松上手阿里云OSS文件上传,告别不会上传文件的困扰

最编程 2024-02-21 09:17:17
...

最近关注我的都知道,我开了一个 communication(地址) 项目,本意是将它开发成一个多功能系统中台,所以为其量身打造了很多个功能,可以说都快成一个大杂烩了被我搞得。


但我发现这个项目连基本的文件上传都没有,这不行,要搞一个。


在进行文件上传功能前,我分析了一下腾讯及阿里的文件存储服务功能,流程都基本类似都是申请XXX云账号,开通文件存储对象功能,对接sdk,开始编码等。


那为啥用第三方,不直接将文件上传到自己的服务器中呢!一是我前面接触过阿里OSS文件存储服务功能,觉得很方便存取不用花他多时间管理文件服务、二是本地文件上传对于分布式系统要求很高嘛,所以图简单就直接用第三方了。不过后面我会再出一期上传到本地服务其的文件上传教程(下期)。


好了,铺垫很多了,现在就开始用 SpringBoot + OSS 搭建一个通用的文件上传功能。


所有代码均在Gitee:https://gitee.com/j3_baiqi/communication


一、开通阿里云OSS服务功能


地址:https://www.aliyun.com/


访问地址,登录自己的阿里云(一定要实名认证)


按照如下截图进行操作:


一:选择 OSS 文件服务产品


image.png


二:进入 OSS 控制台


image.png


三:点击 Bucket 列表创建一个 bucket


image.png


四:配置 Bucket


微信图片_20220426172059.png


  • Bucket 名称:和项目相关的名称就行了
  • 存储类型:标准存储
  • 版本控制:不开通
  • 读写权限:公共读就行
  • 服务端加密方式:无
  • 试试日志查询:不开通


点击确认,一个 bucket 就创建好了,如下:


image.png


下面就要创建一个代码可以访问 OSS 服务的 AccessKey

一:进入 AccessKey 管理


image.png


二:选择子 AccessKey


image.png


三:创建 AccessKey 用户


image.png


四:配置 AccessKey 用户


image.png


五:AccessKey 用户列表


image.png


注意!注意!注意!创建好之后出现的 用户 AccessKey 列表中的 AccessKey ID、AccessKey Secret 这两个值非常重要,而且只会显示一次,如果不拿小本本记录下来,忘了就只能删除重现创建。


下面就要给这个用户 key 赋权限(只给管理 OSS 服务的权限就行)


六:添加权限


微信图片_20220426172559.png


到此,代码开发前的准备工作就完成了,此时你应该知道如下信息:


  • bucket:j3-communication
  • Bucket 域名(外网访问):https://oss-cn-guangzhou.aliyuncs.com
  • accessKeyId:你自己的
  • accessKeySecret:你自己的


二、代码实现


2.1 添加依赖

创建一个 SpringBoot 项目,添加如下依赖。


地址:https://help.aliyun.com/document_detail/32009.html

<!--OSS文件服务-->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>


再配置一下文件上传大小限制


再 application.yml 中添加如下配置,限制单个文件最大 100M 、文件上传总大小 200M。


spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 200MB


2.2 文件上传编码

实现功能有:

  1. 单个文件上传
  2. 多个文件上传
  3. 单个文件删除
  4. 多个文件删除
@Slf4j
@Component
@AllArgsConstructor
public class OssTemplate {

    // 我自己抽的统一文件前缀,communication-resource
    private final String prefix = "oss.file.prefix";
    // 你的 bucket,j3-communication
    private final String bucket = "oss.file.bucket";
    // 你的 bucket 外网访问域名,https://oss-cn-guangzhou.aliyuncs.com
    private final String endpoint = "oss.file.endpoint";
    // 拼接返回url要用的,bucket + 域名 例如: j3-communication.oss-cn-guangzhou.aliyuncs.com
    private final String bucketHost = "oss.file.bucketHost";
    // 这两个就没啥好说的了
    private final String accessKeyId = "oss.file.accessKeyId";
    private final String accessKeySecret = "oss.file.accessKeySecret";
    // 生成文件路径用的,根据日期
    private final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");

    /**
     * 单个文件上传
     * @param file
     * @return
     */
    public String upload(MultipartFile file) {
        // 路径拼接
        String dataPath = format.format(new Date());
        // 文件名称生成
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String path = prefix + "/" + dataPath + "/" + uuid + file.getOriginalFilename();
        try {
            // 上传
            ossUpload(bucket, path, file.getInputStream());
        } catch (IOException e) {
            throw new SysException("文件上传失败!");
        }
        // 因为 oss 不会返回访问 url 所以我们自己可以拼接一个:
        // 协议(https://) + 域名访问地址(j3-communication.oss-cn-guangzhou.aliyuncs.com) + 自己拼接的路径(xxx/xxx/a.jpg)
        return "https://" + bucketHost + "/" + path;
    }


    /**
     * 多个文件上传
     * @param files
     * @return
     */
    public List<String> upload(MultipartFile[] files) {
        List<String> usrList = new ArrayList<>(files.length);
        for (MultipartFile file : files) {
            usrList.add(upload(file));
        }
        return usrList;
    }


    /**
     * 具体上传代码
     * @param bucket backet名称
     * @param path 路径
     * @param inputStream 文件流
     * @return
     */
    private PutObjectResult ossUpload(String bucket, String path, InputStream inputStream) {
        OSS ossClient = null;
        PutObjectResult putObjectResult = null;
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(endpoint
                    , accessKeyId
                    , accessKeySecret);
            // 通过文件流的形式上传文件
            putObjectResult = ossClient.putObject(bucket, path, inputStream);
        } catch (Exception e) {
            //错误处理
            log.error("==========ossUpload_error, {}", e);
            throw new SysException("文件上传失败!");
        } finally {
            //资源关闭
            assert ossClient != null;
            ossClient.shutdown();
        }
        return putObjectResult;

						

上一篇: 第二单元电脑网络测验题

下一篇: Yo! YuushyaRelease 新版本已发布 - Gitee快讯 | OSCHINA - 中国开源技术互动社区