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点击也可查看上传图片呢

相关推荐
文青小兵9 小时前
Linux云计算——docker compose haibor elfk (四)
linux·服务器·docker·云计算
文青小兵10 小时前
Linux云计算——docker部分技术、命令 (一)
linux·docker·云计算
文青小兵10 小时前
Linux云计算——docker 监控(五)
linux·docker·云计算·grafana·prometheus
文青小兵11 小时前
Linux云计算——docker镜像(三)
linux·docker·云计算
文青小兵11 小时前
Linux云计算——docker 网络和部分挂载(二)
linux·docker·云计算
AOwhisky12 小时前
Ceph系列第四期:Ceph块存储(RBD)精讲
linux·运维·笔记·ceph·云计算·rbd
代码N年归来仍是新手村成员1 天前
【AWS】Lambda 初识与服务部署
javascript·react.js·ai·node.js·云计算·ai编程·aws
小哈里1 天前
【K8S】云原生时代的GitOps最佳实践 —— ArgoCD
云原生·kubernetes·云计算·argocd·基础设施
wanhengidc1 天前
云手机 跨设备无缝衔接
运维·服务器·人工智能·智能手机·云计算