10分钟学会阿里OSS对象存储

一. 前言

最近有很多小伙伴问,如果我们要进行大规模的文件存储该怎么做?

其实实现文件存储的技术有很多,如果我们在网上搜索一下,你会发现实现的技术简直是五花八门,比如有一种技术叫FastDFS就可以实现文件存储,但该方案需要自己搭建服务器,非常的麻烦。

实际上现在很多公司都在使用腾讯云或者阿里云技术,比如阿里云就提供了OSS对象存储技术,该技术安全可靠且用起来简单的要死,只需10分钟就可以上手搞定存储。什么?你不信?!那就跟着健哥一步步来,如果健哥带你10分钟搞定文件存储,你就给我点个赞呗!

二. 浅析OSS对象存储作用

在学习OSS具体实现之前,我们先来简单了解一下OSS是怎么个东东吧。

阿里云对象存储OSS,简单地说就是我们花钱在阿里购买一块存储空间,然后我们就可以将图片、音频、视频等各种文件资源存储在对象存储OSS服务器上。接着对象存储OSS服务器就可以供有权限的人员上传、下载、删除这些文件。

所以有了OSS,我们就省去了购买硬件存储服务器、搭建存储服务器、运营管理存储服务器等一系列的繁琐操作了。

有了这些基本的了解之后,我们就可以开始使用OSS了。当然,首先我们得购买OSS服务!

三. 对象存储OSS注册和配置

阿里云对象存储OSS官网地址 :

对象存储 OSS_云存储服务_企业数据管理_存储-阿里云

3.1 注册和登录

进入阿里云官网后,首先就是注册和登录,我们可以使用自己的支付宝账号登录,可以在阿里云手机客户端扫码登录,或者用账号密码登录,总之阿里云提供了多种登录形式。基本上阿里旗下的产品,用自己的支付宝账号都可以通用。

3.2 开通对象存储OSS服务

首先我们找到阿里云的对象存储OSS服务,点击进入。

image.png

点击开通按钮,开通对象存储OSS服务。

image.png

3.3 管理控制台

注册、登录、开通OSS服务后,点击管理控制台,进入控制台界面。

image.png

接着进入到控制台界面。

image.png

这里我们要先创建一个Bucket桶,点击Bucket列表菜单,点击创建Bucket按钮,然后按照下面的内容填写即可。大家要注意,Bucket桶的名称要唯一,不能重复。

image.png

image.png

3.4 使用控制台上传图片

创建完Bucket桶后,我们就可以使用控制台上传文件进行测试了,上传操作如下:

image.png

成功上传一张图片的结果如下:

image.png

四. 代码实现

当然,我们在开发的时候,肯定不会这样手动上传文件,主要是利用代码进行实现。

4.1 搭建项目环境

我们先创建一个项目,名称就叫做aliyunossDemo吧。这里我们当然是利用Maven创建项目,大家记得不要选择使用Maven自带的骨架哦。

接下来在pom.xml中导入依赖包。

<!-- 继承Spring boot工程 -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.5.RELEASE</version>
</parent><properties><!-- 项目源码及编译输出的编码 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!-- 项目编译JDK版本 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><!-- 依赖包版本管理 --><spring.boot.version>2.1.5.RELEASE</spring.boot.version><aliyun-oss-version>3.10.2</aliyun-oss-version><httpcore-verison>4.4.3</httpcore-verison><httpclient-version>4.5.1</httpclient-version>
</properties><dependencies><!-- Spring boot starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring.boot.version}</version></dependency><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>${aliyun-oss-version}</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>${httpcore-verison}</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>${httpclient-version}</version></dependency>
</dependencies>
注意,如果你的JDK是1.9或者以上版本,需要加入jaxb相关依赖,其他JDK版本不需要!

<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>

然后我们在resources目录下创建一个application.yml配置文件。
spring:servlet:multipart:max-file-size: 10MBmax-request-size: 10MBapplication:name: aliyun-oss-demo
server:port: 9001
aliyun:oss:#服务器地址, 我选择的是华北2-北京地址如下endpoint: http://oss-cn-beijing.aliyuncs.com#子账户名称,在自己控制台账户的Access中查看accessKeyId: 填写自己的accessKey#子账户密码accessKeySecret: 填写自己的accessSecret#自己创建的桶的名字bucketName: qianfeng-file

 接着我们创建一个启动类AliyunOssApplication。
package com.qianfeng;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** 微服务启动类* @Author 千锋健哥*/
@SpringBootApplication
public class AliyunOssApplication {public static void main(String[] args) {SpringApplication.run(AliyunOssApplication.class, args);}
}

4.2 封装工具类

创建com.qianfeng.util包,放入文件操作工具类AliyunOSSUtil。

