
进入阿里云的控制台,可以免费开一个对象存储
通过控制台快速使用OSS-对象存储(OSS)-阿里云帮助中心
可以通过上述连接操作了解详细操作也可以跟着我学习如何一步一步建立属于自己的图库
1. 创建Bucket
Bucket是OSS中存储对象的容器,类似于文件夹。创建Bucket是使用OSS的第一步,需要设置几个关键参数:
- Bucket名称:全局唯一,只能包含小写字母、数字和短横线,且必须以字母或数字开头结尾。建议使用有意义的名称,如"my-blog-images"。
- 地域:选择离你用户最近的地域,以降低访问延迟。例如,如果你的用户主要在华东地区,可以选择"华东1(杭州)"。
- 存储类型 :阿里云提供多种存储类型:
- 标准存储:高可靠、高可用、高性能,适用于频繁访问的热数据。
- 低频访问存储:存储单价较低,但访问费用较高,适合不频繁访问的数据。
- 归档存储:存储单价最低,但需要解冻才能访问,适合长期保存的冷数据。
对于个人博客图库,选择"标准存储"即可。
- 读写权限:默认为"私有",只有Bucket拥有者可以读写。如果希望图片能被公开访问,需要设置为"公共读"。
创建完成后,可以在Bucket列表中看到新建的Bucket,点击进入可以上传和管理文件。

这个Endpoint和bucket-name是后续需要的两个数据

创建过程中没有太多需要改的东西,都默认即可
然后我们要去获取我们需要的access-key-id和access-key-secret

创建阿里云AccessKey-访问控制(RAM)-阿里云帮助中心
可以通过这个链接详细了解阿里云OSS关于AccessKey的一些配置

可以使用云创建也可以RAM详细创建 创建后记得保存一次性展示的access-key-secret
后续创建属于我们自己的图库需要使用到Java的后端和API工具模仿前端传输文件
先看一下整体的后端

在整体后端中我们先讲一下我们的配置要求
application.yml
java
aliyun:
oss:
access-key-id: xxxxxxxxx
access-key-secret: xxxxxxxxx
endpoint: oss-accelerate.aliyuncs.com
bucket-name: xxxxxxxxx
spring:
datasource:
url: jdbc:mysql://localhost:3307/your_database_name?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: your_username
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
server:
port: 8080
logging:
level:
org.springframework: DEBUG
org.apache.ibatis: DEBUG
因为在yml配置中使用了新的依赖aliyun,所以我们也得找一个适合我们版本的依赖
java
<!--oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
整体的xml配置如下
java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>Spring_OSS</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Spring_OSS</name>
<description>Spring_OSS</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--druid数据库连接池依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
<dependency>
<groupId>com.github.shalousun</groupId>
<artifactId>smart-doc</artifactId>
<version>1.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>11.2.3.jre17</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.3.0</version>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>2.2.3</version>
</dependency>
<!--mybatisplus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!--oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.github.shalousun</groupId>
<artifactId>smart-doc-maven-plugin</artifactId>
<version>2.4.8</version>
<configuration>
<!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
<configFile>./src/main/resources/smart-doc.json</configFile>
<!--指定项目名称,推荐使用动态参数,例如${project.description}-->
<!--如果smart-doc.json中和此处都未设置projectName,2.3.4开始,插件自动采用pom中的projectName作为设置-->
<!--<projectName>${project.description}</projectName>-->
<!--smart-doc实现自动分析依赖树加载第三方依赖的源码,如果一些框架依赖库加载不到导致报错,这时请使用excludes排除掉-->
<excludes>
<!--格式为:groupId:artifactId;参考如下-->
<!--也可以支持正则式如:com.alibaba:.* -->
<exclude>com.alibaba:fastjson</exclude>
</excludes>
<!--includes配置用于配置加载外部依赖源码,配置后插件会按照配置项加载外部源代码而不是自动加载所有,因此使用时需要注意-->
<!--smart-doc能自动分析依赖树加载所有依赖源码,原则上会影响文档构建效率,因此你可以使用includes来让插件加载你配置的组件-->
<includes>
<!--格式为:groupId:artifactId;参考如下-->
<!--也可以支持正则式如:com.alibaba:.* -->
<include>com.alibaba:fastjson</include>
</includes>
</configuration>
<executions>
<execution>
<!--如果不需要在执行编译时启动smart-doc,则将phase注释掉-->
<phase>compile</phase>
<goals>
<!--smart-doc提供了html、openapi、markdown等goal,可按需配置-->
<goal>html</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
里面集合了我以前所有的配置依赖
然后到了比较重要的代码相关词条的配置文件OSSConfig.java
java
package com.example.spring_oss.config;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OSSConfig {
@Value("${aliyun.oss.access-key-id}")
private String accessKeyId;
@Value("${aliyun.oss.access-key-secret}")
private String accessKeySecret;
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.bucket-name}")
private String bucketName;
@Bean
public OSS ossClient() {
return new OSSClient(endpoint, accessKeyId, accessKeySecret);
}
public String getBucketName() {
return bucketName;
}
public String getEndpoint() {
return bucketName;
}
}
后端控制类代码ImageUploadController.java
java
package com.example.spring_oss.controller;
import com.example.spring_oss.service.ImageUploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/api/images")
public class ImageUploadController {
@Autowired
private ImageUploadService imageUploadService;
// 上传图片接口
@PostMapping("/upload")
public String uploadImage(@RequestParam("file") MultipartFile file) {
try {
return imageUploadService.uploadImage(file);
} catch (Exception e) {
e.printStackTrace();
return "上传失败:" + e.getMessage();
}
}
}
接口为
POST http://localhost:8080/api/images/upload
之后我们可以通过API工具对该本地接口传输文件上传至阿里云oss实例,相当于搭建个后端做一个嫁接
然后我们来看一下最重要的一段代码,也就是服务类的代码ImageUploadService.java
java
package com.example.spring_oss.service;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.PutObjectRequest;
import com.example.spring_oss.config.OSSConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
@Service
public class ImageUploadService {
@Autowired
private OSS ossClient;
@Autowired
private OSSConfig ossConfig;
// 上传图片到 OSS
public String uploadImage(MultipartFile file) throws IOException {
// 获取文件的输入流
InputStream inputStream = file.getInputStream();
// 生成文件名,这里简单使用当前时间戳 + 文件原始名称
String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename();
// 获取存储桶名称
String bucketName = ossConfig.getBucketName();
// 上传文件到 OSS
ossClient.putObject(new PutObjectRequest(bucketName, fileName, inputStream));
// 获取文件的访问 URL(你可以根据需要设置公共或私有访问)
return "https://" + bucketName + "." + ossConfig.getEndpoint() + "/" + fileName;
}
}
具体作用都在注解里了
以上就是图库建立后的整个流程,之后我们通过API工具进行测试

成功得到图片地址并上传至OSS存储
