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

article/2025/11/11 10:31:19

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

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

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

一、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的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);}}

http://chatgpt.dhexx.cn/article/G58YyOxa.shtml

相关文章

文件服务器存储解决方案探索

1 定义 文件服务器(file servers)是一种器件&#xff0c;它的功能就是向服务器提供文件。 它加强了存储器的功能&#xff0c;简化了网络数据的管理。 它一则改善了系统的性能&#xff0c;提高了数据的可用性&#xff0c;二则减少了管理的复杂程度&#xff0c;降低了运营费用。…

SeaWeedFS文件存储服务器搭建

概述 seaweedfs是一个非常优秀的由 golang 开发的分布式存储开源项目。它是用来存储文件的系统&#xff0c;并且与使用的语言无关&#xff0c;使得文件储存在云端变得非常方便。 对应的流程图如下&#xff1a; 同步过程 流程图如下 下载过程 流程图如下 在逻辑上Seaweedfs的几…

免费文件服务器储存技术

当今的云存储技术发展飞快&#xff0c;NAS、网盘、FTP等技术不断升级。对于企业来说&#xff0c;有大量的企业管理信息需要存储&#xff0c;拿网站的上网记录来说&#xff0c;按照安全规定网站需存储用户六个月的上网浏览记录数据&#xff0c;需要专业的NAS、网盘、FTP来进行存…

文件储存服务器推荐,文件储存服务器

文件储存服务器 内容精选 换一换 登录Windows操作系统的弹性云服务器时&#xff0c;需使用密码方式登录。因此&#xff0c;用户需先根据创建弹性云服务器时使用的密钥文件&#xff0c;获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设置…

文件云存储服务器(文件、图片)

