首页 > 其他分享 >自己搭一个 OSS 服务,和阿里云的一毛一样

自己搭一个 OSS 服务,和阿里云的一毛一样

时间:2024-02-04 12:32:33浏览次数:25  
标签:文件 minio OSS 阿里 一毛 上传 png

文件上传是常见需求,一般我们不会直接把文件保存在服务器的某个目录下,因为服务器的存储容量是有限的,这样不好扩展。

我们会用 OSS (Object Storage Service)对象存储服务来存文件,它是支持分布式扩展的,不用担心存储容量问题,而且也好管理。

比如阿里云的 OSS 服务。

但是有一些业务场景下,数据需要保密,要求私有部署,也就是要在自己的机房里部署一套 OSS 服务。

这时候怎么办呢?

这种需求一般我们会用 minio 来做。

它可以实现和阿里云 OSS 一样的功能。

首先,我们用一下阿里云的 OSS 服务。

OSS 里的文件是放在一个个 Bucekt(桶)里的:

自己搭一个 OSS 服务,和阿里云的一毛一样_前端

我们创建个 Bucket:

自己搭一个 OSS 服务,和阿里云的一毛一样_上传_02

然后进入文件列表,就可以上传文件了:

自己搭一个 OSS 服务,和阿里云的一毛一样_文件上传_03

因为创建的 Bucket 设置了公共读,所以可以直接访问:

自己搭一个 OSS 服务,和阿里云的一毛一样_前端_04

此外,阿里云 OSS 还可以通过 SDK 来上传文件。

创建个项目:

mkdir minio-test
cd minio-test
npm init -y

自己搭一个 OSS 服务,和阿里云的一毛一样_前端_05

进入项目,安装 ali-oss:

npm install ali-oss

创建 index.js

const OSS = require('ali-oss')

const client = new OSS({
    region: 'oss-cn-beijing',
    bucket: 'guang-666',
    accessKeyId: '',
    accessKeySecret: '',
});

async function put () {
  try {
    const result = await client.put('smile.png', './smile.png');
    console.log(result);
  } catch (e) {
    console.log(e);
  }
}

put();

填入 region、bucket 和 accessKeyId、accessKeySecret

这里的 region 可以从概览里看到:

自己搭一个 OSS 服务,和阿里云的一毛一样_JavaScript_06

acessKey 是在这里看:

自己搭一个 OSS 服务,和阿里云的一毛一样_上传_07

具体创建 accessKey 的流程看上篇文章

然后跑一下:

自己搭一个 OSS 服务,和阿里云的一毛一样_文件上传_08

上传成功之后就可以通过 OSS 服务访问这个图片了:

自己搭一个 OSS 服务,和阿里云的一毛一样_上传_09

也可以通过 sdk 下载图片:

自己搭一个 OSS 服务,和阿里云的一毛一样_前端_10

执行后可以看到,图片被下载下来了:

自己搭一个 OSS 服务,和阿里云的一毛一样_上传_11

这就是阿里云 OSS 的用法。

那我们用 minio 自己搭呢?

首先,我们需要安装 docker 桌面端

自己搭一个 OSS 服务,和阿里云的一毛一样_文件上传_12

打开后可以看到本地的所有镜像和容器:

自己搭一个 OSS 服务,和阿里云的一毛一样_前端_13

搜索下 minio(这步需要科学上网):

自己搭一个 OSS 服务,和阿里云的一毛一样_JavaScript_14

填入一些信息:

自己搭一个 OSS 服务,和阿里云的一毛一样_文件上传_15

name 是容器名。

port 是映射本地 9000 和 9001 端口到容器内的端口。

volume 是挂载本地目录到容器内的目录

这里挂载了一个本地一个目录到容器内的数据目录 /bitnami/minio/data,这样容器里的各种数据都保存在本地了。

还要指定两个环境变量,MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD,是用来登录的。

点击 run,跑起来之后可以看到数据目录被标记为 mounted,端口也映射成功了:

自己搭一个 OSS 服务,和阿里云的一毛一样_Node.js_16

访问下 http://localhost:9001

输入刚才环境变量填的用户名密码:

自己搭一个 OSS 服务,和阿里云的一毛一样_文件上传_17

