热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaOSS对象存储服务(ObjectStorageService,简称OSS)文件服务器

一个成熟的技术架构要有一定的分离性,平台级的产品一般会这么分:应用服务器、数据库服务器、文件服务器。一般文件、数据库、应用服务器,都应该做

一个成熟的技术架构要有一定的分离性, 平台级的产品一般会这么分:应用服务器、数据库服务器、文件服务器。一般文件、数据库、应用服务器,都应该做逻辑和物理的分离。

以前我们想要做文件上传可能要自己去搭建一个专门的服务器,然后将我们的文件上传到这个服务器上,下载就从我们这个服务器上去进行下载就行了。

但是现在随着技术的发展,像阿里这样的公司给我们开发了好多一些专门的服务器来干这样的事情,根本不用我们自己再去搭建服务器,这样用起来确实可以省很多的事情,我们要做的只是购买一台云服务器,将配置参数配置配置就可以实现文件的上传与下载。


一、OSS对象存储服务(Object Storage Service,简称 OSS)文件服务器

大家要注意以下区分


OOS面向对象存储(Object-Oriented Storage,OOS)

OSS,它就是阿里推出的一款云服务器,专门用来做文件存储的,OSS它的存储结构是对象存储,一个key-value的存储结构,它是支持任何非结构化(图片,视频,文件)数据的存储

对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。OSS 类似于网盘,可以作为网站、app等web应用:包含附件

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

OSS服务可作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,

OSS与文件系统的对比

OSS 是一个分布式的对象存储服务,提供的是一个 Key-Value 对形式的对象存储服务。用户可以根据 Object 的名称(Key)唯一的获取该Object的内容。

虽然用户可以使用类似 test1/test.jpg 的名字,但是这并不表示用户的 Object 是保存在test1 目录下面的。对于 OSS 来说,test1/test.jpg 仅仅只是一个字符串,和a.jpg 这种并没有本质的区别。

因此不同名称的 Object 之间的访问消耗的资源是类似的


1、OSS与自建存储对比


对象存储OSS自建服务器存储
可靠性OSS作为阿里巴巴全集团数据存储的核心基础设施,多年支撑双11业务高峰,历经高可用与高可靠的严苛考验。OSS的多重冗余架构设计,为数据持久存储提供可靠保障。同时,OSS基于高可用架构设计,消除单节故障,确保数据业务的持续性。服务设计可用性不低于99.995%。数据设计持久性不低于99.9999999999%(12个9)。规模自动扩展,不影响对外服务。数据自动多重冗余备份受限于硬件可靠性,易出问题,一旦出现磁盘坏道,容易出现不可逆转的数据丢失。人工数据恢复困难、耗时、耗力
安全性 提供企业级多层次安全防护,包括服务端加密、客户端加密、防盗链、IP黑白名单、细粒度权限管控、日志审计、WORM特性等。多用户资源隔离机制,支持异地容灾机制。获得多项合规认证,包括SEC和FINRA 等,满足企业数据安全与合规要求需要另外购买清洗和黑洞设备。需要单独实现安全机制
成本多线BGP骨干网络,无带宽限制,上行流量免费。无需运维人员与托管费用,0成本运维存储受硬盘容量限制,需人工扩容。单线或双线接入速度慢,有带宽限制,峰值时期需人工扩容。需专人运维,成本高
智能存储提供多种数据处理能力,如图片处理、视频截帧、文档预览、图片场景识别、人脸识别、SQL就地查询等,并无缝对接Hadoop生态、以及阿里云函数计算、EMR、DataLakeAnalytics、BatchCompute、MaxCompute、DBS等产品,满足企业数据分析与管理的需求需要额外采购,单独部署

2、应用场景

图片和音视频等应用的海量存储

网页或者移动应用的静态和动态资源分离云 

云端数据处理 


3、计量计费

阿里云对象存储 OSS 服务费用的各项组成部分及计费方式分为按量计费和包年包月两种。

