SpringBoot整合OSS存储

news2024/11/24 17:36:52

Spring Boot整合OSS存储

  • 一、OSS存储介绍
  • 二、准备工作
  • 二、添加依赖
    • 配置OSS连接信息
      • properties文件
      • yml文件
    • 创建OSS客户端
    • 实现文件上传
    • 实现文件下载
    • 控制器实现文件上传和下载接口
  • 三、Demo


本文介绍如何在Spring Boot应用程序中整合OSS(对象存储服务)来实现文件上传和下载功能。我们将使用阿里云的OSS作为示例,但这个集成方法也适用于其他OSS提供商。

一、OSS存储介绍

OSS(对象存储服务)是阿里云提供的一种云存储服务,它为用户提供了存储和管理海量非结构化数据的能力。以下是对OSS的客观介绍和评价,以及与腾讯COS存储进行的简要比较分析:

OSS(阿里云对象存储服务):

OSS是阿里云提供的可扩展的、安全的、低成本的云存储服务。以下是OSS的特点和优势:

  1. 可靠性和安全性:OSS提供高可靠性和数据持久性,数据会自动复制到不同的设备和地域,以确保数据的可靠性。同时,OSS支持身份验证、权限管理和加密等安全功能,保护用户数据的机密性和完整性。

  2. 可扩展性:OSS具有良好的扩展性,能够处理大规模的并发请求和海量的数据存储需求。它支持多种数据访问方式,如Web接口、SDK和命令行工具等,方便开发人员进行集成和使用。

  3. 成本效益:OSS提供灵活的计费方式,根据存储容量、数据传输量和请求次数等因素计费。它具有低廉的存储成本和传输成本,适合各种规模的应用场景。

  4. 生态系统和工具支持:OSS具有丰富的生态系统和工具支持。阿里云提供了一系列的管理控制台、SDK、API文档和开发工具,以便开发人员轻松地与OSS集成和使用。

腾讯COS(腾讯云对象存储):

腾讯COS是腾讯云提供的对象存储服务,与OSS类似,也是一种云存储解决方案。以下是腾讯COS的特点和优势:

  1. 高可用性和可靠性:腾讯COS提供高可用性和数据冗余功能,确保用户数据的可靠性和持久性。它采用分布式存储架构,将数据复制到多个设备和地域,以防止数据丢失。

  2. 性能和扩展性:腾讯COS具有良好的性能和扩展性,能够处理大规模的并发访问和高吞吐量的数据传输。它支持多种访问方式,包括API、SDK和命令行工具,方便开发人员使用。

  3. 安全性和权限管理:腾讯C

OS提供严格的访问控制和权限管理机制,以确保用户数据的安全性。它支持身份验证、加密和访问日志等功能,帮助用户保护数据的机密性和完整性。

  1. 价格和计费方式:腾讯COS提供灵活的计费方式,根据存储容量、数据传输量和请求次数等因素计费。它的价格相对竞争对手来说具有竞争力,适用于各种规模的应用场景。

比较分析:

OSS和腾讯COS都是领先的云存储解决方案,它们在功能和性能方面具有相似的特点。以下是它们之间的一些比较:

  1. 厂商背景和生态系统:OSS由阿里云提供,而腾讯COS由腾讯云提供。阿里云和腾讯云都是具有全球影响力和丰富经验的云服务提供商,它们都提供了完善的生态系统和工具支持。

  2. 可用性和数据复制:OSS和腾讯COS都具有高可用性和数据复制功能,确保数据的可靠性和持久性。它们采用不同的数据复制策略,可以根据用户的需求选择适合的配置。

  3. 性能和扩展性:OSS和腾讯COS都具有良好的性能和扩展性,能够处理大规模的并发请求和高吞吐量的数据传输。它们提供了多种访问方式和工具,方便开发人员使用和集成。

  4. 安全性和权限管理:OSS和腾讯COS都注重数据安全性和权限管理,提供了身份验证、访问控制和加密等功能,保护用户数据的机密性和完整性。

  5. 价格和计费方式:OSS和腾讯COS都提供灵活的计费方式,根据存储容量、数据传输量和请求次数等因素计费。它们的价格相对较低,适用于不同规模的应用场景。

