腾讯云COS异步操作上传(Python)

文章目录

  • 相关概念介绍
  • 相关术语
  • SDK使用
  • 异步上传文件

相关概念介绍

COS全称“云对象存储”(Cloud Object Storage),是一种分布式存储服务,通过将数据作为对象存储,可以实现数据的高可靠性和可扩展性。它通常用于存储非结构化数据,如文本、视频、图片等,非常适合需要大量数据存储和高速访问的场景。

在COS系统中,数据以对象的形式进行存储,每个对象包括两个主要部分:对象的数据(即文件数据)和元数据(描述数据的信息)。用户可以通过HTTP或HTTPS协议,使用RESTful API进行对象的上传、下载、删除等操作。

COS的一些主要特点包括:
高可靠性和耐久性:多数云对象存储服务提供99.999%的数据耐久性,通过在多个地理位置跨区域复制数据来实现。
可扩展性:存储容量和处理能力可以根据需求自动或手动扩展,适合各种规模的应用。
数据管理和安全:提供数据生命周期管理、权限控制和加密功能,帮助企业有效管理数据安全。
成本效益:通常按实际使用量付费,对于存储大量数据的用户来说成本相对较低。
世界上许多大型云服务提供商,如Amazon的S3、Google Cloud的Google Cloud Storage、微软的Azure Blob Storage等,都提供类似COS的服务。在选择云对象存储服务时,考虑数据中心的位置、价格、服务水平协议(SLA)和具体的功能特性是很重要的。

个人用户可免费存储 50GB 标准存储类型的数据,免费存储6个月(180天)
相关创建与使用参考这篇博客内容: Python 操作腾讯对象存储(COS)详细教程

在云对象存储(COS)中,“桶”(Bucket)是一个基本的存储容器,用于保存对象(Object)。桶可以视为一个大的文件夹,其中可以存储任意数量的数据对象,如文件、图片或其他形式的非结构化数据。
每个对象存储的桶具有以下特点:
唯一性:桶的名称在整个存储系统中必须是唯一的。这意味着一旦你在云服务中创建了一个桶,其他用户就不能使用相同的桶名称。
配置选项:在创建桶时,可以配置多种选项,如数据的地理位置、访问权限规则、版本控制等。
数据隔离:不同的桶之间存储的数据是彼此隔离的,增强了数据管理的灵活性和安全性。
无限扩展:桶内可以存放无限量的数据,你只需关注数据的上传和管理,而不必担心容量问题。

结构化数据
结构化数据指的是那些可以被存储在传统数据库中的、具有严格数据模型和关系的数据。这类数据通常存储在关系数据库(如MySQL、PostgreSQL)中,它们可以通过表格形式表示,其中每行代表一条记录,每列代表一个数据字段。结构化数据的特点包括:
预定义模型:数据模型事先定义清楚,如数据表的列和类型等。
易于查询:使用结构化查询语言(SQL)可以高效地查询、更新和管理数据。
事务性:支持复杂的事务处理,例如银行系统中的转账操作。

非结构化数据
非结构化数据指的是没有预定义数据模型的数据,它们不能通过传统的关系表格来表示。这类数据包括文本文件、图片、音频、视频等,通常存储在文件系统或对象存储(如云对象存储服务)中。非结构化数据的特点包括:
格式多样:可以是任何类型的媒体格式,没有固定的形式
规模庞大:非结构化数据占据了企业和互联网上的大部分数据量。
处理复杂:需要特殊的软件和技术来分析和处理,如文本分析工具、图像识别系统等。

相关术语

在这里插入图片描述
python COS_SDK参数: 腾讯官方Python-COS-SDK
响应头:
在这里插入图片描述

SDK使用

 pip install -U cos-python-sdk-v5#带 -U 或 --upgrade:当使用这个选项时,pip 会**尝试升级指定的包到最新版本**。如果你已经安装了这个包,pip 将检查是否有更高版本的包可用,并将其升级到最新版本。同时,它也会升级所有依赖于该包的其他包,以保证依赖关系的兼容性。例如,pip install -U cos-python-sdk-v5 将安装或更新到 cos-python-sdk-v5 包的最新版本。

通过 COS 默认域名访问时,SDK 会以 {bucket-appid}.cos.{region}.myqcloud.com 的域名形式访问 COS。

