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

news2025/7/10 18:52:18

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

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

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

一、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、引入阿里依赖

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

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的Metadata
      ObjectMetadata 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*10
    Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
    // 生成URL
    URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
    if (url != null) {
      return url.toString();
    }
    return null;
  }
 
  /**
   * 删除单个文件
   */
  public void delFile(String key){
      ossClient.deleteObject(bucketName, key);
  }
 
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Oracle】Oracle学习笔记

【Oracle】Oracle学习笔记 目录【Oracle】Oracle学习笔记P1、Oracle数据库的安装和配置P2、Oracle数据库管理P3-0、初步SQLP3-1、基本SQL SELECT语句课程学习链接&#xff1a; 【尚硅谷】Oracle数据库全套教程&#xff0c;oracle从安装到实战应用 P1、Oracle数据库的安装和配置…

学python以后做什么工作

python是一门很好的编程语言&#xff0c;很多人都在学&#xff0c;那么学完python以后能做什么工作呢&#xff1f;下面小编给大家总结一下。 软件开发&#xff0c;用python做软件是很多人正在从事的工作&#xff0c;不管是B/S软件&#xff0c;还是C/S软件&#xff0c;都能做。…

【自动化测试入门基础知识】离月薪15k的自动化工程师又进了1步

一、首先&#xff0c;什么是自动化测试&#xff1f; 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的过程一步步执行测试&#xff0c;得到实际结果与期望结果的比较…

Idea 报Error:java:无效的源发行版13

今天运行远程克隆的项目&#xff0c;发现报错为Idea 报Error:java:无效的源发行版13。 主要的原因就是克隆的项目和自己idea的jdk版本不一致。 java无效的源发行版13一、查看jdk版本1、file--setting2、找到java compiler3、选择file---project structure4、选择1.8jdk和85、这…

day06-表单标签及属性

文章目录一、知识回顾&#xff1a;二、单元内容6.1 表单标签6.1.1 表单标签 生活中的表单&#xff1a;网页中的表单&#xff1a;程序员中的表单&#xff1a;运行结果&#xff1a;6.2 表单标签的输入标记6.2.1 表单的文本框和密码框输入标记及提示信息属性文本框 密码框6.2.2 表…

疫情之下,文科生转行学编程靠不靠谱?

毕业季越来越近了&#xff0c;突发的疫情将可能让2023年成为最难就业年&#xff01;居危思变&#xff0c;在大环境不好的背景下&#xff0c;很多毕业生都准备暂时先不考虑就业&#xff0c;而是继续加强技能学习&#xff0c;待形势好转再继续找工作&#xff01;而说起当前各行业…

【蓝桥杯】第10届Scratch国赛第6题程序1 -- 捉迷藏

[导读]:蓝桥杯大赛是工业和信息化部人才交流中心举办的全国性专业信息技术赛事。蓝桥杯大赛首席专家倪光南院士说:“蓝桥杯以考促学,塑造了领跑全国的人才培养选拨模式,并获得了行业的深度认可。” 春雷课堂计划推出Scratch蓝桥杯真题解析100讲,这是春雷老师解读Scratch蓝…

Vue3组件化开发(⼀)(二) | webpack

文章目录Vue3组件化开发&#xff08;⼀&#xff09;&&#xff08;二&#xff09;Vue3的表单和开发模式v-model的基本使用原理vue的开发模式浅学webpackwebpack基础打包认识webpackwebpack安装基本打包webpack局部安装和打包webapck 依赖图css-loaderstyle-loaderless-loade…

Word控件Spire.Doc 【超链接】教程(8):在 C#/VB.NET 中链接到 Word 文档中的书签

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

如何给视频添加水印?这三个加水印的方法让你实现

水印其实就是一种标记&#xff0c;例如公司的名称、品牌名称或者logo&#xff0c;它可以给我们制作的东西起到保护版权的作用&#xff0c;除此之外&#xff0c;它还能起到品牌宣传的作用。所以很多人在发布视频之前&#xff0c;都会在视频上面添加一个或多个专属的水印&#xf…

经验:工具在接口测试中发挥什么样的作用?

接口测试究竟是什么&#xff1f;为什么要用接口测试&#xff1f;它有哪些工具呢&#xff1f;这一连串的问题敲击着我们&#xff0c;请带着这些问题&#xff0c;在本文中寻找答案&#xff0c;我将为您打开接口测试的大门。 1 初探接口测试 接口测试是什么。它检查数据的交换&a…

准备了1个月,面试字节跳动测试工程师“凉经”分享

3月份参加了字节跳动测试工程师的面试&#xff0c;前几天收到的字节跳动测试工程师的拒信&#xff0c;我再一次被扔到人才库了 我此时的心情就是很复杂就是从3月份中旬&#xff0c;我得知我的简历被捞起来之后&#xff0c;我的心情特别高兴&#xff0c;然后把面试时间约到了3月…

C++进阶 多态原理

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍C中多态的概念 多态原理多态的原理虚函数表多态的原理为什么对象不能构成多态动态绑定和静态绑定继承多态面试题概念题问答题总…

【SpringBoot+Redis】实现多端登录+token自动续期和定期刷新+自定义注解和拦截器实现鉴权(角色和权限校验)

目录前言思路1、登录、token相关2、鉴权相关实现一、登录1、先定义一个Component组件2、登录、退出二、鉴权、token相关1、自定义注解2、拦截器鉴权、token续期和定期刷新3、新增/更新角色时&#xff0c;更新redis中角色对应的权限4、更新菜单权限标识时&#xff0c;更新redis中…

优优聚:美团成立机器人研究院!

美团成立机器人研究院 不用出门走路购买生活必须品&#xff0c;也不用等待几天的快递时间&#xff0c;现在的消费者越来越习惯“外卖点一切”、半小时送达的购物方式。 在即时零售市场中&#xff0c;美团&#xff0c;无疑是当下的焦点。 万万没想到的是&#xff0c;“外卖送一…

Java+MySQL基于SSM的二手玩具交换网站

本二手玩具交换网站主要包括系统用户管理模块、商品信息管理模块、所有购买记录、订单信息、登录模块、和退出模块等多个模块。它帮助二手玩具交换实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了二手玩具交换数据资源,有效的减少了二…

转行IT,女生学编程有前途吗?

一直以来&#xff0c;IT行业对技术的高要求让人们把这个行业标签为男生专属&#xff0c;从前只有个别女生顶着强大的压力、身边人的不理解坚守在IT岗位。 近些年随着互联网科技的发展与普及&#xff0c;很多女孩子发现原来IT技术没有自己想象中难&#xff0c;而且还可以毕业拿高…

Java项目:springboot课程自动排课系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 课程自动排课系统&#xff0c;该系统分两种角色&#xff1a;管理员与普通用户&#xff1b; 主要功能包括&#xff1a; 首页&#xff1a;查看分…

【运维有小邓】AD域权限报表

企业需要每天都警惕内部攻击和间谍等重大安全威胁。防范潜在的攻击者对保护组织的网络和数据大有裨益。但是&#xff0c;要实现此目标&#xff0c;还需满足几点。您必须完全了解分配给Windows Active Directory (AD)中用户和组的权限&#xff0c;它们可访问的帐户、资源和数据&…

java学习day64(乐友商城)Elasticsearch

1.Elasticsearch介绍和安装 用户访问我们的首页&#xff0c;一般都会直接搜索来寻找自己想要购买的商品。 而商品的数量非常多&#xff0c;而且分类繁杂。如何能正确的显示出用户想要的商品&#xff0c;并进行合理的过滤&#xff0c;尽快促成交易&#xff0c;是搜索系统要研究…