文章目录

  • 1、什么是分布式文件系统
  • 2、图片存储解决方案
  • 3、阿里云OSS对象存储
    • 3.1、开通oss访问
    • 3.2、购买服务
    • 3.3、基本概念
    • 3.4、创建一个bucket
    • 3.5、创建AccessKey
    • 3.6、设置跨域规则
    • 3.7、SDK官方文档
  • 4、阿里云OSS项目通用封装
    • 4.1、导包
    • 4.2、创建配置文件oss.properties
    • 4.3、创建配置类OSSProperties
    • 4.4、在次创建配置类
      • 4.4.1、方案1 服务思想:创建OSSConfig
      • 4.4.2、方案2 Template思想:创建OssTemplate(方案二到4.4.2结束,后面4.5是方案一延续)
    • 4.5、方案1延续,创建OSSService

1、什么是分布式文件系统

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。

通俗来讲:

  • 传统文件系统管理的文件就存储在本机。
  • 分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问

常见的分布式文件系统有谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)、Fast DFS(淘宝)等。

不过,企业自己搭建分布式文件系统成本较高,对于一些中小型企业而言,使用云上的文件存储,是性价比更高的选择。

2、图片存储解决方案

实现图片上传服务,需要有存储的支持,那么我们的解决方案将以下几种:

  • 直接将图片保存到服务的硬盘:
  1. 优点:开发便捷,成本低
  2. 缺点:扩容困难
  • 使用分布式文件系统进行存储:
  1. 优点:容易实现扩容
  2. 缺点:开发复杂度稍大(有成熟的产品可以使用,比如:FastDFS)
  • 使用第三方的存储服务:
  1. 优点:开发简单,拥有强大功能,免维护
  2. 缺点:付费(华为OBS、阿里OSS、七牛云等)

3、阿里云OSS对象存储

阿里的OSS就是一个文件云存储方案:官网地址-- https://www.aliyun.com/product/oss

简介:

阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于99.999999999%,服务设计可用性不低于99.99%。具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

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

3.1、开通oss访问

首先登陆阿里云,然后找到对象存储的产品:

点击进入后,开通服务:

随后即可进入管理控制台:

3.2、购买服务

使用第三方服务最大的缺点就是需要付费,下面,我们看下如何购买开通服务。

标准(LRS)存储包

下行流量包(这里价格过高,学习期间不建议购买)

  • 说明:由于购买了OSS的存储包上行流量是免费的,但是下行流量是需要购买的

可以根据访问量进行扣费

3.3、基本概念

