一、简介

阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。

OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

您可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,您可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)、归档存储(Archive)、冷归档存储(Cold Archive)作为不经常访问数据的存储方式。

二、概念

  • 存储类型(Storage Class)

    OSS提供标准、低频访问、归档、冷归档四种存储类型,全面覆盖从热到冷的各种数据存储场景。其中标准存储类型提供高持久、高可用、高性能的对象存储服务,能够支持频繁的数据访问;低频访问存储类型适合长期保存不经常访问的数据(平均每月访问频率1到2次),存储单价低于标准类型;归档存储类型适合需要长期保存(建议半年以上)的归档数据;冷归档存储适合需要超长时间存放的极冷数据。更多信息,请参见存储类型介绍。

  • 存储空间(Bucket)

    存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。您可以根据实际需求,创建不同类型的存储空间来存储不同的数据。

  • 对象(Object)

    对象是OSS存储数据的基本单元,也被称为OSS的文件。对象由元信息(Object Meta)、用户数据(Data)和文件名(Key)组成。对象由存储空间内部唯一的Key来标识。对象元信息是一组键值对,表示了对象的一些属性,例如最后修改时间、大小等信息,同时您也可以在元信息中存储一些自定义的信息。

  • 地域(Region)

    地域表示OSS的数据中心所在物理位置。您可以根据费用、请求来源等选择合适的地域创建Bucket。更多信息,请参见OSS已开通的地域。

  • 访问域名(Endpoint)

    Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同地域的时候,需要不同的域名。通过内网和外网访问同一个地域所需要的域名也是不同的。更多信息,请参见各个Region对应的Endpoint。

  • 访问密钥(AccessKey)

    AccessKey简称AK,指的是访问身份验证中用到的AccessKey ID和AccessKey Secret。OSS通过使用AccessKey ID和AccessKey Secret对称加密的方法来验证某个请求的发送者身份。AccessKey ID用于标识用户;AccessKey Secret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。关于获取AccessKey的方法,请参见获取AccessKey。

三、操作

  • 创建Bucket

    在上传文件(Object)到OSS之前,您需要创建一个用于存储文件的Bucket。Bucket具有各种配置属性,包括地域、访问权限以及其他元数据。创建Bucket的具体操作,请参见创建存储空间。

  • 上传文件

    Bucket创建完成后,您可以通过多种方式上传不同大小的文件。有关上传文件的具体操作,请参见上传文件。

  • 下载文件

    文件上传完成后,您可以将文件下载至浏览器默认路径或本地指定路径。有关下载文件的具体操作,请参见下载文件。

  • 列举文件

    当您的Bucket内存储了大量的文件后,您可以选择列举Bucket内的全部或部分文件。有关列举文件的具体操作,请参见列举文件。

  • 删除文件

    当您不再需要保留上传的文件时,您可以手动删除单个或多个文件,也可以通过配置生命周期规则自动删除单个或多个文件。有关删除文件的具体操作,请参见删除文件。

四、代码

1、目录结构

2、OSSConfig

package com.llj.config;import java.io.IOException;/*** @PakcageName:com.llj.config* @ClassName:OSSConfig* @Description: OSS配置类* @Author:liulianjia* @Date:2021/2/2 16:29*/
public class OSSConfig {private  String endpoint;       //连接区域地址private  String accessKeyId;    //连接keyIdprivate  String accessKeySecret;//连接秘钥private  String bucketName;      //需要存储的bucketNameprivate  String picLocation;   //图片保存路径public OSSConfig() {try {this.endpoint = SystemConfig.getConfigResource("endpoint");this.bucketName = SystemConfig.getConfigResource("bucketName");this.picLocation = SystemConfig.getConfigResource("picLocation");this.accessKeyId = SystemConfig.getConfigResource("accessKeyId");this.accessKeySecret = SystemConfig.getConfigResource("accessKeySecret");} catch (IOException e) {e.printStackTrace();}}public String getEndpoint() {return endpoint;}public void setEndpoint(String endpoint) {this.endpoint = endpoint;}public String getAccessKeyId() {return accessKeyId;}public void setAccessKeyId(String accessKeyId) {this.accessKeyId = accessKeyId;}public String getAccessKeySecret() {return accessKeySecret;}public void setAccessKeySecret(String accessKeySecret) {this.accessKeySecret = accessKeySecret;}public String getBucketName() {return bucketName;}public void setBucketName(String bucketName) {this.bucketName = bucketName;}public String getPicLocation() {return picLocation;}public void setPicLocation(String picLocation) {this.picLocation = picLocation;}}

