苍穹外卖-阿里云OSS文件上传

苍穹外卖-阿里云OSS文件上传

  • 一、阿里云OSS简介
  • 二、代码实现
    • [1 引入依赖](#1 引入依赖)
    • [2 定义OSS相关配置](#2 定义OSS相关配置)
      • [2.1 application-dev.yml](#2.1 application-dev.yml)
      • [2.2 application.yml](#2.2 application.yml)
    • [3 读取OSS配置](#3 读取OSS配置)
      • [3.1 AliOssProperties](#3.1 AliOssProperties)
    • [4 生成OSS工具类对象](#4 生成OSS工具类对象)
      • [4.1 AliOssUtil](#4.1 AliOssUtil)
      • [4.2 OssConfiguration](#4.2 OssConfiguration)
      • [2.5 CommonController](#2.5 CommonController)
  • 三、测试文件上传功能
    • [1 直接在阿里云OSS上上传文件](#1 直接在阿里云OSS上上传文件)
    • [2 前后端联调测试](#2 前后端联调测试)

参考:苍穹外卖--图片存储第三方的存储服务(阿里云OSS)开通+代码实现

一、阿里云OSS简介

​ 阿里云对象存储服务(Object Storage Service,简称OSS)提供基于网络的数据存取服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。

阿里云OSS将数据文件以对象(object)的形式上传到存储空间(bucket)中。
创建的Bucked读写权限设置为"公共读"

**获取AccessKey

鼠标放到右上角头像处

在创建AccessKey时会提示保存,保存为csv形式生成文件内容如下:

**获取enpoint

二、代码实现

1 引入依赖

复制代码
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>

2 定义OSS相关配置

2.1 application-dev.yml

复制代码
sky:
  alioss:
    endpoint: oss-cn-beijing.aliyuncs.com
    access-key-id: LTAI5tSpSBjz8VCWKLG18eNV
    access-key-secret: dnORZm3ofD63gsS8xnQvqgCES2Z58A
    bucket-name: sky-jyx

创建和datasource同级的alioss。

2.2 application.yml

复制代码
spring:
  profiles:
    active: dev    #设置环境
sky:
  alioss:
    endpoint: ${sky.alioss.endpoint}
    access-key-id: ${sky.alioss.access-key-id}
    access-key-secret: ${sky.alioss.access-key-secret}
    bucket-name: ${sky.alioss.bucket-name}

3 读取OSS配置

3.1 AliOssProperties

在sky-common模块中,已定义。

复制代码
package com.sky.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 阿里云配置实体类
 */
@Component
/*请注意,为了使用@ConfigurationProperties注解,你需要在Spring Boot应用程序中启用配置绑定功能。
你可以通过在主应用程序类上添加@EnableConfigurationProperties注解来实现。*/
@ConfigurationProperties(prefix = "sky.alioss")
@Data
public class AliOssProperties {

    private String endpoint; //表示OSS服务的访问域名。
    private String accessKeyId; //表示访问OSS服务所需的Access Key ID。
    private String accessKeySecret; //表示访问OSS服务所需的Access Key Secret。
    private String bucketName; //表示要操作的存储桶名称。

}

4 生成OSS工具类对象

4.1 AliOssUtil

在common中已经定义了这个util。

复制代码
package com.sky.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;

/**
 * AliOssUtil类是一个包含文件上传功能的工具类。
 */
@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    /**
     * 文件上传
     *
     * @param bytes
     * @param objectName
     * @return
     */
    public String upload(byte[] bytes, String objectName) {

        // 创建OSSClient实例。
        /*在upload方法中,首先创建了一个OSSClient实例,用于与OSS服务进行交互。*/
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建PutObject请求。
            /*然后,通过调用ossClient.putObject方法将文件上传到指定的存储桶中。*/
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
            /*在上传过程中,通过捕获OSSException和ClientException来处理可能出现的异常情况,并输出相应的错误信息。*/
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        //文件访问路径规则 https://BucketName.Endpoint/ObjectName
        /*最后,构建文件的访问路径,并使用日志记录上传文件的路径。*/
        StringBuilder stringBuilder = new StringBuilder("https://");
        stringBuilder
                .append(bucketName)
                .append(".")
                .append(endpoint)
                .append("/")
                .append(objectName);

        log.info("文件上传到:{}", stringBuilder.toString());

        return stringBuilder.toString();
    }
}

4.2 OssConfiguration

在server的config配置中定义。

① 在这个配置类中,定义了一个名为aliOssUtil的@Bean方法,用于创建一个AliOssUtil对象。

② @ConditionalOnMissingBean注解表示当不存在名为aliOssUtil的bean时,才会创建该bean。

这意味着如果已经有其他地方定义了名为aliOssUtil的bean,那么这个方法将不会执行。

③ 在方法体中,通过依赖注入的方式获取AliOssProperties对象,并使用它的属性值来创建AliOssUtil对象。

复制代码
package com.sky.config;

import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 阿里云 OSS配置类
 * 用于创建AliOssUtil对象
 */
@Configuration
@Slf4j
public class OssConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
        log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
        return new AliOssUtil(aliOssProperties.getEndpoint(),
                aliOssProperties.getAccessKeyId(),
                aliOssProperties.getAccessKeySecret(),
                aliOssProperties.getBucketName());
    }

}

2.5 CommonController

定义通用接口。

复制代码
//原始文件名
/*首先通过file.getOriginalFilename()获取原始文件名*/
  String originalFilename = file.getOriginalFilename();
  
  //截取原始文件名的后缀   dfdfdf.png
  /*然后通过originalFilename.lastIndexOf(".")获取文件名的后缀。*/
  String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
  
  //构造新文件名称
  /*使用UUID.randomUUID().toString()生成一个随机的文件名,并将后缀拼接在文件名后面,构造出新的文件名。*/
  String objectName = UUID.randomUUID().toString() + extension;

  //文件的请求路径
  /*然后,调用aliOssUtil.upload方法将文件上传到OSS,并获取文件的请求路径。*/
  String filePath = aliOssUtil.upload(file.getBytes(), objectName);
  
  /*最后,返回一个Result对象,其中包含上传文件的请求路径。*/
  return Result.success(filePath);

package com.sky.controller.admin;

import com.sky.constant.MessageConstant;
import com.sky.result.Result;
import com.sky.utils.AliOssUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/**
 * @author JY
 * @ClassName: CommonController
 * @Description: 通用接口
 */
@RestController
@RequestMapping("/admin/common")
@Slf4j
@Api(tags = "通用接口")
public class CommonController {

    @Autowired
    private AliOssUtil aliOssUtil;

    /**
     * 文件上传接口
     * @param file
     * @return
     */
    @PostMapping("/upload")
    @ApiOperation(value = "文件上传接口")
    public Result<String> upload(MultipartFile file){
        log.info("文件上传:{}",file.getOriginalFilename());
        try {
            //获取原始的文件名
            String originalFilename = file.getOriginalFilename();
            //截取文件名的后缀
            String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
            //构造新的文件名称(UUID)
            String imageName = UUID.randomUUID().toString() + substring;
            //提交文件(文件路径)
            String upload = aliOssUtil.upload(file.getBytes(), imageName);
            return Result.success(upload);
        }catch (Exception e){
            log.error(MessageConstant.UPLOAD_FAILED + ":{}", e);
        }
        return Result.error(MessageConstant.UPLOAD_FAILED);
    }

}

三、测试文件上传功能

1 直接在阿里云OSS上上传文件

文件上传成功!

2 前后端联调测试

页面点击上传图片,测试CommonController类运行。

运行成功则文件成功上传到OSS。

相关推荐
Johny_Zhao2 小时前
Vmware workstation安装部署微软SCCM服务系统
网络·人工智能·python·sql·网络安全·信息安全·微软·云计算·shell·系统运维·sccm
国际云7 小时前
阿里云国际站与国内站的核心布局与本土化服务的选择
阿里云·云计算
小雨光7 小时前
阿里云ECS部署Dify
阿里云·云计算
亚林瓜子11 小时前
AWS Elastic Beanstalk控制台部署Spring极简工程(LB版)
spring·云计算·aws·elb·beanstalk·alb·eb
国际云,接待20 小时前
云服务器的运用自如
服务器·架构·云计算·腾讯云·量子计算
Blossom.11820 小时前
使用Python实现简单的人工智能聊天机器人
开发语言·人工智能·python·低代码·数据挖掘·机器人·云计算
亚林瓜子1 天前
AWS Elastic Beanstalk控制台部署Spring极简工程
java·spring·云计算·aws·eb
小王格子1 天前
AI 编程革命:腾讯云 CodeBuddy 如何重塑开发效率?
人工智能·云计算·腾讯云·codebuddy·craft
亚林瓜子1 天前
AWS CloudTrail日志跟踪启用
云计算·aws·log·cloudtrail
独行soc1 天前
2025年渗透测试面试题总结-阿里云[实习]阿里云安全-安全工程师(题目+回答)
linux·经验分享·安全·阿里云·面试·职场和发展·云计算