OSS中包含一些概念,我们来认识一下:

  • 存储类型(Storage Class)

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

  • 存储空间(Bucket)

    存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。您可以设置和修改存储空间属性用来控制地域、访问权限、生命周期等,这些属性设置直接作用于该存储空间内所有对象,因此您可以通过灵活创建不同的存储空间来完成不同的管理功能。

  • 对象/文件(Object)

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

  • 地域(Region)

    地域表示 OSS 的数据中心所在物理位置。您可以根据费用、请求来源等综合选择数据存储的地域。详情请参见OSS已开通的Region。

  • 访问域名(Endpoint

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

  • 访问密钥(AccessKey)

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

以上概念中,跟我们开发中密切相关的有三个:

  • 存储空间(Bucket)
  • 访问域名(Endpoint)
  • 访问密钥(AccessKey):包含了AccessKeyId 和AccessKeySecret。

3.4、创建一个bucket

在控制台的右侧,可以看到一个新建Bucket按钮:

点击后,弹出对话框,填写基本信息:

注意点:

  • bucket:存储空间名称,名字只能是字母、数字、中划线
  • 区域:即服务器的地址,这里选择了上海
  • Endpoint:选中区域后,会自动生成一个Endpoint地址,这将是我们访问OSS服务的域名的组成部分
  • 存储类型:默认
  • 读写权限:这里我们选择公共读,否则每次访问都需要额外生成签名并校验,比较麻烦。敏感数据不要请都设置为私有!
  • 日志:不开通

3.5、创建AccessKey

有了bucket就可以进行文件上传或下载了。不过,为了安全考虑,我们给阿里云账户开通一个子账户,并设置对OSS的读写权限。

点击屏幕右上角的个人图像,然后点击访问控制:

在跳转的页面中,选择用户,并新建一个用户:

然后填写用户信息:

然后会为你生成用户的AccessKeyID和AccessKeySecret:

妥善保管,不要告诉任何人!

接下来,我们需要给这个用户添加对OSS的控制权限。

进入这个新增的用户详情页面:

点击添加权限,会进入权限选择页面,输入oss进行搜索,然后选择管理对象存储服务(OSS)权限:

3.6、设置跨域规则

如果需要设置跨域访问,在这里设置的阿里云的跨域规则

3.7、SDK官方文档

阿里云OSS云存储的SDK示例地址

4、阿里云OSS项目通用封装

在企业中阿里云OSS需要在项目中多个地方应用,所以把阿里云OSS封装到通用的模块中,方便后期各个模块引用。

4.1、导包

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

4.2、创建配置文件oss.properties

resources新建文件oss.properties

aliyun.oss.accessKeyId=LXXXXXXXXXXxw
aliyun.oss.accessKeySecret=lXXXXXXXXXXXXXXXXXXu
aliyun.oss.endpoint=https://oss-cn-beijing.aliyuncs.com
aliyun.oss.bucket=nanmu-image-study
aliyun.oss.host=https://myth.oss-cn-beijing.aliyuncs.com

4.3、创建配置类OSSProperties

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;@Data
@PropertySource("oss.properties")
@ConfigurationProperties(prefix = "aliyun.oss")
@Component
public class OSSProperties {private String accessKeyId;private String accessKeySecret;private String bucket;private String host;private String endpoint;
}

4.4、在次创建配置类

4.4.1、方案1 服务思想:创建OSSConfig

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class OSSConfig {@Beanpublic OSS ossClient(OSSProperties properties) {return new OSSClientBuilder().build(properties.getEndpoint(), properties.getAccessKeyId(), properties.getAccessKeySecret());}
}

4.4.2、方案2 Template思想:创建OssTemplate(方案二到4.4.2结束,后面4.5是方案一延续)

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;public class OssTemplate {private OssProperties ossProperties;public OssTemplate(OssProperties properties) {this.ossProperties = properties;}public String upload(String fileName, InputStream inputStream) {// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = ossProperties.getEndpoint();// 云账号AccessKey有所有API访问权限,String accessKeyId = ossProperties.getAccessKey();String accessKeySecret = ossProperties.getSecret();// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 上传文件流。// <yourObjectName>表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如 images/2020/11/11/asdf.jpg。String objectName = "images/" + new SimpleDateFormat("yyyy/MM/dd").format(new Date())+ "/" + System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf("."));// meta设置请求头,解决访问图片地址直接下载ObjectMetadata meta = new ObjectMetadata();meta.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));ossClient.putObject(ossProperties.getBucketName(), objectName, inputStream,meta);// 关闭OSSClient。ossClient.shutdown();return ossProperties.getUrl() + "/" + objectName;}public  String getContentType(String FilenameExtension) {if (FilenameExtension.equalsIgnoreCase(".bmp")) {return "image/bmp";}if (FilenameExtension.equalsIgnoreCase(".gif")) {return "image/gif";}if (FilenameExtension.equalsIgnoreCase(".jpeg") ||FilenameExtension.equalsIgnoreCase(".jpg") ||FilenameExtension.equalsIgnoreCase(".png")) {return "image/jpg";}return "image/jpg";}}

方案二需要注意:注入bean

 @Beanpublic OssTemplate ossTemplate(OssProperties ossProperties) {return new OssTemplate(ossProperties);}

4.5、方案1延续,创建OSSService

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.PutObjectRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;@Service
public class OSSService {@Autowiredprivate OSSProperties prop;@Autowiredprivate OSS ossClient;// 支持的文件类型private static final List<String> suffixes = Arrays.asList("image/png", "image/jpeg", "image/bmp");/*** 本地上传** @param file* @return*/public String upload(MultipartFile file) throws Exception {// 检查文件类型是否支持String contentType = file.getContentType();if (!suffixes.contains(contentType)) {throw new Exception("不支持文件类型");}// 检查当前文件是否是图片,使用java提供的ImageIO工具try {BufferedImage bufferedImage = ImageIO.read(file.getInputStream());if (bufferedImage == null) {throw new Exception("不支持文件类型");}// 原文件名String originalFilename = file.getOriginalFilename();// 获取文件的后缀String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));// 构造新的文件名,名字不重复String newFileName = UUID.randomUUID().toString() + suffix;// 上传文件InputStream inputStream = file.getInputStream();PutObjectRequest putObjectRequest = new PutObjectRequest(prop.getBucket(), newFileName, inputStream);ossClient.putObject(putObjectRequest);// https://XXX.oss-cn-beijing.aliyuncs.com/XXXXXX.jpgString url = prop.getHost() + "/" + newFileName;return url;} catch (IOException e) {e.printStackTrace();throw new Exception("上传文件失败");}}/*** 删除文件** @param url* @return*/public String deleteFile(String url) {String objectName = url.replace(prop.getHost() + "/", "");ossClient.deleteObject(prop.getBucket(), objectName);return "删除成功";}
}

6、阿里云OSS对象存储手把手学习及企业使用方案相关推荐

  1. java oss 批量传输_阿里云OSS对象存储,服务端签名后直传阿里云OSS

    继续上一章文章,这次要操作的是,浏览器请求服务要到签名后直传给OSS对象存储. 1.写好服务端的方法,传给前台相应的密钥 @Resource OSSClient ossClient; @Value(& ...

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

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

  3. 【Typora图床设置】Typora图片上传和阿里云OSS对象存储

    问题描述 因为Typora是纯文本编辑器,所以无法导入图片,但是可以显示图片.换句话说,Typora文档中保存的图片实际上是图片的存储地址,Typora会根据这个地址来显示图片.我们在使用Typora ...

  4. 宝塔面板如何将数据自动备份到阿里云OSS对象存储

    首先我们需要购买阿里云OSS对象存储的容量包,价格一般不贵. 操作步骤: 先新建一个bucket,也叫做桶,用来装你的备份数据,权限设置为私有. 接着,在宝塔面板后台安装阿里云OSS,填写相关信息 接 ...

  5. 【阿里云OSS对象存储搭配CDN加速使用】

    阿里云OSS对象存储搭配CDN加速使用 什么是CDN? 为什么选择阿里云CDN? 按流量计费说明 CDN按流量计费费如下: OSS外网流出流量标准收费如下: 步骤一:准备工作 步骤二.开通CDN 涉及 ...

  6. 阿里云OSS对象存储搭建网盘教程

    阿里云OSS对象存储高可靠数据存储服务,使用OSS对象存储搭建个人网盘或企业网盘,存储可靠性高下载不限速,当然阿里云推出了自家的网盘,码笔记分享使用OSS对象存储搭建个人网盘或企业网盘的方法: 使用O ...

  7. 阿里云oss对象存储实现自定义域名

    阿里云oss对象存储实现自定义域名 阿里云OSS配置域名 创建bucket 选择bucket,找到对应的域名管理,绑定用户域名 测试是否成功 参考博客 阿里云OSS域名配置及简单上传

  8. 5分钟解决阿里云oss对象存储

    5分钟解决阿里云OSS对象存储 后附关键代码 启动代码如下: pom.xml里添加依赖 com.aliyun.oss aliyun-sdk-oss 2.8.3 1.建类AliyunOSSClientU ...

  9. Java使用阿里云OSS对象存储上传图片

    示例说明   该案例是OSS Java SDK的示例程序,您可以修改endpoint.accessKeyId.accessKeySecret.bucketName后直接运行. 本示例中的并不包括OSS ...

最新文章

  1. java basicstroke_使用java.awt.BasicStroke动画化虚线
  2. 宏基因组理论教程7挖掘微生物组生物标记
  3. 投资圈中的“错过”之美:被大佬拒绝之后,他们成为了首富
  4. php $this self,php this self 用法与区别
  5. html 下拉框字体,怎么把select下拉菜单里的文字设置成左右滚动效果
  6. 阿里云边缘容器服务、申通 IoT 云边端架构入选 2021 云边协同发展阶段性领先成果
  7. C# MemoryStream先写后读的奇怪现象
  8. linux文件-link函数(文件硬链接和软连接)
  9. JZOJ 5421. 【NOIP2017提高A组集训10.25】嘟嘟噜
  10. 大数据实训报告_2019公路货运大数据报告发布:运输结构持续优化 大数据优势愈发明显...
  11. S5PV210裸机之SDRAM
  12. emacs .emacs_使用Emacs进行社交并跟踪您的待办事项列表
  13. 观看直播 | IoT in Action 微软深圳物联网大会开幕在即,精彩不打烊
  14. 49. Element removeAttribute() 方法
  15. 元素偏移量offset系列(附实例)
  16. Visual Studio助手VAssistx各版本破解教程
  17. Android Property
  18. 从音视频技术看AI的机会和挑战
  19. 6:求指定范围内的素数
  20. HTML5不支持createtouch,新手写createjs时容易遇到的坑(持续更新)

热门文章

  1. 测试覆盖率工具:EclEmma
  2. 解决输入框光标不显示
  3. Android 汉语转拼音
  4. allegro编辑brd档如何添加一个编辑好的brd档的部分元器件到另一个brd档
  5. 从科学管理到丰田生产模式,精益是如何产生的?
  6. MYSQL POLARDB 学习系列之 拆解 POLARDB 6 Auto-Scaling 与性能优化 (翻译)
  7. ffmpeg 音视频分离、合成
  8. 泛微 e-office v9.0任意文件上传漏洞{CNVD-2021-49104}
  9. VideoView实现安卓视频播放
  10. gtalk 源码分析