# -*- coding=utf-8
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import os
import logging# 正常情况日志级别使用 INFO,需要定位时可以修改为 DEBUG,此时 SDK 会打印和服务端的通信信息
logging.basicConfig(level=logging.INFO, stream=sys.stdout)# 1. 设置用户属性, 包括 secret_id, secret_key, region等。Appid 已在 CosConfig 中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成
secret_id = os.environ['COS_SECRET_ID']     
secret_key = os.environ['COS_SECRET_KEY']   
region = 'ap-beijing'      # 替换为用户的 region,已创建桶归属的 region 可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket# COS 支持的所有 region 列表参见 https://cloud.tencent.com/document/product/436/6224
token = None               # 如果使用永久密钥不需要填入 token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见 https://cloud.tencent.com/document/product/436/14048
scheme = 'https'           # 指定使用 http/https 协议来访问 COS,默认为 https,可不填config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
client = CosS3Client(config)

创建桶:

response = client.create_bucket(Bucket='examplebucket-1250000000'
)

上传文件对象:
文件流上传方法

with open('picture.jpg', 'rb') as fp:
#'rb' 表示以二进制形式读取(这对于非文本文件如图片、视频等是必须的)。
#使用 with 语句的好处是文件会在代码块执行完毕后自动关闭,即使在读取文件时发生异常也是如此。response = client.put_object(Bucket='examplebucket-1250000000',Body=fp,Key='picture.jpg',StorageClass='STANDARD', #StorageClass 指定了对象的存储级别,这里使用 STANDARD,即标准存储EnableMD5=False #不启用MD5)
print(response['ETag'])

字节流

response = client.put_object(Bucket='examplebucket-1250000000',Body=b'bytes',Key='picture.jpg',EnableMD5=False
)
print(response['ETag'])

在使用云对象存储(COS)服务上传数据时,选择使用字节流(如 b’bytes’)还是文件流(从文件对象读取),主要取决于具体的使用场景和需求。
上传字节流
当你直接提供一个字节字符串(如 b’bytes’)给上传函数时,这通常适用于以下场景:
数据量较小:如果你需要上传的数据量不大,如一些配置数据、小型图像或短文本,直接使用字节流是简单且有效的。
数据已在内存中:如果数据已经以字节形式在内存中,直接上传这些数据可以避免写入和再读取文件的额外开销。
生成数据:对于动态生成的数据,如临时生成的图像或文件,可能没有必要首先写入磁盘,直接从内存上传更为高效。
上传文件流
从文件对象中读取数据上传,适用于以下情况:
大文件处理:对于大文件,使用文件流可以有效地分批读取和上传数据,而不必将整个文件加载到内存中,这可以大幅节省内存资源。
磁盘到云的直接传输:如果文件已经存在于磁盘上,使用文件流可以直接读取并上传,无需额外处理。
数据持久化:如果数据需要被保存或者已经以文件形式存在,使用文件流进行上传可以确保数据的完整性和持久化存储。
哪个方法更好
性能与资源考量:对于大文件或需要频繁读写的情况,使用文件流可以更有效地管理内存和带宽,因为它允许逐块处理文件。对于小数据片段或需要快速处理的数据,直接使用字节流可以减少文件I/O操作,提高效率。
具体应用需求:考虑应用的具体需求,比如是否需要处理文件元数据,文件是否需要存储在本地等因素。

图片这类数据,推荐使用文件流来进行上传,尤其是当处理的图片文件较大或者数量较多时。
以下是使用文件流上传图片的几个主要优点:
内存效率:使用文件流上传图片可以逐块读取数据,不需要一次性将整个图片加载到内存中。这对于大型图片或高分辨率图片尤其重要,因为这些图片完全加载到内存中可能消耗大量资源。
数据完整性:通过文件流,可以确保从源文件直接读取数据,减少了数据在处理过程中可能出现的损坏或变更的风险。
处理大量文件:如果你需要上传大量图片,使用文件流可以帮助你有效管理系统资源,防止因大量数据同时处理而导致的内存溢出或性能问题。
简化工作流:如果图片已经以文件形式存储在磁盘上,直接使用文件流进行上传可以简化处理流程,无需额外的步骤将图片转换成字节流。

其他传输:(块传输与高级分块传输)

#### chunk 简单上传
import requests
stream = requests.get('https://cloud.tencent.com/document/product/436/7778')# 网络流将以 Transfer-Encoding:chunked 的方式传输到 COS
response = client.put_object(Bucket='examplebucket-1250000000',Body=stream,Key='picture.jpg'
)
print(response['ETag'])#### 高级上传接口(推荐)
# 根据文件大小自动选择简单上传或分块上传,分块上传具备断点续传功能。
response = client.upload_file(Bucket='examplebucket-1250000000',LocalFilePath='local.txt',Key='picture.jpg',PartSize=1,MAXThread=10,EnableMD5=False
)
print(response['ETag'])

异步上传文件