进入管理界面:

自己搭一个 OSS 服务,和阿里云的一毛一样_Node.js_18

这个 bucket 就是管理桶的地方,而 object browser 就是管理文件列表的地方。

和阿里云 OSS 用法一样。

我们创建个 bucket:

自己搭一个 OSS 服务,和阿里云的一毛一样_文件上传_19

然后在这个 bucket 下上传一个文件:

自己搭一个 OSS 服务,和阿里云的一毛一样_JavaScript_20

自己搭一个 OSS 服务,和阿里云的一毛一样_JavaScript_21

点击 share 就可以看到这个文件的 url:

自己搭一个 OSS 服务,和阿里云的一毛一样_文件上传_22

自己搭一个 OSS 服务,和阿里云的一毛一样_上传_23

现在倒是能在浏览器访问,只不过需要带后面的一长串东西:

自己搭一个 OSS 服务,和阿里云的一毛一样_上传_24

不带的话会提示拒绝访问:

自己搭一个 OSS 服务,和阿里云的一毛一样_JavaScript_25

因为现在文件访问权限不是公开的。

我们设置下:

自己搭一个 OSS 服务,和阿里云的一毛一样_JavaScript_26

自己搭一个 OSS 服务,和阿里云的一毛一样_Node.js_27

添加一个 / 的匿名的访问规则。

然后就可以直接访问了:

自己搭一个 OSS 服务,和阿里云的一毛一样_JavaScript_28

是不是感觉用起来和阿里云的 OSS 差不多?

我们再来试试 sdk 的方式:

npm install minio

安装 minio 包。

然后创建 index2.js

var Minio = require('minio')

var minioClient = new Minio.Client({
  endPoint: 'localhost',
  port: 9000,
  useSSL: false,
  accessKey: '',
  secretKey: '',
})

function put() {
    minioClient.fPutObject('aaa', 'hello.png', './smile.png', function (err, etag) {
        if (err) return console.log(err)
        console.log('上传成功');
    });
}

put();

创建用到的 accessKey:

自己搭一个 OSS 服务,和阿里云的一毛一样_Node.js_29

自己搭一个 OSS 服务,和阿里云的一毛一样_文件上传_30

跑一下:

自己搭一个 OSS 服务,和阿里云的一毛一样_上传_31

可以看到,文件上传成功了:

自己搭一个 OSS 服务,和阿里云的一毛一样_前端_32

自己搭一个 OSS 服务,和阿里云的一毛一样_前端_33

同样,也可以下载文件:

自己搭一个 OSS 服务,和阿里云的一毛一样_上传_34

const fs = require('fs');

function get() {
    minioClient.getObject('aaa', 'hello.png', (err, stream) => {
        if (err) return console.log(err)
        stream.pipe(fs.createWriteStream('./xxx.png'));
    });
}

get();

自己搭一个 OSS 服务,和阿里云的一毛一样_前端_35

用起来和阿里云 OSS 几乎一毛一样。

更多的 api 用法可以看 minio 文档

自己搭一个 OSS 服务,和阿里云的一毛一样_前端_36

最后,还记得我们跑 docker 容器的时候指定了挂载目录么:

自己搭一个 OSS 服务,和阿里云的一毛一样_Node.js_37

这样,数据就会保存在本地的那个目录下:

自己搭一个 OSS 服务,和阿里云的一毛一样_JavaScript_38

那为什么 OSS 服务都这么相似呢?

因为它们都是遵循 AWS 的 Simple Storage Service(S3)规范的,简称 S3 规范。

所以不管哪家的 OSS,用起来都是差不多的。

案例代码上传了 github:github.com/QuarkGluonP…

总结

文件上传一般我们都是用 OSS 服务来存储,比如阿里云的 OSS。

但是 OSS 是收费的,而且有些敏感数据不能传到云上,需要私有部署,这种就可以自己搭一个 OSS 服务。

我们用 docker 跑了一个 minio 的容器,然后分别在管理界面和用 npm 包的方式做了文件上传和下载。

用法和阿里云 OSS 差不多,因为他们都是亚马逊 S3 规范的实现。

