阿里云OSS对象存储的使用和快速入门

一、介绍

云存储是一种通过互联网连接的服务,允许用户将数据存储在远程的云服务器上,而不是存储在本地设备上。这些数据可以包括文件、数据库、备份等各种类型的信息。云存储服务提供商通常会管理和维护这些存储设施,并提供用户可以访问、管理和共享数据的工具和接口。

国内有名的大公司都有提供专门的存储服务,我们自需要进行购买就可以使用了。

阿里云的对象存储服务(Object Storage Service,简称OSS)、腾讯云的对象存储服务(Cloud Object Storage,简称COS)、华为云的对象存储服务(Object Storage Service,简称OBS)、百度云的对象存储服务(Baidu Object Storage,简称BOS)这国内的四大互联网巨头都有提供相应的存储服务,我本次使用阿里云的对象存储服务OSS来进行演示;

二、进行购买服务

我是阿里云的新用户所以可以白嫖一次3个月,20GB的存储服务。如果你不是新用户的话就只能进行购买了;

直接登录阿里云之后,在搜索框中进行OSS存储服务的搜索:

点击立即购买:

选择要购买的存储类型和大小

进行购买之后,可以点击“控制台”来查看自己购买的服务

点击对象存储就可以进入到购买的服务中

你可以选择创建一个Bucket来进行数据的存放,Bucket的作用是将不同的数据分隔开,类似于MySQL中一个个的数据库。

Bucket的名称是不可重复的,另外在设置Bucket的时候还可以相应的设置一些属性:

三、在项目中进行实际的代码实现

新建一个spring boot项目,来实现文件的上传(也可以直接在阿里云的控制器中进行文件的上传)

版本:spring boot3.1.11,jdk17

我们在购买完这个OSS服务之后,要进行代码的实现是非常简单的。(毕竟我们掏了钱的,是甲方爸爸)阿里已经帮我们封装好了一些API,我们只需要进行一些简单的修改就可以直接使用了;

在Bucket列表页面,点击“帮助文档”,选择“文档中心打开”:

点击“开发参考”、“SDK参考”、选择Java语言。基本上就是傻瓜式的文档,我们自需要修改几个特定的位置就可以实现相应的功能。

首先导入相应的maven坐标来集成OSS对象存储

我本次使用spring boot框架来进行对象的上传和下载功能,使用knife4j来进行代码的测试;

相应的maven依赖如下:

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
            <version>4.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.15.1</version>
        </dependency>

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- no more than 2.3.3-->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.3</version>
        </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>
    </dependencies>

3.1文件上传:

直接复制阿里给我们写好的实例代码:

public class Demo {
    public static void main(String[] args) throws Exception {
        // Endpoint以北京为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";

        // 访问密钥AccessKey ID和AccessKey Secret。
        String accessKeyId = "你自己的AccessKey";
        String accessKeySecret = "你自己的AccessKeySecret";

// 使用代码嵌入的STS临时访问密钥和安全令牌配置访问凭证。
        CredentialsProvider credentialsProvider =
                new DefaultCredentialProvider(accessKeyId, accessKeySecret);
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "zhangqiaobucket";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "test/30.jpg";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        String filePath= "D:\\idea代码存放\\sso-demo\\30.jpg";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
} 

这个代码是阿里给出的上传文件的代码,更加具体的你可以在官网中进行查看:

我们需要修改一些地方,换成我们本地的信息;

1、创建Bucket的所属地址:

2、访问访问密钥AccessKey ID和AccessKey Secret。

这个可以在账号的“AccessKey”中进行查看和设置:

3、填写Bucket名称,例如examplebucket。

4、填写Object完整路径,完整路径中不能包含Bucket名称,一个“/”号就会创建一个文件夹

5、填写本地文件的完整路径

我们需要修改的就只有这5处地方,现在运行这个main方法,就可以看到我们成功上传的图片了;

我们可以点击“详情”来查看这个文件的具体信息和响应的url;

在网站中查看这个url:

至此,就完成了我们使用OSS来上传文件。但是,我们在开发中是一定不会这样做的,我们会暴露出一个个的接口来实现文件的上传、下载和删除等。

新建一个FileController,在这个Controller中来完成我们对文件的一系列操作,新建一个FileUtil来进行方法的具体实现,最终用knife4j来进行测试。

@RestController
@RequestMapping("/file")
@Tag(name = "文件上传下载", description = "文件上传下载接口")
public class FileController {