OSS和腾讯COS都是可靠的云存储解决方案,具有类似的功能和性能。选择哪个取决于用户的具体需求、偏好以及与云服务提供商的合作关系。建议根据自己的业务需求和预算考虑各个方面的因素,并进行综合评估后做出选择。

二、准备工作

在开始之前,确保你已经完成以下准备工作:

  1. 注册阿里云账号,并开通OSS服务。OSS控制台
    在这里插入图片描述

  2. 创建一个新的OSS存储空间(Bucket)。
    在这里插入图片描述

  3. 获取AccessKey和SecretKey,用于访问你的OSS存储空间。
    在这里插入图片描述

二、添加依赖

首先,我们需要添加所需的依赖项到我们的Spring Boot项目中。在你的pom.xml文件中添加以下依赖:

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

配置OSS连接信息

properties文件

application.properties文件中添加以下配置,用于连接到你的OSS存储空间:

# OSS连接配置
oss.endpoint=your-oss-endpoint
oss.accessKeyId=your-access-key-id
oss.accessKeySecret=your-access-key-secret
oss.bucketName=your-bucket-name

确保将上述属性替换为你的实际值。

yml文件

当使用Spring Boot与OSS存储进行整合时,你可以在application.ymlapplication.properties配置文件中设置相关的配置项。以下是一个示例的application.yml配置文件,用于整合OSS存储:

spring:
  application:
    name: YourApplicationName
  
oss:
  endpoint: your-oss-endpoint
  accessKeyId: your-access-key-id
  accessKeySecret: your-access-key-secret
  bucketName: your-bucket-name

请确保将上述属性值替换为你的实际值。

在这个示例中,spring.application.name属性用于设置应用程序的名称,oss.endpoint属性指定了OSS服务的访问端点,oss.accessKeyIdoss.accessKeySecret属性用于设置访问OSS服务所需的身份验证凭据,oss.bucketName属性指定了要使用的存储桶名称。

根据你的具体需求,你可以在这个配置文件中添加其他的属性,例如设置文件上传的路径、设置存储桶的访问权限等。

记住,如果你选择使用application.properties作为配置文件,可以将上述配置转换为相应的key=value格式。

创建OSS客户端

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

@Service
public class OSSService {

    @Autowired
    private OSS ossClient;

    @Value("${oss.bucketName}")
    private String bucketName;

    public String uploadFile(MultipartFile file) {
        try {
            String fileName = file.getOriginalFilename();
            ossClient.putObject(bucketName, fileName, file.getInputStream());
            return fileName;
        } catch (IOException e) {
            // 处理上传失败的逻辑
        }
        return null;
    }
}

请确保在OSSService.java类中添加了@Value注解,并将oss.bucketName的值注入到bucketName字段中。

实现文件上传

现在,我们将实现一个文件上传的功能。创建一个名为OSSService.java的类,并添加以下代码:

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

@Service
public class OSSService {

    @Autowired
    private OSS ossClient;

    @Value("${oss.bucketName}")
    private String bucketName;

    public String uploadFile(MultipartFile file) {
        try {
            String fileName = file.getOriginalFilename();
            ossClient.putObject(bucketName, fileName, file.getInputStream());
            return fileName;
        } catch (IOException e) {
            // 处理上传失败的逻辑
       

 }
        return null;
    }
}

上述代码中,我们通过调用ossClient.putObject()方法将文件上传到指定的OSS存储空间。

实现文件下载

下面,我们将实现文件下载的功能。在OSSService.java类中添加以下代码:

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.OSSObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OSSService {

    // ...

    public InputStream downloadFile(String fileName) {
        try {
            OSSObject object = ossClient.getObject(bucketName, fileName);
            return object.getObjectContent();
        } catch (OSSException e) {
            // 处理下载失败的逻辑
        }
        return null;
    }
}