import os
import uuidfrom aiobotocore.session import AioSession
from qcloud_cos import CosConfig, CosS3Clientfrom config_txt import (TENCENT_COS_BUCKET,TENCENT_COS_BUCKET_NAME,TENCENT_COS_REGION,TENCENT_COS_SECRET_ID,TENCENT_COS_SECRET_KEY,
)config = CosConfig(Region=TENCENT_COS_REGION, SecretId=TENCENT_COS_SECRET_ID, SecretKey=TENCENT_COS_SECRET_KEY)
client = CosS3Client(config)def generate_unique_filename(original_path):"""生成包含UUID的唯一文件名,保留原始扩展名"""basename = os.path.basename(original_path)extension = basename.split('.')[-1]uuid_name = f"{uuid.uuid4()}.{extension}"return uuid_nameasync def upload_image(local_path):"""异步上传图片到腾讯云,并返回图片URL"""session = AioSession()endpoint_url = f'https://{TENCENT_COS_BUCKET}.cos.{TENCENT_COS_REGION}.myqcloud.com'async with session.create_client('s3', region_name=TENCENT_COS_REGION, aws_secret_access_key=TENCENT_COS_SECRET_KEY,aws_access_key_id=TENCENT_COS_SECRET_ID, endpoint_url=endpoint_url) as client:key = generate_unique_filename(local_path)with open(local_path, 'rb') as file_data:response = await client.put_object(Bucket=TENCENT_COS_BUCKET_NAME, Key=key, Body=file_data)if 'ETag' in response:url = f"{endpoint_url}/{TENCENT_COS_BUCKET_NAME}/{key}"return urlelse:return "Upload failed."async def upload_image_byte(data_stream, filename):"""异步上传图片到腾讯云,并返回图片URL,使用数据流"""session = AioSession()endpoint_url = f'https://{TENCENT_COS_BUCKET}.cos.{TENCENT_COS_REGION}.myqcloud.com'key = generate_unique_filename(filename)async with session.create_client('s3', region_name=TENCENT_COS_REGION, aws_secret_access_key=TENCENT_COS_SECRET_KEY,aws_access_key_id=TENCENT_COS_SECRET_ID, endpoint_url=endpoint_url) as client:response = await client.put_object(Bucket=TENCENT_COS_BUCKET_NAME, Key=key, Body=data_stream)if 'ETag' in response:url = f"{endpoint_url}/{TENCENT_COS_BUCKET_NAME}/{key}"return urlelse:return None

打开文件以写入模式(wb)时,如果指定的文件已存在,其内容会被新的内容覆盖。

session 在这里是一个会话管理对象,用于处理和维护网络连接。在异步编程中,session 对象通常用来管理和复用连接,使得在处理多个请求时更高效。这种模式避免了每次发送请求都建立新连接的开销。

创建了一个异步的客户端对象用于与 S3 兼容的 API 交互。这里使用的 create_client 方法指定了客户端类型为 ‘s3’,这是因为腾讯云的对象存储服务(COS)与亚马逊的 S3 服务在API层面是兼容的。这意味着你可以使用相似的库或工具来操作这两种服务。

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

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

相关文章

《后端程序猿 · @Value 注释说明》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

SQL labs-SQL注入(四,sqlmap对于post传参方式的注入)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 序言:本文主要讲解基于SQL labs靶场,sqlmap工具进行的post传参方式的SQL注入。 传参方式有两类,一类是直接在url栏内进行url编码后进行的传参&am…

Android APK混淆处理方案分析

这里写目录标题 一、前言1.1 相关工具二、Apk 分析2.1 apk 解压文件2.2 apk 签名信息2.3 apk AndroidManifest.xml2.4 apk code三、Apk 处理3.1 添加垃圾文件3.2 AndroidManifest.xml 处理3.3 dex 混淆处理3.4 zipalign对齐3.5 apk 重新签名3.6 apk 安装测试四、总结一、前言 提…

sentinel 服务流量控制 、熔断降级

1、什么是 sentinel,可以用来干什么 sentinel是用来在微服务系统中保护微服务对的作用,如何避免服务的雪崩、熔断、降级,说白了就是用来替换hystrix。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 官网:GitHub - alibaba/Se…

Ubuntu安装QQ教程

Ubuntu安装QQ教程 腾讯更新Linux版的QQ,这里安装一下; 首先,进入官网找到合适对应的安装包; QQLinux版本官网:https://im.qq.com/linuxqq/index.shtml 我们是ubuntu系统选择X86下的deb版本,如果是arm开…

5G单北斗定位工卡

