SpringBoot 整合 阿里云 OSS图片上传

一、OOS 简介

‌阿里云OSS(Object Storage Service)是一种基于云存储的产品,适用于存储和管理各种类型的文件,包括图片、视频、文档等。‌ 阿里云OSS具有高可靠性、高可用性和低成本等优点,因此被广泛应用于各种场景,包括作为图片服务器‌。

阿里云OSS图片服务提供了多种功能,包括图片信息获取、格式转换、缩放、裁剪、旋转等。用户可以通过简单的RESTful接口在任何时间、任何地点对图片进行处理。此外,阿里云OSS还支持通过URL形式进行图片处理,用户可以通过URL中的QueryString指定处理参数,直接访问处理后的图片,这种方式简单方便,无需编写额外的代码‌。

二、官网开通服务

1.官网账号注册

阿里云官网阿里云------阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司之一。提供免费试用、云服务器、云数据库、云安全、云企业应用等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。免费备案,7x24小时售后支持,助企业无忧上云。https://www.aliyun.com/

2.开通OSS服务

(1)点击产品

(2)选择存储就可以看到OSS了

(3)点击OSS进入,选择开通

(4)点击开通之后进入以下,点击立即购买

(5)同意服务,点击去支付

(6)点击支付

(7)成功后点击控制台

(8)点击Bucket(桶)列表

(9)点击创建Bucket(桶)

注意事项:

(10)填写数据

a.名称
b.地域(尽量选离自己比较近的速度会快一些)
c.配置(读写权限要选公共度,其他根据需求来)

创建成功

3.获取AccessKey

(1)点击右上头像,选择AccessKey管理

(2)点击进入之后会弹出一个警告,这里我选 继续使用AccessKey

(3)创建AccessKey

a.安全认证(两种认证方式都行)
b.认证之后,就创建成功了

切记:生成之后要保存好两个AccessKey,后面无法进行查询

二、SpringBoot整合并使用

Java_对象存储(OSS)-阿里云帮助中心https://help.aliyun.com/zh/oss/developer-reference/java/

1.导入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>

2.添加配置

aliyun:
  oss:
    # OSS服务的节点地址,指定为上海区域
    endPoint: oss-cn-shanghai.aliyuncs.com
    # 用户的Access Key ID,用于身份验证
    accessKeyId: 
    # 用户的Access Key Secret,用于身份验证
    accessKeySecret: 
    # 访问OSS资源的基础URL
    accessPre: https://051104.oss-cn-shanghai.aliyuncs.com/
    # 存储桶的名称,存储数据的地方
    bucketName: 

配置信息所在地

a.OSS服务的节点地址

进入创建的bucket桶中,点击概览,往下滑就可以看到

b.用户的Access Key ID 和 用户的Access Key Secret

就是创建的accesskey,再次提醒切记要保存accesskey

c.访问OSS资源的基础URL

跟OSS服务的节点地址差不多在同一个地方 ,进入创建的bucket桶中,点击概览,往下滑就可以看到

将配置中红框中的改成自己的

d.存储桶的名称

就是创建bucket(桶)时自己起的名字

3.创建初始化bean

java 复制代码
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PreDestroy;

/**
 * OSS初始化配置
 */
@Log4j2
@Configuration
public class OssConfig {
    /**
     * 配置文件中读取阿里云 OSS 的 endpoint,注入到 endPoint 变量中
     */
    @Value("${aliyun.oss.endPoint}")
    private String endPoint;

    /**
     * 从配置文件中读取阿里云 OSS 的 accessKeyId,注入到 accessKeyId 变量中
     */
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    /**
     * 从配置文件中读取阿里云 OSS 的 accessKeySecret,注入到 accessKeySecret 变量中
     */
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;

    private OSS ossClient;

    @Bean
    public OSS init() {
        // 如果 OSS 客户端尚未初始化,则进行初始化
        if (ossClient == null) {
            // 使用 OSSClientBuilder 构建 OSS 客户端,传入 endpoint、accessKeyId 和 accessKeySecret
            ossClient = createOSSClient();

            // 记录日志,表示连接成功
            log.info("OSS服务连接成功!");
        }
        // 返回初始化好的 OSS 客户端实例
        return ossClient;
    }

    /**
     * 创建 OSS 客户端的方法
     */
    private OSS createOSSClient() {
        return new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
    }

    @PreDestroy
    public void destroy() {
        // 关闭 OSS 客户端
        if (ossClient != null) {
            // 调用 shutdown() 方法关闭 OSS 客户端
            ossClient.shutdown();

            // 记录日志,确认客户端已成功关闭
            log.info("OSS客户端已成功关闭。");
        }
    }
}

4.创建上传工具类

java 复制代码
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.time.LocalDateTime;
import java.util.UUID;

/**
 * OSS 文件管理服务
 */
@Log4j2
@Component
public class OssUtil {

    /** 自动注入 OssConfig 类型的 Bean */
    @Autowired
    private OssConfig ossConfig;

    /** 定义访问前缀,用于构建文件的完整访问路径 */
    @Value("${aliyun.oss.accessPre}")
    private String accessPre;

    /** 定义存储桶名称,方便在上传和下载时引用 */
    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