你公司内部有没有自己用 minio 搭 OSS 服务呢?

更多内容可以看我的小册《Nest 通关秘籍》

标签:文件,minio,OSS,阿里,一毛,上传,png
From: https://blog.51cto.com/u_15506823/9582589

相关文章

  • 最新中国数据库排行出炉:阿里自研PolarDB首次登顶!
    今天,数据库社区“墨天轮”发布了最新的一期中国数据库流行度排行榜,阿里云自研云原生数据库PolarDB首次登顶,并刷新了榜单总分纪录。该榜单根据搜索引擎数据、核心案例数、资质数量、专利数、论文数等标准,对目前主流的国产数据库进行综合评比,体现了数据库在互联网上的流行度。在2024......
  • 阿里面试:设计一个大并发、大数据的系统架构,说说设计思路
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 阿里巴巴 Alibaba
    这一道题目与费用提前计算的那类题目很像,但是由于每个宝藏每秒钟不会损失价值,所以不是费用提前计算,但是还是可以按照类似的状态进行推导这个区间DP滚动数组好好理解一下,其实就是我们只需要用到前一阶段的量,由于阶段是长度,所以实际处理中一般按照如下处理然后这道题还告诉我们......
  • 【Docker】从零开始:9.Docker命令:Push推送仓库(Docker Hub,阿里云)
    【Docker】从零开始:9.Docker命令:Push推送仓库(DockerHub,阿里云):https://blog.csdn.net/sinat_36528886/article/details/134575054?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-134575054-blog-132139578.235^v43^pc_blog_bo......
  • 学习AJAX时出现has been blocked by CORS policy: Cross origin requests are only su
    练习js时用到ajax,console报错:AccesstoXMLHttpRequestat‘file:///Users/XXX/Downloads/nav/nav.json’fromorigin‘null’hasbeenblockedbyCORSpolicy:Crossoriginrequestsareonlysupportedforprotocolschemes:http,data,chrome,chrome-extension,chro......
  • springboot上传图片到阿里云
    1.登录注册 购买oss服务2.创建Bucket3.获取accesskey4.编写阿里云上传工具类publicclassAliOssUtil{privatestaticfinalStringENDPOINT="https://oss-cn-beijing.aliyuncs.com";privatestaticfinalStringACCESS_KEY_ID="填写自己的accesskey";......
  • 最新中国数据库排行出炉:阿里自研PolarDB首次登顶!
    今天,数据库社区“墨天轮”发布了最新的一期中国数据库流行度排行榜,阿里云自研云原生数据库PolarDB首次登顶,并刷新了榜单总分纪录。该榜单根据搜索引擎数据、核心案例数、资质数量、专利数、论文数等标准,对目前主流的国产数据库进行综合评比,体现了数据库在互联网上的流行度。在20......
  • 2024最新一期中国数据库流行榜公布:阿里云PolarDB登顶
    2月1日,数据库社区“墨天轮”公布了2024年最新一期中国数据库流行度排行榜,阿里云瑶池旗下的自研云原生数据库PolarDB夺冠,并刷新榜单总分纪录。墨天轮评价称,因云而生的PolarDB数据库以客户需求为导向,并在业界开创性地落地“三层解耦”架构、多主多写、HTAP、Serverless、集......
  • 阿里云推出 3.x Java 探针,解锁应用观测与治理的全新姿势
    作者:张铭辉、泮圣伟前言随着春节大促即将到来,为了确保线上业务高效稳定地运行,电商企业大多会对旗下关键业务应用进行多轮测试。通过模拟线上较高流量的请求,来观察服务性能的实际表现。以某企业的业务测试报告举例:图1压测报告显示,成功率非常低,且全局接口成功率都很低通过报......
  • 阿里云参编业内首个代码大模型标准,通义灵码获 2023 AI4SE “银弹” 案例
    日前,中国人工智能产业发展联盟智能化软件工程工作组(AIforSoftwareEngineering,下文简称AI4SE)在京召开首届“AI4SE创新巡航”活动。阿里云作为AI4SE首批成员单位,与中国信息通信研究院等组织联合发起的《智能化软件工程技术和应用要求第一部分:代码大模型》(标准编号AIIA/PG0110......