上述代码中,我们通过调用ossClient.getObject()方法获取指定文件的输入流,并返回给调用方。

控制器实现文件上传和下载接口

最后,我们需要创建一个控制器类,用于处理文件上传和下载的请求。创建一个名为FileController.java的类,并添加以下代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/files")
public class FileController {

    @Autowired
    private OSSService ossService;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        return ossService.uploadFile(file);
    }

    @GetMapping("/download/{fileName}")
    public ResponseEntity<InputStreamResource> downloadFile(@PathVariable("fileName") String fileName) {
        InputStream inputStream = ossService.downloadFile(fileName);
        if (inputStream != null) {
            HttpHeaders headers = new HttpHeaders();
            headers.add("Content-Disposition", "attachment; filename=" + fileName);
            return ResponseEntity.ok()
                    .headers(headers)
                    .contentType(MediaType.APPLICATION_OCTET_STREAM)
                    .body(new InputStreamResource(inputStream));
        }
        return ResponseEntity.notFound().build();
    }
}

上述代码中定义了一个/upload接口用于文件上传,并将上传后的文件名作为响应返回。另外,我们还定义了一个/download/{fileName}接口用于文件下载,并通过ResponseEntity返回文件内容。

三、Demo

当然!以下是一个完整的Spring Boot与OSS存储整合的示例代码:

1. 依赖项配置

首先,在pom.xml文件中添加以下依赖项:

<dependencies>
    <!-- Spring Boot Web Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Aliyun OSS SDK -->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>2.10.0</version>
    </dependency>
</dependencies>

2. 配置文件设置

application.properties文件中添加以下配置,用于连接到你的OSS存储空间:

# OSS连接配置
oss.endpoint=your-oss-endpoint
oss.accessKeyId=your-access-key-id
oss.accessKeySecret=your-access-key-secret
oss.bucketName=your-bucket-name

确保将上述属性替换为你的实际值。

3. OSS配置类

创建一个名为OSSConfig.java的配置类,并添加以下代码:

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OSSConfig {

    @Value("${oss.endpoint}")
    private String endpoint;

    @Value("${oss.accessKeyId}")
    private String accessKeyId;

    @Value("${oss.accessKeySecret}")
    private String accessKeySecret;

    @Bean
    public OSS ossClient() {
        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
}

4. 文件上传服务

创建一个名为OSSService.java的服务类,并添加以下代码:

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Service
public class OSSService {

    @Autowired
    private OSS ossClient;

    @Value("${oss.bucketName}")
    private String bucketName;

    public String uploadFile(MultipartFile file) {
        try {
            String fileName = file.getOriginalFilename();
            ossClient.putObject(bucketName, fileName, file.getInputStream());
            return fileName;
        } catch (IOException e) {
            // 处理上传失败的逻辑
        }
        return null;
    }
}

5. 控制器类

创建一个名为FileController.java的控制器类,并添加以下代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

@RestController
@RequestMapping("/files")
public class FileController {

    @Autowired
    private OSSService ossService;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        return ossService.uploadFile(file);
    }

    @GetMapping("/download/{fileName}")
    public void downloadFile(@PathVariable("fileName") String fileName, HttpServletResponse response) {
        InputStream inputStream = ossService.downloadFile(fileName);
        if (inputStream !=

 null) {
            try {
                StreamUtils.copy(inputStream, response.getOutputStream());
                response.setContentType("application/octet-stream");
                response.flushBuffer();
            } catch (IOException e) {
                // 处理下载失败的逻辑
            }
        } else {
            // 处理文件不存在的逻辑
        }
    }
}

6. 启动类

创建一个名为DemoApplication.java的启动类,并添加以下代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

这是一个简单的Spring Boot应用程序的启动类。