    /**
     * 默认路径上传本地文件
     *
     * @param filePath 本地文件路径
     * @return 上传后的文件访问路径
     */
    public String uploadFile(String filePath) {
        return uploadFileForBucket(bucketName, getOssFilePath(filePath), filePath);
    }

    /**
     * 默认路径上传 MultipartFile 文件
     *
     * @param multipartFile 待上传的文件
     * @return 上传后的文件访问路径
     */
    public String uploadMultipartFile(MultipartFile multipartFile) {
        return uploadMultipartFile(bucketName, getOssFilePath(multipartFile.getOriginalFilename()), multipartFile);
    }

    /**
     * 上传 MultipartFile 类型文件到指定 Bucket
     *
     * @param bucketName    实例名称
     * @param ossPath       OSS 存储路径
     * @param multipartFile 待上传的文件
     * @return 上传后的文件访问路径
     */
    public String uploadMultipartFile(String bucketName, String ossPath, MultipartFile multipartFile) {
        try (InputStream inputStream = multipartFile.getInputStream()) {
            uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
        } catch (IOException e) {
            log.error("上传文件失败: {}", e.getMessage(), e);
            return null;
        }
        return accessPre + ossPath;
    }

    /**
     * 使用 File 上传文件
     *
     * @param bucketName 实例名称
     * @param ossPath    OSS 存储路径
     * @param filePath   本地文件路径
     * @return 上传后的文件访问路径
     */
    public String uploadFileForBucket(String bucketName, String ossPath, String filePath) {
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossPath, new File(filePath));
        ossConfig.init().putObject(putObjectRequest);
        return accessPre + ossPath;
    }

    /**
     * 使用文件流上传到指定的 Bucket 实例
     *
     * @param bucketName  实例名称
     * @param ossPath     OSS 存储路径
     * @param inputStream 文件输入流
     */
    public void uploadFileInputStreamForBucket(String bucketName, String ossPath, InputStream inputStream) {
        ossConfig.init().putObject(bucketName, ossPath, inputStream);
    }

    /**
     * 下载文件
     *
     * @param ossFilePath OSS 存储路径
     * @param filePath    本地文件路径
     */
    public void downloadFile(String ossFilePath, String filePath) {
        downloadFileForBucket(bucketName, ossFilePath, filePath);
    }

    /**
     * 从指定 Bucket 下载文件
     *
     * @param bucketName  实例名称
     * @param ossFilePath OSS 存储路径
     * @param filePath    本地文件路径
     */
    public void downloadFileForBucket(String bucketName, String ossFilePath, String filePath) {
        ossConfig.init().getObject(new GetObjectRequest(bucketName, ossFilePath), new File(filePath));
    }

    /**
     * 获取默认 OSS 存储路径
     *
     * @return 默认 OSS 存储路径
     */
    public String getOssDefaultPath() {
        LocalDateTime now = LocalDateTime.now();
        return String.format("%d/%d/%d/%d/%d/",
                now.getYear(),
                now.getMonthValue(),
                now.getDayOfMonth(),
                now.getHour(),
                now.getMinute());
    }

    /**
     * 生成 OSS 文件路径
     *
     * @param filePath 本地文件路径
     * @return OSS 文件路径
     */
    public String getOssFilePath(String filePath) {
        String fileSuffix = filePath.substring(filePath.lastIndexOf(".") + 1);
        return getOssDefaultPath() + UUID.randomUUID() + "." + fileSuffix;
    }
}

5.调用上传方法上传图片

java 复制代码
import com.chen.system.config.OssUtil;
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;

/**
 * OSS 文件控制器
 */
@RestController
@RequestMapping("/oss")
public class OssController {
    @Autowired
    private OssUtil ossUtil;

    @PostMapping("/showImg")
    public String upload(MultipartFile file){
        return ossUtil.uploadMultipartFile(file);
    }
}

6.测试

(1)postman测试

(2)浏览器访问链接

访问之后会直接弹出下载框(没有弹出来直接下载的,可能是浏览器没有设置下载时询问)

下载之后

(3)OSS控制台

在bucket列表中找到上传时指定的bucket点击也可查看上传图片呢

相关推荐
cloud studio AI应用1 小时前
腾讯云 AI 代码助手:产品研发过程的思考和方法论
人工智能·云计算·腾讯云
小曲曲7 小时前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
为什么每天的风都这么大13 小时前
Vscode/Code-server无网环境安装通义灵码
ide·vscode·阿里云·编辑器·ai编程·code-server
何遇mirror16 小时前
云原生基础-云计算概览
后端·云原生·云计算
007php00716 小时前
GoZero 上传文件File到阿里云 OSS 报错及优化方案
服务器·开发语言·数据库·python·阿里云·架构·golang
嚯——哈哈17 小时前
轻量云服务器:入门级云计算的最佳选择
运维·服务器·云计算
请你喝好果汁64118 小时前
Kingfisher 下载ENA、NCBI SRA、AWS 和 Google Cloud)序列数据和元数据
云计算·aws
九陌斋18 小时前
如何使用AWS Lambda构建一个云端工具(超详细)
云计算·aws
嚯——哈哈18 小时前
AWS云服务器:开启高效计算的新纪元
服务器·云计算·aws
徒步僧18 小时前
ThingsBoard规则链节点:AWS SNS 节点详解
云计算·aws