    @Autowired
    private FileUtil fileUtil;
    
    // 上传文件
    @Schema(description = "上传文件")
    @PostMapping("/upload")
        public Result<String> upload(MultipartFile file) {
        String url = fileUtil.upload(file);
        return Result.successData(url);
    }
}

工具类FileUtil:
 

@Component
@Slf4j
public class FileUtil {
@Value("${sso.endpoint}")
    private String endpoint;

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

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

//    文件上传方法
    public String upload(MultipartFile file){
        CredentialsProvider credentialsProvider =
                new DefaultCredentialProvider(accessKeyId, accessKeySecret);
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
//        获取上传文件的输入流
        InputStream inputStream=null;
        try {
             inputStream = file.getInputStream();
//             避免文件覆盖,使用当前时间作为文件夹,并设置UUID作为文件名
        String fileName=   LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+"/"+ UUID.randomUUID() +file.getOriginalFilename();
//        正式上传文件
        ossClient.putObject(bucketName, fileName, inputStream);
//        文件访问路径
         String url="https://"+bucketName+"."+endpoint.split("//")[1]+"/"+fileName;
        return url;
        } catch (IOException e) {
            log.error("文件上传失败=======>"+e.getMessage());
            throw new RuntimeException(e);
        }finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }


    }








}

我将需要获取的属性放在yml配置文件中了,文件上传的时候以当前日期作为文件夹,以UUID加上文件的名字作为前缀,这样可以避免文件的覆盖。现在,让我们运行我们的项目来进行相应的测试:(使用knife4j进行测试)

点击上传文件:

可以看到上传成功,并且返回了这个图片的url地址,我们现在就可以访问这个地址,来查看我们上传的图片了;

3.2下载文件:

//    下载文件,需要传入文件的url地址
    public void download(String url) {
        CredentialsProvider credentialsProvider =
                new DefaultCredentialProvider(accessKeyId, accessKeySecret);
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        try {
            // 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
            // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
            String objectName = url.split("com/")[1];
            String pathName = "D:\\logs\\"+objectName.split("/")[1];
            ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

这个方法需要传入文件的url地址,并且指定下载的具体路径:

本地的下载路径为:

可以看到相应的文件已经下载到了本地

3.3删除文件:

//    删除文件:
    public void deletedFile(String url){
        CredentialsProvider credentialsProvider =
                new DefaultCredentialProvider(accessKeyId, accessKeySecret);
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        // 填写文件完整路径。文件完整路径中不能包含Bucket名称。
        String objectName = url.split("com/")[1];
        try {
            // 删除文件或目录。如果要删除目录,目录必须为空。
            ossClient.deleteObject(bucketName, objectName);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

这个方法同样的传入一个url地址,并进行删除;

我们在控制台查看会发现文件已经安全删除了;

总结


使用云存储是未来的大趋势,能熟练掌握云存储还是很有必要的。最简单高效的方法是直接购买大厂推出的存储服务。我本次只是演示了文件操作的最基本部分,阿里云的官方SDK中还有非常多的操作部署,读者可以根据自己的需要去阅读官方的SDK官网。

当然,现在也有一些开源的文件存储工具,如minioOwnCloud、Seafile等等,如果有需要的话也可以使用这些开源的存储工具;

我之前也写过minio的快速上手和实战:
springboot整合minio(实现文件的上传和下载超详细入门)_minio 下载文件-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言中的数组

数组 数组是一种构造类型&#xff0c;是由基本类型构造而成。当我们想用一群变量来描述同一类相同的东西时候&#xff0c;比如100个年龄变量&#xff0c;我们可以这样int age1&#xff1b;int age2&#xff1b;int age3&#xff1b;……int age 100;这样即不方便书写&#xff…

【公司UI自动化学习】

公司课程链接&#xff1a;https://l.jd.com/student/project/project.du?project_id697509403 公司的课程&#xff0c;是给一个学习方向。 一、 PC自动化 1&#xff09;什么项目适合 2&#xff09;PC自动化介入时间点 3&#xff09;自动化率&#xff1a; 频繁改动的&…

自动化测试Selenium(3)

目录 WebDriver相关API 打印信息 打印title 打印url 浏览器的操作 浏览器最大化 设置浏览器的宽,高 操作浏览器的前进, 后退, 刷新 控制浏览器滚动条 键盘事件 键盘单键用法 键盘组合按键用法 鼠标事件 WebDriver相关API 打印信息 打印title 即打印该网址的标题.…

SAP 销售业务中免费货物的会计核算

此博文主要介绍SAP销售业务中免费货物解决方案中&#xff0c;免费货物的会计核算。如果需要进一步了解SAP SD 销售与分销业务中&#xff0c;免费货物的标准解决方案概览&#xff0c;可先了解本博客博文&#xff1a;SAP销售与分销中的免费货物解决方案相关文章&#xff1a; htt…

负采样重要吗?它的理论与应用综述

Does Negative Sampling Matter? A Review with Insights into its Theory and Applications 负采样重要吗&#xff1f;它的理论与应用综述 Does Negative Sampling Matter? A Review with Insights into its Theory and Applications Zhen Yang, Ming Ding, Tinglin Huang,…

一文掌握运维绩效考核指标及实例参考

运维绩效考核需要综合考虑公司的战略和目标,确保考核公正和合理,同时还需要建立合适的管理和收集系统,根据绩效结果进行反馈和奖惩,并落实改进措施。 运维团队合理的绩效考核非常重要,以激励团队成员不断提高,同时确保团队目标的实现。针对运维团队的绩效评估,我们通常…

十一、Yocto集成tcpdump等网络工具

文章目录 Yocto集成tcpdump等网络工具networking layer集成 Yocto集成tcpdump等网络工具 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第十一篇文章&#xff1a; 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi 4B) 三、Yocto创建自定义的lay…

JVM(java虚拟机 详解三个主要的话题:1.JVM 中的内存区域划分2.JVM 的类加载机制3.JVM 中的垃圾回收算法)

jdk java开发工具包 jre java运行时环境 jvm java虚拟机 JDK、JRE、JVM之间的关系&#xff1f; JDK(Java Development Kit):Java开发工具包&#xff0c;提供给Java程序员使用&#xff0c;包含了JRE&#xff0c;同时还包含了编译器javac与自带的调试工具Jconsole、jstack等。…

【Java】实现一个简单的线程池

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、线程池的模式 线程池顾名思义就是管理线程的一个池子&#xff0c;我们把创建线程的过程交给线程池来处理&#xff0c;而这个线程池当中的线程都会从阻塞队列当中取获取任务执行。 我们不在直接把任务的创建过程写到…

【信号与系统 - 10】拉普拉斯变换

1 定义 周期信号的傅里叶变换那篇提到了&#xff1a; F ( j w ) ∫ − ∞ ∞ e − j w t f ( t ) d t F(jw)\int^{\infty}_{-\infty}e^{-jwt}f(t)dt F(jw)∫−∞∞​e−jwtf(t)dt 这个定义式需要满足绝对可积&#xff0c;即 ∫ − ∞ ∞ ∣ f ( t ) ∣ d t < ∞ \int…

小图标还不会设计!

ICON图标设计 hello&#xff0c;我是小索奇 image-20230805225451447 你有好奇过这样的图标如何设计的吗&#xff1f; 其实非常简单&#xff0c;仅需要一行代码即可完成&#xff0c;本篇文章就带伙伴们使用&#xff0c;每天看一篇&#xff0c;简单易懂&#xff0c;日久技长~…

MATLAB实现图片栅格化

MATLAB实现图片栅格化 1.读取图片&#xff1a;首先&#xff0c;你需要使用imread函数读取要栅格化的图片。 2.设置栅格大小&#xff1a;确定你希望将图片划分成的栅格大小&#xff0c;即每个栅格的宽度和高度。 3.计算栅格数量&#xff1a;根据图片的总尺寸和栅格大小&#…

应对.halo勒索病毒:如何应对并保护你的数据安全?

导言&#xff1a; 在数字化时代的今天&#xff0c;网络空间已成为人们生活和工作中不可或缺的一部分。然而&#xff0c;随着网络的普及和技术的不断进步&#xff0c;网络安全问题也日益凸显。其中&#xff0c;勒索病毒作为一种极具破坏性的网络攻击手段&#xff0c;已经引起了…

【Linux】小知识点温习---命令

许多常见命令会用&#xff0c;但是很少注意他们的区别&#xff1b;亦或在学习中使用较少&#xff0c;容易忘记&#xff0c;今天做一个回顾。 ls系列 -a:显示所有文件&#xff08;包括隐藏文件&#xff09; -l:将文件以竖列形式显示 -i&#xff1a;显示文件的inode编号 pwd 显…

盲盒一番赏小程序:打开未知的惊喜之旅

在快节奏的生活中&#xff0c;人们总是渴望寻找一份属于自己的小确幸。盲盒一番赏小程序&#xff0c;正是这样一个为你带来无尽惊喜与乐趣的平台。我们精心打造这一小程序&#xff0c;让每一次点击都成为一次全新的探索&#xff0c;让每一次选择都充满无限可能。 盲盒一番赏小…

星链全解1

星链基本信息 星链卫星的寿命约为5年&#xff0c;最终目标是发射42000颗卫星。最初&#xff0c;每颗卫星重约260公斤&#xff0c;与1吨以上的大卫星相比属于“小卫星”。现在&#xff0c;向V2版进化的星链卫星重量近800公斤&#xff0c;约为老一代卫星的3倍。 点击“星链地图…

算法课程笔记——蓝桥云课第二次直播

注意是‘’ 都正确 可以理解为a的首地址也是数字&#xff0c;向右1 %p逻辑地址 Cin cout字符串“”单个字符本身‘’&#xff0c;其他时候不用加 这样就可以 逆运算 bool比较真假<从小到大排 11/25 都输出最省事 变成长度为n1的数组 考虑到整个都可能为一个颜色&#xff0c;…

Ubuntu 20.04.06 PCL C++学习记录(二十六)

[TOC]PCL中点云配准模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16&#xff0c;可用点云下载地址 学习内容 在代码中使用ICP迭代最近点算法&#xff0c;程序随机…

人工智能论文GPT-3(3):2020.5 Language Models are Few-Shot Learners;架构;训练数据集;开源

2.1 模型与架构 我们使用了与GPT-2相同的模型和架构&#xff0c;包括其中描述的改进初始化、预归一化和可逆分词技术&#xff0c;但有所不同的是&#xff0c;我们在Transformer的各层中使用了交替的密集和局部带状稀疏注意力模式&#xff0c;类似于Sparse Transformer 。为了研…

普通人切入抖音的黄金赛道 软件自动生成文字动画视频 3天15个作品涨粉5000

文字动画&#xff0c;就是导入一段文字&#xff0c;用软件可以自动生成一条文字动画视频&#xff0c;因为这是软件自动生成的&#xff0c;所以过原创的话是很简单没什么问题的。 这种视频的特点是什么? 首先第一点就是非常简单&#xff0c;找好素材直接导入软件就可以自动生成…