文件云服务器 七牛云 public class TestQiniu {// 上传本地文件Testpublic void uploadFile(){//构造一个带指定Zone对象的配置类Configuration cfg new Configuration(Zone.zone0());//...其他参数参考类注释UploadManager uploadManager new UploadManager(cfg);//...生成上…

服务器存储

服务器存储 前言一、开放系统的存储简介1.DAS2.NAS3.SAN4.直连式存储&#xff08;DAS&#xff09;和网络存储&#xff08;NAS、SAN&#xff09;的区别NAS和SAN的区别 二、存储接口简介 前言 存储架构根据服务器类型分为 1、封闭系统的存储&#xff08;此处的封闭系统可理解为一…

Windows Server存储空间配置及文件服务器的搭建

Windows Server存储空间配置及文件服务器的搭建 ❇️技术参考&#xff1a; 存储空间配置及文件服务器的搭建.pdf &#x1f310;一、网络拓扑图 ⚒️环境准备 基础环境级上次实验结束后环境&#xff1a;上次实验 这里的共享存储就使用DC服务器 基础环境的准备&#xff1a; …

Linux根目录结构介绍(FHS文件系统)

目录 1、bin&#xff08;/usr/bin&#xff09; 目录 2、boot目录 3、dev 目录 3.1、/dev/console 3.2、/dev/zero 3.3、/dev/null 3.4、/dev/random 和 /dev/urandom 3.5、/dev/sr0 3.6、/dev/null 4、etc 目录 4.1、/etc/hostname 4.2、/etc/hosts 4.3、/etc/fst…

Linux目录结构简述

一、 Linux概述 Linux是一款开源的操作系统&#xff0c;继承Unix以网络为核心的设计思想&#xff0c;是一个多用户的网络操作系统。 二、Linux文件和目录结构 1、Linux文件 在Linux操作系统里&#xff0c;一切皆文件。 2、Linux目录结构 Linux目录结构简介&#xff1a; ①/…

Linux目录结构与功能——详解

目录 Linux 系统目录结构 Linux 系统目录结构的功能 Linux 系统目录结构 1.查看目录结构的命令 ls / 2.树状目录结构 3.文件或目录的表达方法 在 Linux 或 Unix 操作系统中&#xff0c;所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。 文件系统的最顶层是由…

Linux目录结构及其内容

Linux目录结构及其内容 在早期的UNIX系统中&#xff0c;关于某个文件应该放在哪个目录下的问题&#xff0c;各个发行版都有自己的观点。为了避免产生混乱&#xff0c;在Linux面世不久后就开始了对Linux文件系统的标准活动。Linux文件系统标准FSSTND于1994年推出&#xff0c;之…

【Linux】-Linux目录结构及文件基本操作

Linux目录结构及文件基本操作 Ⅰ Linux目录与Windows目录の差异Ⅱ Linux目录——FHS标准Ⅲ 目录路径A. 切换路径B. 绝对路径C. 相对路径 Ⅳ 文件基本操作A. 新建a. 新建空白文件b. 新建目录 B. 复制a. 复制文件b. 复制目录 C. 删除a. 删除文件b. 删除目录 D. 移动文件&文件…

Linux目录结构的功能

1、文件目录的含义&#xff1a; 1.1、/bin/与/sbin/&#xff1a;bin代表的普通用户使用的命令&#xff1b;/sbin/代表root管理员用户使用的命令。 1.2、/root/与/home/&#xff1a;/root/代表管理员的家目录&#xff1b;/home/代表普通用户的家目录。 1.3、/ues/&#xff1a…

Linux目录结构全解(非常详细)

1. 树状目录结构图 2. /目录说明 目录星级描述/★★★★★第一层次结构的根、整个文件系统层次结构的根目录。/bin★★★★★常用的二进制命令所在的目录,如:ls,cp,mkdir rm等命令. /bin目录和usr/bin类似/boot★★★1. Linux的内核以及引导系统程序所需的文件目录 ; 2.是启动…

Linux目录结构和文件命令

前言&#xff1a;Hello! 我是每天都要敲代码&#xff01;目前在和比特蛋哥重温一下Linux基础&#xff1b;毕竟每个大佬讲的课都有一些不同&#xff1b;虽然蛋哥的课程很少&#xff0c;但是干货也挺多的&#xff0c;等跟着蛋哥学习完这些课&#xff0c;就再更新一些我以前所学的…

【详细】Linux目录结构

1、基本介绍 Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层结构是根目录 “/”&#xff0c;然后在此目录下再创建其他的目录。 在Linux世界里&#xff0c;一切皆文件。 2、目录树的具体介绍 &#xff08;1&#xff09;/ 根目录 根目录 “/” 处在…

Linux目录结构及目录存放详细解释

原文链接&#xff1a;Linux系统下的目录树结构_yimisiyang-CSDN博客_linux目录树结构 FHS标准 FHS标准全称是Filesystem Hierarchy Standard,其目的是希望用户可以了解到已安装软件通常放置在哪个目录下面&#xff0c;因此希望独立的软件开发商、操作系统制作者、维护系统的用…

Linux目录结构说明

1. 根目录 当我们查看Linux系统的根目录时&#xff0c;会发现有很多目录我们并不清楚其含义。 以下是对这些目录的解释&#xff1a; /bin&#xff1a; bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里存放的是启动 Linux 时使…

Linux第一章:4.Linux目录结构解析

一、基本介绍 1.linux文件系统采用了树状目录结构&#xff0c;最上层是根目录 / 2.在 linux 中&#xff0c;一切皆文件 3.图解&#xff1a; 二、目录结构 1./bin binary&#xff0c;二进制的缩写&#xff0c;里面存放着常用命令 2./sbin super user&#xff0c;存放的是系…

Linux目录结构解释

Linux的目录结构 目录结构及主要内容“/”根目录部分有以下子目录&#xff1a; /usr 目录包含所有的命令、程序库、文档和其它文件。这些文件在正常操作中不会被改变的。这个目录也包含你的 Linux 发行版本的主要的应用程序。/var 目录包含在正常操作中被改变的文件&#xff…