现在,你可以启动Spring Boot应用程序,并使用以下接口进行文件上传和下载:

  • 文件上传接口:POST /files/upload

    • 参数:file(类型为MultipartFile
  • 文件下载接口:GET /files/download/{fileName}

    • 路径参数:fileName(要下载的文件名)

请确保替换掉示例代码中的配置信息和请求路径,并根据你的需求进行适当的错误处理和逻辑处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/703038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树莓派使用非树莓派官方的IMX219和IMX477 摄像头配置

问题&#xff1a; sudo libcamera-hello -t 0 ERROR: the system appears to be configured for the legacy camera stack解决办法&#xff1a; 树莓派4B 查询系统型号&#xff1a; cat /etc/os-release 结果&#xff1a; RETTY_NAME"Debian GNU/Linux 11 (bullseye)…

docker部署rabbitmq

拉取镜像 我部署的是3.8版本的 docker pull rabbitmq:3.8 启动容器 docker run -d --hostname my-rabbit --name rabbitmq --restart always -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin -p 15672:15672 -p 5672:5672 --privilegedtrue rabbitmq:3.8 启…

(一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现

系列文章目录 通过Qt实现手势识别控制软件操作相关系列技术方案 &#xff08;一&#xff09;Qt 将某控件、图案绘制在最前面的方法&#xff0c;通过QGraphicsScene模块实现 &#xff08;二&#xff09;Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方&#xff0c;实现圆…

深度学习100例 | 第37天:表情识别(K同学啊原创出品)

&#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.11编译器&#xff1a;Jupyter Notebook深度学习框架&#xff1a;TensorFlow2.4.1显卡&#xff08;GPU&#xff09;&#xff1a;NVIDIA GeForce RTX 4070 &#x1f942; 相关教程&#xff1a; 编译器教程&…

「2024」预备研究生mem-比与比例(下)

一、比与比例&#xff08;下&#xff09; 好方法&#xff1a; 不错 二、课后题 三、每日一练

10 月发布,Ubuntu 23.10 已升级到 Linux Kernel 6.3 内核

导读Canonical 于近日宣布&#xff0c;代号为 Mantic Minotaur 的 Ubuntu 23.10 发行版本已升级基于 Linux Kernel 6.3 内核。 Canonical宣布&#xff0c;代号为 Mantic Minotaur 的 Ubuntu 23.10 发行版本已升级基于 Linux Kernel 6.3 内核。 Ubuntu 23.10 于今年 4 月下旬进入…

6、Redis事务、管道、发布订阅(了解)

1、Redis事务 是什么&#xff1f; 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&#xff0c;不许加塞 一个队列中&#xff0c;一次性、顺序性、排他性的执行一系列命令 Redis…

【C51】基于51单片机无线遥控门铃电路的设计与实现

摘 要 20世纪以来&#xff0c;科技发展步入了信息时代&#xff0c;科技发展的目的就是为了服务人民&#xff0c;让我们可以拥有更好的生活。居住环境和质量也愈加重要&#xff0c;智能家居就是一次革新&#xff0c;给生活方面带来了巨大的改善&#xff0c;本课题研究的无线遥控…

C#核心知识回顾——4.object中的方法、String、StringBuilder

1.object中的方法 object中的静态方法&#xff1a; 静态方法Equals判断两个对象是否相等&#xff1a; 最终的判断权&#xff0c;交给左侧对象的Equals方法&#xff0c; 不管值类型引用类型都会按照左侧对象Equals方法的规则来进行比较 静态方法Reference Equals&#xf…

分布式操作系统期末复习(辽宁大学王龙主讲)

目录 一、题目 1.1 简答题 1.2 综合题 二、题目答案 2.1 简答题目答案 2.2 综合题目答案 三、期末题型分值分布 3.2 题型和分值 一、题目 1.1 简答题 1什么是中间件 22.1&#xff08;22年期末考试第一题&#xff09; 2 什么是名称解析 3 描述一下客户和服务器之间使…

爬虫入门指南(1):学习爬虫的基础知识和技巧

文章目录 爬虫基础知识什么是爬虫&#xff1f;爬虫的工作原理爬虫的应用领域 爬虫准备工作安装Python安装必要的库和工具 网页解析与XPath网页结构与标签CSS选择器与XPathXpath 语法XPath的基本表达式&#xff1a;XPath的谓语&#xff08;Predicate&#xff09;&#xff1a;XPa…

实测视频!为什么独立比贴片IMU更适合智能驾驶?

在汽车智能化这场行业变革中&#xff0c;作为智能驾驶的标配&#xff0c;高精度定位系统已成L2级及以上智能驾驶“照进现实”进程中四两拨千斤的存在。 惯性测量单元IMU因其工作不依赖包括卫星在内的外界信号&#xff0c;已是智能汽车高精度定位系统的核心元器件。然而行业对于…

2023年跨境物流行业研究报告

第一章 行业概况 跨境物流行业是指那些提供将货物从一个国家运输到另一个国家的服务的公司。这些服务可能包括运输、仓储、包装、分拣、清关和货物跟踪等。跨境物流行业是全球贸易的重要组成部分&#xff0c;它使得商品可以从生产地运输到全球各地的消费者手中。 图 物流运输…

Nmap命令使用

该命令可以扫描目标地址所开放的端口地址&#xff0c;nmap 扫描器主要基本功能有三个&#xff0c;一是探测主机是否在线、其次是扫描主机端口、嗅探所提供的网络服务&#xff0c;还可以推断主机所用的操作系统。也可以深入探测 UDP 或者 TCP 端口&#xff0c;直至主机所使用的操…

华为项目管理认证--东方智慧,能力革新︱华为全球培训中心项目管理认证资深架构师张全军

华为全球培训中心项目管理认证资深架构师张全军先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;华为项目管理认证——东方智慧&#xff0c;能力革新。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&…

Windows上安装Redis教程

Windows上安装Redis教程 一、下载 Redis1. 下载 Redis 压缩包2. 把下载好的压缩包移动到自己的安装目录下 二、安装 Redis三、配置 Redis3.1 配置 Redis 环境变量3.2 配置 Redis 后台服务 一、下载 Redis 1. 下载 Redis 压缩包 我这里下载的是 Redis 5.0 下载地址&#xff1a;…

6.30黄金双线收官打响保卫战,今日多空如何布局?

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;金价周四收复盘中部分失地&#xff0c;在一系列强劲美国经济数据推动金价短暂跌破1900美元关键心理位后&#xff0c;投资者逢低买入。美国上周初请失业金人数创20个…

Python 基本数据类型(三)

文章目录 每日一句正能量数值运算数值类型实例String&#xff08;字符串&#xff09; 每日一句正能量 人的相处&#xff0c;靠的是真心&#xff0c;不是套路。合得来的人&#xff0c;坦诚相待&#xff0c;合不来的人&#xff0c;客气寒暄&#xff1b;谁也别给谁冷脸看&#xff…

文章ACCEPT之后填写内容教程-Springer-Verlag即施普林格

目录 确认通讯作者邮箱或者直接登录您的投稿官网进行确认 有的大学机构是能免费出版的&#xff1a;清华&#xff0c;北大都行 缴纳APC和订阅模式的区别 签订出版协议 英文的作者顺序是没有先后的&#xff0c;后期校稿自己可以调节 选择不彩印&#xff1a;彩印费用也是比较…

来自我的B站数码up主推荐

本人在什么值得买发过&#xff0c;现在只不过是为了让账号看起来更丰盈一点&#xff0c;现在再发一次。 我写下这篇文章的目的&#xff0c;就是陶冶情操啦 首先此文章只代表个人观点&#xff0c;我的想法是比较喜欢数码&#xff0c;所以下我们可以从以下入手。 科技美学&…