 3、SystemConfig

package com.llj.config;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;/*** @PakcageName:com.llj.config* @ClassName:SystemConfig* @Description: 读取config.properties配置文件* @Author:liulianjia* @Date:2021/2/2 16:27*/
public class SystemConfig {private static final String CONFIG_PROPERTIES="config.properties";public static String getConfigResource(String key) throws IOException {ClassLoader loader = Thread.currentThread().getContextClassLoader();Properties properties = new Properties();InputStream in = loader.getResourceAsStream(CONFIG_PROPERTIES);properties.load(in);String value = properties.getProperty(key);// 编码转换,从ISO-8859-1转向指定编码value = new String(value.getBytes("ISO-8859-1"), "UTF-8");in.close();return value;}}

4、OSSUtil

package com.huapu.eng.common.utils;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import com.huapu.eng.common.config.OSSConfig;
import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;/*** @PakcageName:com.llj.util* @ClassName:OssUtil* @Description: OSS工具类* @Author:liulianjia* @Date:2021/2/2 16:34*/
public class OSSUtil {private static OSSConfig config = null;/*** @param fileUrl 需要删除的文件url* @return boolean 是否删除成功* @MethodName: deleteFile* @Description: 单文件删除*/public static boolean deleteFile(String fileUrl) {config = config == null ? new OSSConfig() : config;//根据url获取bucketNameString bucketName = OSSUtil.getBucketName(fileUrl);//根据url获取fileNameString fileName = OSSUtil.getFileName(fileUrl);if (bucketName == null || fileName == null) {return false;}OSSClient ossClient = null;try {ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());GenericRequest request = new DeleteObjectsRequest(bucketName).withKey(fileName);ossClient.deleteObject(request);} catch (Exception oe) {oe.printStackTrace();return false;} finally {ossClient.shutdown();}return true;}/*** @param fileUrls 需要删除的文件url集合* @return int 成功删除的个数* @MethodName: batchDeleteFiles* @Description: 批量文件删除(较快):适用于相同endPoint和BucketName*/public static int deleteFile(List<String> fileUrls) {//成功删除的个数int deleteCount = 0;//根据url获取bucketNameString bucketName = OSSUtil.getBucketName(fileUrls.get(0));//根据url获取fileNameList<String> fileNames = OSSUtil.getFileName(fileUrls);if (bucketName == null || fileNames.size() <= 0) {return 0;}OSSClient ossClient = null;try {ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName).withKeys(fileNames);DeleteObjectsResult result = ossClient.deleteObjects(request);deleteCount = result.getDeletedObjects().size();} catch (OSSException oe) {oe.printStackTrace();throw new RuntimeException("OSS服务异常:", oe);} catch (ClientException ce) {ce.printStackTrace();throw new RuntimeException("OSS客户端异常:", ce);} finally {ossClient.shutdown();}return deleteCount;}/*** @param fileUrls 需要删除的文件url集合* @return int 成功删除的个数* @MethodName: batchDeleteFiles* @Description: 批量文件删除(较慢):适用于不同endPoint和BucketName*/public static int deleteFiles(List<String> fileUrls) {int count = 0;for (String url : fileUrls) {if (deleteFile(url)) {count++;}}return count;}/*** @param file* @return String* @MethodName: putObject* @Description: 上传文件*/public static String putObject(MultipartFile file) throws IOException {//默认nullString url = null;OSSClient ossClient = null;try {config = config == null ? new OSSConfig() : config;String fileName = file.getOriginalFilename();String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());fileName = config.getPicLocation() + UUID.randomUUID().toString().toUpperCase().replace("-", "") + "." + fileType;ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());//MultipartFile 转 FileFile f = new File(Objects.requireNonNull(file.getOriginalFilename()));FileUtils.copyInputStreamToFile(file.getInputStream(), f);InputStream input = new FileInputStream(f);// 创建上传Object的MetadataObjectMetadata meta = new ObjectMetadata();// 设置上传内容类型meta.setContentType(OSSUtil.contentType(fileType));// 被下载时网页的缓存行为meta.setCacheControl("no-cache");//创建上传请求PutObjectRequest request = new PutObjectRequest(config.getBucketName(), fileName, input, meta);ossClient.putObject(request);url = config.getEndpoint().replaceFirst("http://", "http://" + config.getBucketName() + ".") + "/" + fileName;// 会在本地产生临时文件,用完后需要删除if (f.exists()) {f.delete();}} catch (OSSException | ClientException | FileNotFoundException oe) {oe.printStackTrace();return null;} finally {ossClient.shutdown();}return url;}/*** @param "FileType* @return String* @MethodName: contentType* @Description: 获取文件类型*/private static String contentType(String fileType) {fileType = fileType.toLowerCase();String contentType = "";switch (fileType) {case "bmp":contentType = "image/bmp";break;case "gif":contentType = "image/gif";break;case "png":case "jpeg":case "jpg":contentType = "image/jpeg";break;case "html":contentType = "text/html";break;case "txt":contentType = "text/plain";break;case "vsd":contentType = "application/vnd.visio";break;case "ppt":case "pptx":contentType = "application/vnd.ms-powerpoint";break;case "doc":case "docx":contentType = "application/msword";break;case "xml":contentType = "text/xml";break;case "mp4":contentType = "video/mp4";break;default:contentType = "application/octet-stream";break;}return contentType;}/*** @param fileUrl 文件url* @return String bucketName* @MethodName: getBucketName* @Description: 根据url获取bucketName*/private static String getBucketName(String fileUrl) {String http = "http://";String https = "https://";int httpIndex = fileUrl.indexOf(http);int httpsIndex = fileUrl.indexOf(https);int startIndex = 0;if (httpIndex == -1) {if (httpsIndex == -1) {return null;} else {startIndex = httpsIndex + https.length();}} else {startIndex = httpIndex + http.length();}int endIndex = fileUrl.indexOf(".oss-");return fileUrl.substring(startIndex, endIndex);}/*** @param fileUrl 文件url* @return String fileName* @MethodName: getFileName* @Description: 根据url获取fileName*/public static String getFileName(String fileUrl) {String str = "aliyuncs.com/";int beginIndex = fileUrl.indexOf(str);if (beginIndex == -1) {return null;}return fileUrl.substring(beginIndex + str.length());}/*** @param "fileUrl 文件url* @return List<String>  fileName集合* @MethodName: getFileName* @Description: 根据url获取fileNames集合*/private static List<String> getFileName(List<String> fileUrls) {List<String> names = new ArrayList<>();for (String url : fileUrls) {names.add(getFileName(url));}return names;}}