package com.qianfeng.util;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.Date;/*** 阿里云OSS上传,下载, 删除文件工具类* @Author 千锋健哥*/
public class AliyunOSSUtil {/*** byte数组格式上传文件* @param endpoint          OSS对外服务的访问域名* @param accessKeyId       accessKey账号* @param accessKeySecret   accessKey密码* @param bucketName        桶名字* @param objectName        完整文件名, 例如abc/efg/123.jpg* @param content           文件内容, byte数组格式* @Author 千锋健哥*/public static void uploadByByteArrayFile(String endpoint,String accessKeyId,String accessKeySecret,String bucketName,String objectName,byte[] content) throws Exception {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);//创建上传请求对象PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content));// 上传PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);// 关闭OSSClient。ossClient.shutdown();}/*** 输入流格式上传文件* @param endpoint          OSS对外服务的访问域名* @param accessKeyId       accessKey账号* @param accessKeySecret   accessKey密码* @param bucketName        桶名字* @param objectName        完整文件名, 例如abc/efg/123.jpg* @param content           文件内容, 输入流格式* @Author 千锋健哥*/public static void uploadByInputStreamFile(String endpoint,String accessKeyId,String accessKeySecret,String bucketName,String objectName,InputStream content) {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 上传ossClient.putObject(bucketName, objectName, content);// 关闭OSSClientossClient.shutdown();}/*** byte数组格式上传文件并返回上传后的URL地址* @param endpoint          OSS对外服务的访问域名* @param accessKeyId       accessKey账号* @param accessKeySecret   accessKey密码* @param bucketName        桶名字* @param objectName        完整文件名, 例如abc/efg/123.jpg* @param content           文件内容, byte数组格式* @Author 千锋健哥*/public static String uploadImage(String endpoint,String accessKeyId,String accessKeySecret,String bucketName,String objectName,byte[] content)  throws Exception {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 创建上传文件的元信息,可以通过文件元信息设置HTTP header(设置了才能通过返回的链接直接访问)。ObjectMetadata objectMetadata = new ObjectMetadata();objectMetadata.setContentType("image/jpg");// 文件上传ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content), objectMetadata);// 设置URL过期时间为1小时。Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);//返回url地址String url = ossClient.generatePresignedUrl(bucketName, objectName, expiration).toString();//关闭OSSClient。ossClient.shutdown();return url;}/*** 下载文件到本地* @param endpoint          OSS对外服务的访问域名* @param accessKeyId       accessKey账号* @param accessKeySecret   accessKey密码* @param bucketName        桶名字* @param objectName        完整文件名, 例如abc/efg/123.jpg* @param localFile         下载到本地文件目录* @Author 千锋健哥*/public static void downFile(String endpoint,String accessKeyId,String accessKeySecret,String bucketName,String objectName,String localFile) throws Exception {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFile));// 关闭OSSClient。ossClient.shutdown();}/*** 删除文件* @param endpoint          OSS对外服务的访问域名* @param accessKeyId       accessKey账号* @param accessKeySecret   accessKey密码* @param bucketName        桶名字* @param objectName        完整文件名, 例如abc/efg/123.jpg* @Author 千锋健哥*/public static void deleteFile(String endpoint,String accessKeyId,String accessKeySecret,String bucketName,String objectName) {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。ossClient.deleteObject(bucketName, objectName);// 关闭OSSClient。ossClient.shutdown();}
}

4.3 上传文件案例

我们在Controller中实现文件上传。

package com.qianfeng.controller;import com.qianfeng.util.AliyunOSSUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;/*** 文件管理接口* 提供文件各种形式上传, 下载, 删除等操作* @Author 千锋健哥*/
@RestController
@RequestMapping("/file")
public class FileManagerController {//OSS服务器访问域名@Value("${aliyun.oss.endpoint}")private String endpoint;//子账户名@Value("${aliyun.oss.accessKeyId}")private String accessKeyId;//子账户密码@Value("${aliyun.oss.accessKeySecret}")private String accessKeySecret;//桶名字@Value("${aliyun.oss.bucketName}")private String bucketName;/*** byte数组形式上传* @param file* @Author 千锋健哥*/@PostMapping("/upload1")public void upload(@RequestParam("file") MultipartFile file) throws Exception {AliyunOSSUtil.uploadByByteArrayFile(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getBytes());}/*** 输入流形式上传* @param file* @Author 千锋健哥*/@PostMapping("/upload2")public void upload2(@RequestParam("file") MultipartFile file) throws Exception {AliyunOSSUtil.uploadByInputStreamFile(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getInputStream());}
}

4.4 上传图片并返回访问路径案例

在这个案例中给大家展示了如何获取返回的访问路径。

/*** 上传图片并返回上传后的URL地址* @param file* @Author 千锋健哥*/
@PostMapping("/upload3")
public String upload3(@RequestParam("file") MultipartFile file) throws Exception {String url = AliyunOSSUtil.uploadImage(endpoint, accessKeyId, accessKeySecret, bucketName, file.getOriginalFilename(), file.getBytes());System.out.println("===千锋健哥===" + url);return url;
}

