【云服务器系列】基于华为云OBS实现Picgo和Typora的完美融合

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

一.概念介绍

1.什么是对象存储

对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力。

OBS 系统和单个桶都没有总数据容量和对象/文件数量的限制,为用户提供了超大存储容量的能力,适合存放任意类型的文件,适合普通用户、网站、企业和开发者使用。OBS 是一项面向 Internet 访问的服务,提供了基于 HTTP/HTTPS 协议的 Web 服务接口,用户可以随时随地连接到 Internet,通过 OBS 管理控制台或各种 OBS 工具访问和管理存储在 OBS 中的数据。此外,OBS 支持 SDK 和 OBS API 接口,可使用户方便管理自己存储在 OBS 上的数据,以及开发多种类型的上层业务应用。

在全球多区域部署了 OBS 基础设施,具备高度的可扩展性和可靠性,用户可根据自身需要指定区域使用 OBS,由此获得更快的访问速度和实惠的服务价格。

2.产品优势

在信息时代,企业数据直线增长,自建存储服务器存在诸多劣势,已无法满足企业日益强烈的存储需求。表 1向您详细展示了 OBS 与自建存储服务器的优劣势对比。

对比项OBS自建存储服务器
数据存储量提供海量的存储服务,在全球部署着 N 个数据中心,所有业务、存储节点采用分布式集群方式部署,各节点、集群都可以独立扩容,用户永远不必担心存储容量不够。数据存储量受限于搭建存储服务器时使用的硬件设备,存储量不够时需要重新购买存储硬盘,进行人工扩容。
安全性支持 HTTPS/SSL 安全协议,支持数据加密上传。同时 OBS 通过访问密钥(AK/SK)对访问用户的身份进行鉴权,结合 IAM 权限、桶策略、ACL、防盗链等多种方式和技术确保数据传输与访问的安全。支持敏感操作保护,针对删除桶等敏感操作,可开启身份验证。需自行承担网络信息安全、技术漏洞、误操作等各方面的数据安全风险。
可靠性通过五级可靠性架构,保障数据持久性高达 99.9999999999%,业务连续性高达 99.995%,远高于传统架构。一般的企业自建存储服务器不会投入巨额的成本来同时保证介质、服务器、机柜、数据中心、区域级别的可靠性,一旦出现故障或灾难,很容易导致数据出现不可逆的丢失,给企业造成严重损失。
成本即开即用,免去了自建存储服务器前期的资金、时间以及人力成本的投入,后期设备的维护交由 OBS 处理。按使用量付费,用多少算多少。阶梯价格,用的越多越实惠。前期安装难、设备成本高、初始投资大、自建周期长、后期运维成本高,无法匹配快速变更的企业业务,安全保障的费用还需额外考虑。

3.应用场景

OBS 提供的大数据解决方案主要面向海量数据存储分析、历史数据明细查询、海量行为日志分析和公共事务分析统计等场景,向用户提供低成本、高性能、不断业务、无须扩容的解决方案。

  • 海量数据存储分析的典型场景:PB 级的数据存储,批量数据分析,毫秒级的数据详单查询等
  • 历史数据明细查询的典型场景:流水审计,设备历史能耗分析,轨迹回放,车辆驾驶行为分析,精细化监控等
  • 海量行为日志分析的典型场景:学习习惯分析,运营日志分析,系统操作日志分析查询等
  • 公共事务分析统计的典型场景:犯罪追踪,关联案件查询,交通拥堵分析,景点热度统计等

用户通过 DES 等迁移服务将海量数据迁移至 OBS,再基于提供的 MapReduce 等大数据服务或开源的 Hadoop、Spark 等运算框架,对存储在 OBS 上的海量数据进行大数据分析,最终将分析的结果呈现在 ECS 中的各类程序或应用上。

二.基础信息

1.obs 概览

obs 概览

image-20240810165610262

2.obs 主页

主页地址

对象存储服务 OBS

提供安全稳定、性能领先、无限弹性扩展的存储能力,降低使用成本,驱动千行百业数据价值变现

image-20240806002917784

3.存储包和流量包的区别

存储包和流量包是两种不同的服务产品,通常用于云计算服务中。它们的主要区别在于服务的内容和用途。

存储包主要是指用于抵扣云存储服务中数据存储费用的产品。例如,在华为云对象存储 OBS 服务中,存储包可以用来抵扣 OSS 文件或 ECS 快照的存储费用 。用户购买存储包后,在有效期内,存储包会按照一定的规格(如每小时固定额度)抵扣相应的存储费用。如果存储使用量超出了存储包的抵扣额度,超出部分将按照按量付费的方式计算费用。