 5、config.properties

endpoint = http://oss-cn-chengdu.aliyuncs.com #自己的oss访问地址
bucketName = llj-blog #自己的bucket名称
picLocation = main/
accessKeyId =  #key
accessKeySecret = #secret

SpringBoot 集成 OSS 对象存储相关推荐

  1. Spring Boot——集成七牛云OSS对象存储SDK解决方案

    基本概念 七牛云OSS对象存储(Kodo):七牛云海量存储系统(Kodo)是自主研发的非结构化数据存储管理平台,支持中心和边缘存储. 平台经过多年大规模用户验证已跻身先进技术行列,并广泛应用于海量数据 ...

  2. SpringBoot集成阿里云存储OSS服务

    前言 该文章会先简单的介绍一下阿里云的OSS存储,然后演示如何在SpringBoot项目中集成OSS,每一步都有记录,保证初学者也能看懂. 文章目录 前言 1.阿里云存储OSS是什么? 2.Sprin ...

  3. Java集成第三方oss对象存储——文档篇

    Java集成第三方oss对象存储--文档篇 相关文章 简介 官方文档 应用场景 Web 配置操作 添加依赖 创建存储空间 相关文章 简介 阿里云对象存储OSS(Object Storage Servi ...

  4. springBoot 整合阿里云OSS对象存储封装实现类

    OSS对象存储 阿里云提供针对各种存储资源(块.文件和对象)的低成本.高可靠.高可用的存储服务,涵盖数据备份.归档.容灾等场景.本文介绍阿里云各类存储服务及特性的适用场景.性能.安全.接口和费用模型等 ...

  5. 十三.SpringCloudAlibaba极简入门-集成阿里云OSS对象存储

    前言 因为在搞项目,需要对接一下OSS,所以一时兴起就做一下整理,本文章讲述的是如何使用阿里云的对象存储作为文件服务器,您需要登录阿里云,注册一个账号. 1.注册登录阿里云 省略- 2.开通OSS对象 ...

  6. 阿里云OSS对象存储-图文详解

    阿里云OSS对象存储 认识OSS 一.创建Bucket 二.后台服务接口编写 三.接口测试 认识OSS 在实际的项目中,经常要用到上传图片的地方,阿里云的OSS对象存储,可以很好的将我们上传的图片存储 ...

  7. SpirngBoot上传图片的两种方式——本地——OSS对象存储

    SpirngBoot实现文件上传功能 Spring Boot实现文件上传功能 1. 文件上传到本地 1.1 核心配置文件application.properties 1.2 文件上传控制层FileCo ...

  8. 阿里云OSS——对象存储服务(工具)

    阿里云OSS--对象存储服务(工具) 一.依赖 二.yaml配置 三.OSS工具类 四.demo演示 4.1 SpringBoot启动类 4.2 Controller接口 4.3 swagger测试 ...

  9. 被七牛云OSS对象存储测试域名回收后正确数据迁移姿势!

    概述 七牛云OSS对象存储bucket创建后有一个「外链默认域名」这个域名, 如果没有记错的2018上半年没有回收这个概念, 2018下半年隐隐约约记录收到过「[七牛云]测试域名回收通知」邮件, 出现 ...

最新文章

  1. python中filenotfounderror_Python3 报错 FileNotFoundError: [WinError 2]
  2. 利用BP神经网络教计算机进行非线函数拟合(代码部分多层)
  3. jQuery-EasyUI异步加载树形菜单
  4. sublime提示There are no packages available for installation解决办法
  5. PyCaret:又一个神仙ML库
  6. 前端学习(2868):vue3数据劫持解析3
  7. Java之mybatis详解(非原创)
  8. eps格式图像空白边缘裁剪
  9. nim语言教程(一)
  10. 关于华硕笔记本重装系统后引起的一些列问题的解决方案
  11. 情人节之Python版冰墩墩
  12. inFace发布618战报:蝉联造型梳TOP1,销售额相比去年双11增长906%
  13. 区块链发展前景究竟怎么样?——三分钟看懂区块链的未来
  14. 区块链如何改变出版商在学术传播中的角色
  15. Nginx报upstream timed out错误
  16. 转:只要心底热爱,人生就会朝着光明的方向转变
  17. 《面朝大海,春暖花开》——海子
  18. 代码规范之Alibaba Java Coding Guidelines
  19. STM32使用ESP8266模块AT指令连接心知天气API获取天气信息
  20. 【JS】问号点和双问号的用法

热门文章

  1. 单链表创建及代码实现对单链表的操作
  2. CALL的原理解析及相关习题
  3. 为啥要放引流条_什么情况不放引流条
  4. flex布局换行盒子上下有缝隙
  5. webpack 打包(plugin、loader 工作原理)
  6. redis的持久化操作
  7. Python浮点数误差与解决方法
  8. 俄罗斯钓鱼4 ——攻略合集
  9. Python openjudge练习:015:计算邮资
  10. mysql报错localhost_MYSQL 'localhost' (10055) 错误!