按量付费:按实际使用量*单价的方式计费,每小时统计前一小时的实际用量并从账户余额中扣除实际消费金额。例如当前时间是 9:30,结算的是 8:00-9:00 产生的费用 。

包年包月:预先购买指定资源包,之后使用资源时,扣除相应的额度。一般情况下,包年包月比按量付费更加优惠。资源包目前仅提供标准(LRS)存储包、低频(LRS)存储包、归档(LRS)存储包、标准(ZRS)存储包、低频(ZRS)存储包、下行流量包、 回源流量包、传输加速包,可购买地域请参见购买对象存储 OSS 资源包


4、存储空间(Bucket)

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

同一个存储空间的内部是扁平的,没有文件系统目录的概念,所有的对象都直接隶属于其对应的存储空间。
每个用户可以拥有多个存储空间。
存储空间的名称在 OSS 范围内必须是全局唯一的,一旦创建之后无法修改名称。
存储空间内部的对象数目没有限制。
存储空间的命名规范如下:

只能包括小写字母、数字和短横线(-)。
必须以小写字母或者数字开头和结尾。
长度必须在 3–63 字节之间


5、对象/文件(Object)

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

对象的生命周期是从上传成功到被删除为止。在整个生命周期内,只有通过追加上传的Object 可以继续通过追加上传写入数据,其他上传方式上传的 Object 内容无法编辑,您可以通过重复上传同名的对象来覆盖之前的对象。

对象的命名规范如下:

使用 UTF-8 编码
长度必须在 1–1023 字节之间。
不能以正斜线(/)或者反斜线(\)开头


6、Region(地域)

Region 表示 OSS 的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的 Region 访问速度更快。
Region 是在创建 Bucket 的时候指定的,一旦指定之后就不允许更改。该 Bucket 下所有的 Object 都存储在对应的数据中心,目前不支持 Object 级别的 Region 设置


7、Endpoint(访问域名)

Endpoint 表示 OSS 对外服务的访问域名。OSS 以 HTTP RESTful API 的形式对外提供服务,当访问不同的 Region 的时候,需要不同的域名。通过内网和外网访问同一个 Region 所需要的 Endpoint 也是不同的。例如杭州 Region 的外网 Endpoint 是 oss-cn-hangzhou.aliyuncs.com,内网 Endpoint 是 osscn-hangzhou-internal.aliyuncs.com


8、AccessKey(访问密钥)

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

Bucket 的拥有者申请的 AccessKey。
被 Bucket 的拥有者通过 RAM 授权给第三方请求者的 AccessKey
被 Bucket 的拥有者通过 STS 授权给第三方请求者的 AccessKey


注意::

可以登录阿里云官网-“用户中心” -“我的帐户” -“安全认证” 获取 Access Key ID 和 Access KeySecret,一个阿里云帐号可以生成 5 对 Access Key ID 和 Access Key Secret。并支持启用/禁用设置



9、Service

OSS 提供给用户的虚拟存储空间,在这个虚拟空间中,每个用户可拥有一个到多个Bucket


二、文件上传到OSS文件服务器

1、引入阿里依赖

com.aliyun.ossaliyun-sdk-oss3.10.2

2、代码工具类

阿里云OSS  封装的工具类