流量包则是指用于抵扣数据传输过程中产生的流量费用的产品。流量包可以进一步细分为多种类型,例如下行流量包、回源流量包等。下行流量包用于抵扣从云存储服务向外网传输数据产生的流量费用,而回源流量包则用于抵扣数据从云存储服务传输到内容分发网络(CDN)边缘节点产生的流量费用 。流量包通常有预设的有效期和额度,用户在使用过程中,相应的流量费用会被流量包抵扣,超出额度则按实际用量计费。

4.购买服务

存储包和流量包的区别

存储包:华为云 obs 存储包还是比较便宜的,40G 一年只要 9 元

image-20240810165751309

流量包:华为云流量包一年 50G 流量,一年价格为 108 元

image-20240810165857211

5.PicGo 配置 OBS

根据下图在 picgo 中配置 obs,我们就可以管理自己的图床了,再结合 typora,使博客对于图片的管理更加方便

image-20240810170209183

三.Python-SKD

1.安装依赖

pip install pycryptodome==3.20.0

pip install esdk-obs-python --trusted-host pypi.org

2…列举桶对象

列举桶对象 API

100 个以内对象:

from obs import ObsClient
import os
import traceback

# 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
# 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
ak = 'ak'
sk = 'sk'
server = "https://obs.cn-east-3.myhuaweicloud.com"
# 创建obsClient实例
# 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过security_token参数指定securityToken值
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
try:
    bucketName = "kwan1"
    # 指定列举对象的前缀
    # prefix = 'test/'
    prefix = None
    # 指定单次列举对象个数为100
    max_keys = 100
    # 列举桶内对象
    resp = obsClient.listObjects(bucketName, prefix, max_keys=max_keys, encoding_type='url')

    # 返回码为2xx时,接口调用成功,否则接口调用失败
    if resp.status < 300:
        # print('List Objects Succeeded')
        # print('requestId:', resp.requestId)
        # print('name:', resp.body.name)
        # print('prefix:', resp.body.prefix)
        # print('max_keys:', resp.body.max_keys)
        # print('is_truncated:', resp.body.is_truncated)
        index = 1
        for content in resp.body.contents:
            # print('object [' + str(index) + ']')
            print('key:', content.key)
            # print('lastModified:', content.lastModified)
            # print('etag:', content.etag)
            # print('size:', content.size)
            # print('storageClass:', content.storageClass)
            # print('owner_id:', content.owner.owner_id)
            # print('owner_name:', content.owner.owner_name)
            index += 1
    else:
        # print('List Objects Failed')
        print('requestId:', resp.requestId)
        print('errorCode:', resp.errorCode)
        print('errorMessage:', resp.errorMessage)
except:
    print('List Objects Failed')
    print(traceback.format_exc())

100个以上:

from obs import ObsClient
import os
import traceback

ak = 'ak'
sk = 'sk'
server = "https://obs.cn-east-3.myhuaweicloud.com"
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
try:
    max_num = 1000
    mark = None
    index = 1
    while True:
        resp = obsClient.listObjects('kwan1', marker=mark, max_keys=max_num, encoding_type='url')
        if resp.status < 300:
            # print('requestId:', resp.requestId)
            # print('name:', resp.body.name)
            # print('prefix:', resp.body.prefix)
            # print('max_keys:', resp.body.max_keys)
            # print('is_truncated:', resp.body.is_truncated)
            for content in resp.body.contents:
                # print('object [' + str(index) + ']')
                print('key:', content.key)
                # print('lastModified:', content.lastModified)
                # print('etag:', content.etag)
                # print('size:', content.size)
                # print('storageClass:', content.storageClass)
                # print('owner_id:', content.owner.owner_id)
                # print('owner_name:', content.owner.owner_name)
                print(f'index:{index}')
                index += 1
            if resp.body.is_truncated is True:
                mark = resp.body.next_marker
            else:
                break
        else:
            print('errorCode:', resp.errorCode)
            print('errorMessage:', resp.errorMessage)
except:
    import traceback
    print(traceback.format_exc())

3.下载图片

import requests

# 图片的URL
image_url = 'https://kwan1.obs.cn-east-3.myhuaweicloud.com/zsb4UftyA5gKCQ8.png'

# 使用rfind找到最后一个'/'的位置
last_slash_index = image_url.rfind('/')

# 从'/'后面截取字符串作为图片名称
if last_slash_index != -1:
    image_name = image_url[last_slash_index + 1:]
else:
    image_name = image_url  # 如果没有找到'/',则整个URL就是图片名称

print(image_name)

# 打开URL
response = requests.get(image_url, stream=True)

# 确保请求成功
if response.status_code == 200:
    # 打开一个文件用于写入
    with open(image_name, 'wb') as out_file:
        # 写入内容
        out_file.write(response.content)
else:
    print('图片下载失败,状态码:', response.status_code)

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kwan的解忧杂货铺@新空间代码工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值