UWB卫星定位工卡(HXZK-UBK)融合定位系统结合了两种定位技术的优势,从而能够在各种环境下实现更精准、更可靠的定位,UWB(ULtra-Wideband,超宽带)技术和GNGSS(GLobal Positioning System&#xff…

上海浦东装修公司推荐:高端选择,品质生活

在上海浦东这样一个经济繁荣、文化多元的地区,居住环境的品质直接关系到家的感觉。为了追求高品质生活的您,我们精心挑选了五大豪华装修公司。1.即住空间装饰即住空间装饰以其“高效、省心、精工”为核心理念,专注于为追求高品质生活的业主提…

【word转pdf】【最新版本jar】Java使用aspose-words实现word文档转pdf

【aspose-words-22.12-jdk17.jar】word文档转pdf 前置工作1、下载依赖2、安装依赖到本地仓库 项目1、配置pom.xml2、配置许可码文件(不配置会有水印)3、工具类4、效果 踩坑1、pdf乱码2、word中带有图片转换 前置工作 1、下载依赖 通过百度网盘分享的文…

嵌入式linux系统中压力测试的方法

在Linux环境下,确保系统各项资源充分且稳定地运行对任何系统管理员来说都至关重要。特别是在生产环境中,理解如何对系统资源进行基准测试和压力测试可以帮助预防未来的问题,同时也能够优化现有系统的性能。 在本文中,我们将探讨如何使用命令行工具来对Linux系统的CPU、内存…

科技前沿:Llama 3.1的突破与革新

在科技的长河中,每一次模型的更新都是对人类智慧的致敬。今天,我们将聚焦于Meta公司最新发布的Llama 3.1系列模型,探索其在AI领域的前沿突破。 新模型的诞生 自去年以来,Meta公司不断推进人工智能技术的发展,终于在近…

2024软件测试面试题及答案

【纯干货!!!】花费了整整3天,整理出来的全网最实用软件测试面试大全,一共30道题目答案的纯干货,希望大家多多支持,建议 点赞!!收藏!!长文警告&…

学习华为IPD流程黑话2.0

目录 1、内容简介 2、概念六:管道管理 3、概念七:业务计划 4、概念八:IPMT 的投资活动 5、概念九:BETA、ESS、ESP 作者简介 1、内容简介 学习任何新事物都是从概念开始的。 以我个人最近遇到的一个事为例: 前…

双向链表(C语言版)

1. 双向链表的结构 注意:这里的“带头”跟单链表的“头结点”是两个概念,实际上在单链表阶段称呼不太严谨,但是为了更好地理解就直接称为单链表的头结点。带头链表里的头结点,实际为“哨兵位”,哨兵位结点不存储任何有…

运维锅总浅析网络攻击与防范

本文介绍常见的网络攻击手法及防御措施,并进一步介绍如何进行安全教育和培训、攻击溯源。希望对您提高网络安全防范意识有所帮助! 一、常见的网络攻击手法 网络攻击手法多种多样,以下是一些常见的网络攻击手法及其基本原理: 1.…

vue 两个页面切换, 再回到当前页,还是离开前的数据

1、要保证页面的name 和 建路由的大小写一致 2、页面不用生命周期--activated 调接口刷新

嵌入式系统上通过crontab表达式实现基于绝对时间的秒级定时任务

摘要 在嵌入式系统开发中,定时任务是确保系统按预定计划正确执行功能的关键。通过结合 crontab 表达式和 C 语言,可以设计出精准且灵活的定时任务系统。本博客详细描述了如何在嵌入式开发中,使用 crontab 表达式来实现基于绝对时间的定时任务…

农业农村大数据底座:实现智慧农业的关键功能

随着信息技术的快速发展,农业领域也在逐步实现数字化转型。农业农村大数据底座作为支持智慧农业发展的重要基础设施,承载了多种关键功能,为农业生产、管理和决策提供了前所未有的支持和可能性。 ### 1. 数据采集与监测 农业农村大数据底座首…

鸿蒙OpenHarmony Native API【NativeWindow】

NativeWindow Overview Description: 提供NativeWindow功能,主要用来和egl对接 syscap SystemCapability.Graphic.Graphic2D.NativeWindow Since: 8 Version: 1.0 Summary Files File NameDescription[external_window.h]定义获取和使用NativeWindow的相…

百度网盘批量转存程序

百度网盘批量转存程序,基于 Python 3.10 Tkinter 构建,主要用于批量转存网络上分享的资源到自己的百度网盘。此外还带有批量分享和批量检测链接有效性的功能。 程序主界面: 下载地址:https://pan.quark.cn/s/c739ee25b238

【算法专题】链表算法题

1. 链表常用操作 相信大家在学习数据结构的过程中已经接触过许多链表相关的题目了,在正式开始刷题之前,我想让大家先回顾一下过去处理链表相关问题时的一些常见操作。 首先肯定就是创建新节点了,如果使用C语言编写代码,我…