package com.xx.utils;import java.io.*;
import java.net.URL;
import java.util.Date;
import java.util.Random;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;/*** 阿里云 OSS文件类 参考文档 https://help.aliyun.com/product/31815.html?spm=5176.750001.2.8.SZvzsM*/
public class OssClienUtils {Log log = LogFactory.getLog(OssClienUtils.class);// endpoint以杭州为例,其它region请按实际情况填写private String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";// accessKey和accessKeySecret 为购买阿里云服务时官方提供private String accessKeyId = "LTAIuB5R5******";private String accessKeySecret = "56DOZQ2yRPE8n*****";//空间private String bucketName = "image";//文件存储目录 (上传时在key前面加上目录 默认创建)private String date = "img/";private OSSClient ossClient;public OssClienUtils() {ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);}/*** 销毁*/public void destory() {ossClient.shutdown();}/*** 上传图片 直接获取本地资源路径** @param url* @throws Exception*/public void uploadImg2Oss(String url) throws Exception {File fileOnServer= new File(url);FileInputStream fin;try {fin = new FileInputStream(fileOnServer);String[] split = url.split("/");this.uploadFile2OSS(fin, split[split.length - 1]);} catch (FileNotFoundException e) {throw new Exception("图片上传失败");}}/*** 上传图片* @param file* @return key 可根据key获取上到到服务器的志愿和删除等操作* @throws Exception*/public String uploadImg2Oss(MultipartFile file,String typeDate) throws Exception {this.date=typeDate;
// if (file.getSize() > 1024 * 1024) {
// throw new Exception("上传图片大小不能超过1M!");
// }String originalFilename = file.getOriginalFilename();String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();Random random = new Random();String name = random.nextInt(10000) + System.currentTimeMillis() + substring;try {InputStream inputStream = file.getInputStream();this.uploadFile2OSS(inputStream, name);return name;} catch (Exception e) {throw new Exception("图片上传失败");}}/*** 上传到OSS服务器 如果同名文件会覆盖服务器上的** @param instream 文件流* @param fileName 文件名称 包括后缀名* @return 出错返回"" ,唯一MD5数字签名*/public String uploadFile2OSS(InputStream instream, String fileName) {String ret = "";try {//创建上传Object的MetadataObjectMetadata objectMetadata = new ObjectMetadata();objectMetadata.setContentLength(instream.available());objectMetadata.setCacheControl("no-cache");objectMetadata.setHeader("Pragma", "no-cache");objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));objectMetadata.setContentDisposition("inline;filename=" + fileName);//上传文件PutObjectResult putResult = ossClient.putObject(bucketName, date + fileName, instream, objectMetadata);ret = putResult.getETag();} catch (IOException e) {log.error(e.getMessage(), e);} finally {try {if (instream != null) {instream.close();}} catch (IOException e) {e.printStackTrace();}}return ret;}/*** 获得图片路径** @param fileUrl* @return*/public String getImgUrl(String fileUrl) {if (!StringUtils.isEmpty(fileUrl)) {String[] split = fileUrl.split("/");return this.getUrl(this.date + split[split.length - 1]);}return null;}/*** Description: 判断OSS服务文件上传时文件的contentType** @param FilenameExtension 文件后缀* @return String*/public static 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/jpeg";}if (FilenameExtension.equalsIgnoreCase("html")) {return "text/html";}if (FilenameExtension.equalsIgnoreCase("txt")) {return "text/plain";}if (FilenameExtension.equalsIgnoreCase("vsd")) {return "application/vnd.visio";}if (FilenameExtension.equalsIgnoreCase("pptx") ||FilenameExtension.equalsIgnoreCase("ppt")) {return "application/vnd.ms-powerpoint";}if (FilenameExtension.equalsIgnoreCase("docx") ||FilenameExtension.equalsIgnoreCase("doc")) {return "application/msword";}if (FilenameExtension.equalsIgnoreCase("xml")) {return "text/xml";}return "image/jpeg";}/*** 获得url链接** @param key* @return*/public String getUrl(String key) {// 设置URL过期时间为10年 3600l* 1000*24*365*10Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);// 生成URLURL url = ossClient.generatePresignedUrl(bucketName, key, expiration);if (url != null) {return url.toString();}return null;}/*** 删除单个文件*/public void delFile(String key){ossClient.deleteObject(bucketName, key);}}

推荐阅读
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
  • 本文详细介绍如何使用Netzob工具逆向未知通信协议,涵盖从基本安装到高级模糊测试的全过程。通过实例演示,帮助读者掌握Netzob的核心功能。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • 本文介绍了Memcached分布式集群中的取模算法和一致性哈希算法的原理及其对缓存命中率的影响。通过详细分析,探讨了如何优化这些算法以提高系统的稳定性和性能。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
author-avatar
零泉爱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有