图库原理(以阿里云OSS为案例)

进入阿里云的控制台,可以免费开一个对象存储

通过控制台快速使用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存储

相关推荐
SimonKing1 小时前
那个号称"对标 Spring"的国产框架 Solon,到底行不行?
java·后端·程序员
Lethehong1 小时前
飞算Java:从需求梳理到风险闭环,搭建云盾企业信息安全与权限管理平台
java·开发语言
霸道流氓气质1 小时前
SpringBoot中使用字典驱动的动态路由示例
java·spring boot·后端
学计算机的计算基1 小时前
操作系统八股文:进程与线程全面梳理(附调度算法+IPC+锁机制)
java·算法
wuqingshun3141591 小时前
请描述简单工厂模式的工作原理
java·简单工厂模式
大不点wow2 小时前
Spring 中 @Bean、@Component 与 @Configuration 的作用及底层逻辑
java·spring
IvorySQL2 小时前
云环境下PostgreSQL的Cgroup内存管理实践
java·数据库·postgresql
不定积分要+C_yyy2 小时前
Java基础核心精讲:基本数据类型与包装类区别、自动装箱拆箱与缓存陷阱实战解析
java·开发语言
jvmind_dev2 小时前
第三章:GC 日志深度分析(上)——多版本、多收集器的统一解析
java·agent