4.5 删除文件案例

这是删除上传后的文件案例。

/*** 删除文件* @param objName 需要删除的对象名称* @Author 千锋健哥*/
@DeleteMapping("/delete")
public void deleteFile(String objName) {AliyunOSSUtil.deleteFile(endpoint, accessKeyId, accessKeySecret, bucketName, objName);
}

千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java自学必备)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IoT 物联网安全事件的持续检测和监控解决方案

对于IoT物联网安全事件的持续检测和监控&#xff0c;可以采用以下解决方案&#xff1a; 设备管理和漏洞修复&#xff1a;确保设备的固件和软件及时更新&#xff0c;并修补已知的漏洞。建立一个设备清单&#xff0c;并定期审查和更新其中的设备。 流量分析和异常检测&#xff1a…

matplotlib 笔记:基本用法

1 axis 1.0 对比原始图像 import numpy as np import matplotlib.pyplot as plt xrange(5) yrange(10,20,2) plt.plot(x,y) 1.1 plt.axis(equal) x轴和y轴单位长度相同 import numpy as np import matplotlib.pyplot as plt plt.axis(equal) xrange(5) yrange(10,20,2) pl…

IDEA全局设置MyBatis中写SQL语句提示

把这两个设置改成MySQL即可&#xff1a;

OpenCV 中的光流 (C++/Python)

什么是光流? 光流是一项视频中两个连续帧之间每像素运动估计的任务。基本上,光流任务意味着计算像素的位移矢量作为两个相邻图像之间的对象位移差。光流的主要思想是估计物体由其运动或相机运动引起的位移矢量。 理论基础 假设我们有一个灰度图像——具有像素强度的矩阵。我…

Jenkins 中 shell 脚本执行失败却不自行退出

Jenkins 中 执行 shell 脚本时&#xff0c;有时候 shell 执行失败了&#xff0c;或者判断结果是错误的&#xff0c;但是 Jenkins 执行完成后确提示成功 success 。 此时&#xff0c;可以通过条件判断来解决这个问题&#xff0c;让 Jenkins 强制退出并提示执行失败 failed 。 …

java【native关键字】

描述&#xff1a; native只能修饰方法&#xff0c;表示这个方法的方法体代码不是用java语言实现的&#xff0c;而是由c/c语言编写的。但是对于java程序员来说&#xff0c;可以当作java的方法一样正常去调用它&#xff0c;或者子类重写它 语法&#xff1a; 用在方法的返回值类…

【网络编程】万字详解||一个简单TCP服务器(TCP、线程池、守护进程)源码+介绍

TCP服务器 锁&#xff1a;Lock.hpp代码介绍 守护进程&#xff1a;daemonize.hpp代码说明 日志文件&#xff1a;log.hpp代码说明 任务处理 Task.hpp代码说明 线程池 ThreadPool.hpp代码说明 客户端 TCPClient.cc代码说明 服务器 TCPServer.cc代码说明 头文件包 util.hpp代码 Mak…

Leetcode-每日一题【剑指 Offer 16. 数值的整数次方】

题目 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10输出&#xff1a;1024.00000 示例 2&#xff1a; 输入&#…

c语言--浮点数(float)与0值比较

我们定义一个float类型的数据a&#xff0c;赋值为123456789并输出&#xff1a; int main() {float a;a 123456789;printf("%f\n",a);return 0; }输出结果为&#xff1a; 由此可以看出&#xff0c;程序输出的结果并不是其被赋予的值。即说明了浮点数存在一定的误差。…

日常工具 之 一些 / 方便好用 / 免费 / 在线 / 工具整理

日常工具 之 一些 / 方便好用 / 免费 / 在线 / 工具整理 目录 日常工具 之 一些 / 方便好用 / 免费 / 在线 / 工具整理 1、在线Json &#xff0c;可以在线进行json 格式验证&#xff0c;解析转义等操作 2、Gif动图分解&#xff0c;在线把 gif 图分解成一张张单图 3、在线P…

记一次空间告警与pg_rman keep-data-days参数研究

一、 背景 收到一个磁盘空间告警&#xff0c;检查发现是本地备份保留比较多导致的&#xff0c;处理过程倒很简单&#xff0c;手动清理掉旧的备份&#xff08;已自动备到远端服务器&#xff09;&#xff0c;告警就恢复了。 但是检查备份脚本的时候&#xff0c;发现keep-data-day…

使用logback异步打印日志

文章目录 一、介绍二、运行环境三、演示项目1. 接口2. 日志配置文件3. 效果演示4. 异步输出验证 四、异步输出原理五、其他参数配置六、源码分析1. 同步输出2. 异步输出 七、总结 一、介绍 对于每一个开发人员来说&#xff0c;在业务代码中添加日志是至关重要的&#xff0c;尤…