• 关于

    单元数据未响应

    的搜索结果

问题

如何操作BatchWriteRow

行为: 批量插入、修改或删除一个或多个表中的若干行数据。 BatchWriteRow 操作可视为多个 PutRow、UpdateRow、DeleteRow 操作的集合。各个操作独立执行,独立返回结果ÿ...
云栖大讲堂 2019-12-01 20:59:52 1130 浏览量 回答数 0

问题

如何操作BatchGetRow

行为: 批量读取一个或多个表中的若干行数据。 BatchGetRow 操作可视为多个 GetRow 操作的集合,各个操作独立执行,独立返回结果,独立计算服务能力单元。 与执行大量的...
云栖大讲堂 2019-12-01 20:59:49 1244 浏览量 回答数 0

问题

如何操作GetRange

行为: 读取指定主键范围内的数据。 请求结构:message GetRangeRequest {    required string table_name = 1;    required Di...
云栖大讲堂 2019-12-01 20:59:46 1379 浏览量 回答数 0

Quick BI 数据可视化分析平台

2020年入选全球Gartner ABI魔力象限,为中国首个且唯一入选BI产品

问题

如何操作DeleteRow

行为: 删除一行数据。 请求消息结构:message DeleteRowRequest {    required string table_name = 1;    required bytes...
云栖大讲堂 2019-12-01 20:59:43 1054 浏览量 回答数 0

问题

如何操作PutRow

行为: 插入数据到指定的行,如果该行不存在,则新增一行;若该行存在,则覆盖原有行。 请求消息结构:message PutRowRequest...
云栖大讲堂 2019-12-01 20:59:40 1116 浏览量 回答数 0

问题

如何操作UpdateRow

行为: 更新指定行的数据。如果该行不存在,则新增一行;若该行存在,则根据请求的内容在这一行中新增、修改或者删除指定列的值。 请求消息结构:message Upda...
云栖大讲堂 2019-12-01 20:59:41 890 浏览量 回答数 0

问题

如何操作GetRow

行为: 根据指定的主键读取单行数据。 message GetRowResponse {    required ConsumedCapacity consumed = 1;    required bytes ro...
云栖大讲堂 2019-12-01 20:59:37 1151 浏览量 回答数 0

回答

1、用户面承载链路故障告警,警告影响:该用户面承载的业务无法正常进行。产生告警原因:自建立模式下,当检测到本端无法和对端正常通讯时,产生此告警。 2、 SCTP链路故障告警,警告影响:导致SCTP链路上无法承载信令。产生告警原因:当基站检测到SCTP(Stream Control Transmission Protocol,流控制传输协议)链路无法承载业务时,产生此告警。 3、 X2接口故障告警,警告影响:基站释放正在通过产生告警的X2接口进行切换的用户,在该告警恢复前,基站将无法继续支持与对应基站间的X2接口切换流程,无法继续支持与对应基站间的小区干扰协调过程。产生告警原因:X2AP(X2 Application Protocol)连接在底层SCTP链路资源可用时,eNodeB将向对端eNodeB发起连接建立请求;对端eNodeB对连接请求做合法性检查,检查不通过,将无法建立连接;eNodeB收到对端eNodeB的响应后,如果发现对端eNodeB在黑名单中将无法建立连接。 当底层SCTP链路故障、X2AP协议层因配置错误或者对端eNodeB异常无法建立连接时,产生此告警。 4、 小区不可用告警,警告影响:小区状态与基带资源、射频资源、CPRI资源和传输资源这些物理资源有关,也与License有关。在物理资源不足、物理资源故障或物理资源被闭塞的情况下,小区状态会因为无可用的物理资源而变为不可用。即使物理资源可用但License不足时,也会导致小区不可用。多模场景下,由于共享资源受限(如频率、功率),也会导致小区不可用。当小区状态变为不可用,且该状态持续90秒(默认)未恢复时,将产生该告警。当小区状态变为可用,且该状态持续15秒(默认)一直可用时,则上报告警恢复。告警产生和恢复的时长可以通过SET ALMFILTER命令进行设置。产生告警原因:供电后自恢复,OMC920每隔1分钟会向被管网元发送握手请求,当被管网元三次无应答时判定通信状态为断连,上报本告警。本告警上报后,只要断连未恢复,OMC920不会因断连期间的故障原因变更而上报新的告警。OMC920会每隔2分钟重连已断开的连接,如果重连成功则自动清除本告警。 5、 S1接口故障告警,警告影响:基站将主动去激活所有与异常的S1接口相关的小区,并释放此前已经成功接入到这些小区内的所有在网用户。新的用户将无法接入到这些小区。 6、 射频单元驻波告警,警告影响:天馈接口的回波损耗过大,系统根据配置决定是否自动关闭射频单元发射通道开关,当“驻波比告警后处理开关”取值为“打开”时,射频单元发射通道开关被关闭且告警无法自动恢复,该发射通道承载的业务中断。当“驻波比告警后处理开关”取值为“关闭”时,射频单元会启动降额(默认3dB,具体由当前的业务状态决定),从而防止硬件损坏, 且告警可以自动恢复。天馈接口的回波损耗较大,导致实际输出功率减小,小区覆盖减小。产生告警原因:当射频单元与对端设备(上级/下级射频单元或BBU)间接口链路(链路层)数据收发异常时,产生此告警。 7、 射频单元维护链路异常告警, 警告影响:射频单元承载的业务中断。产生告警原因:BBU和射频单元之间通过电缆或者光纤进行连接。当BBU与射频单元间的维护链路出现异常时,产生此告警。 8、 BBU IR接口异常告警, 警告影响:在链形组网下,下级射频单元的连接链路中断,下级射频单元承载的业务中断。如果基站工作在CPRI MUX特性的组网,本制式为汇聚方且故障端口为提供汇聚功能的端口时,会造成对端制式的业务中断。在环形组网下,射频单元连接链路的可靠性下降,下级射频 单元的激活链路将倒换到备份链路上,在热环配置下对业务没有影响,在冷环配置下业务会出现短暂中断。BBU与下级射频单元的光模块的收发性能轻微恶化,可 能导致下级射频单元承载的业务质量出现轻微恶化。产生告警原因:当BBU与下级射频单元之间的光纤链路(物理层)的光信号接收异常时,产生此告警。 9、星卡锁星不足告警,警告影响:如果该告警一直存在,最终会导 致基站GPS时钟源不可用 10、 小区退服告警 ,警告影响:小区建立失败,所有业务中断。产生告警原因:当小区建立失败或小区退出服务,并且原因不是配置管理员人为闭塞时,产生此告警。 另外还有 BBU IR光模块收发异常告警, 基站控制面传输中断告警,网元连接中断,小区服务能力下降告警,射频单元IR接口异常告警,同类告警数量超出门限, BBU IR光模块/电接口不在位告警等警告类型。 此答案来源于网络,希望对您有所帮助。
养狐狸的猫 2019-12-02 02:13:16 0 浏览量 回答数 0

问题

Accordion:HBase一种内存压缩算法

转载自:http://www.hbase.group/article/10 现如今,人们对基于HBase的产品的读写速度要求越来越高。在理想情况下,人们希望HBase 可以在保证其可靠的持久存储的...
pandacats 2019-12-18 16:06:15 1 浏览量 回答数 0

问题

Nginx性能为什么如此吊

Nginx性能为什么如此吊,Nginx性能为什么如此吊,Nginx性能为什么如此吊 (重要的事情说三遍)的性能为什么如此吊!!!         最近几年,web架构拥抱解耦的...
小柒2012 2019-12-01 21:20:47 15038 浏览量 回答数 3

问题

支付宝的性能测试

       一、性能测试支付宝场景介绍   2013年双11过程当中,促销开启的第一分钟内支付宝的交易总额就突破了一亿元,短时间内大量用户涌入的情况下,如何保证用户的支付顺畅,...
云效平台 2019-12-01 21:47:13 5472 浏览量 回答数 1

问题

【精品问答】python技术1000问(2)

为了方便python开发者快速找到相关技术问题和答案,开发者社区策划了python技术1000问内容,包含最基础的如何学python、实践中遇到的技术问题、python面试等维度内容。 我们会以每天至少50条的...
问问小秘 2019-12-01 22:03:02 3129 浏览量 回答数 1

回答

一 容器 在学习k8s前,首先要了解和学习容器概念和工作原理。 什么是容器? 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。 容器的优势 容器使软件具备了超强的可移植能力。 对于开发人员 – Build Once, Run Anywhere 容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。 对于运维人员 – Configure Once, Run Anything 只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效,一致和可重复。容器消除了开发、测试、生产环境的不一致性。 Docker概念 “Docker” 一词指代了多个概念,包括开源社区项目、开源项目使用的工具、主导支持此类项目的公司 Docker Inc. 以及该公司官方支持的工具。技术产品和公司使用同一名称,的确让人有点困惑。 我们来简单说明一下: IT 软件中所说的 “Docker” ,是指容器化技术,用于支持创建和使用容器。 开源 Docker 社区致力于改进这类技术,并免费提供给所有用户,使之获益。 Docker Inc. 公司凭借 Docker 社区产品起家,它主要负责提升社区版本的安全性,并将技术进步与广大技术社区分享。此外,它还专门对这些技术产品进行完善和安全固化,以服务于企业客户。 借助 Docker,您可将容器当做轻巧、模块化的虚拟机使用。同时,您还将获得高度的灵活性,从而实现对容器的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境,从而有助于您针对云来优化您的应用。 Docker有三大核心概念: 镜像(Image)是一个特殊的文件系统,提供容器运行时所需的程序、库、配置等,构建后不会改变 容器(Container)实质是进程,拥有自己独立的命名空间。 仓库(Repository)一个仓库可以包含多个标签(Tag),每个标签对应一个镜像 容器工作原理 Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。 二 Kubernetes入门知识指南 Kubernets的知识都可以在官方文档查询,网址如下: https://kubernetes.io/zh/docs/home/ Kubernetes基础知识 Kubernetes是什么? Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 为什么需要 Kubernetes 容器是打包和运行应用程序的好方式。在生产环境中,您需要管理运行应用程序的容器,并确保不会停机。例如,如果一个容器发生故障,则需要启动另一个容器。如果由操作系统处理此行为,会不会更容易? Kubernetes 为您提供: 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。 存储编排 Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。 自动部署和回滚 您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。 自动二进制打包 Kubernetes 允许您指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。 自我修复 Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。 密钥与配置管理 Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。 Kubernetes 组件 初学者首先要了解Kubernetes的基本概念,包括master、node、pod等。 Master Master是Kubernetes集群的大脑,运行着的守护进程服务包括kube-apiserver、kube-scheduler、kube-controller-manager、etcd和Pod网络等。 kube-apiserver 主节点上负责提供 Kubernetes API 服务的组件;它是 Kubernetes 控制面的前端。 kube-apiserver 在设计上考虑了水平扩缩的需要。 换言之,通过部署多个实例可以实现扩缩。 etcd etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。 您的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。 kube-scheduler 主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。 调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。 kube-controller-manager 在主节点上运行控制器的组件。 从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。 这些控制器包括: 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。 副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)。 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌. 云控制器管理器-(cloud-controller-manager) cloud-controller-manager 运行与基础云提供商交互的控制器 cloud-controller-manager 仅运行云提供商特定的控制器循环。您必须在 kube-controller-manager 中禁用这些控制器循环,您可以通过在启动 kube-controller-manager 时将 --cloud-provider 参数设置为 external 来禁用控制器循环。 cloud-controller-manager 允许云供应商的代码和 Kubernetes 代码彼此独立地发展。在以前的版本中,核心的 Kubernetes 代码依赖于特定云提供商的代码来实现功能。在将来的版本中,云供应商专有的代码应由云供应商自己维护,并与运行 Kubernetes 的云控制器管理器相关联。 以下控制器具有云提供商依赖性: 节点控制器(Node Controller): 用于检查云提供商以确定节点是否在云中停止响应后被删除 路由控制器(Route Controller): 用于在底层云基础架构中设置路由 服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器 数据卷控制器(Volume Controller): 用于创建、附加和装载卷、并与云提供商进行交互以编排卷 Node 节点组件在每个节点上运行,维护运行 Pod 并提供 Kubernetes 运行环境。 kubelet 一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。 kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。 kube-proxy kube-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分。 kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。 如果有 kube-proxy 可用,它将使用操作系统数据包过滤层。否则,kube-proxy 会转发流量本身。 容器运行环境(Container Runtime) 容器运行环境是负责运行容器的软件。 Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI (容器运行环境接口)。 Pod 在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod。Pod是管理,创建,计划的最小单元. 一个Pod相当于一个共享context的配置组,在同一个context下,应用可能还会有独立的cgroup隔离机制,一个Pod是一个容器环境下的“逻辑主机”,它可能包含一个或者多个紧密相连的应用,这些应用可能是在同一个物理主机或虚拟机上。 Pod 的context可以理解成多个linux命名空间的联合 PID 命名空间(同一个Pod中应用可以看到其它进程) 网络 命名空间(同一个Pod的中的应用对相同的IP地址和端口有权限) IPC 命名空间(同一个Pod中的应用可以通过VPC或者POSIX进行通信) UTS 命名空间(同一个Pod中的应用共享一个主机名称) 同一个Pod中的应用可以共享磁盘,磁盘是Pod级的,应用可以通过文件系统调用。 由于docker的架构,一个Pod是由多个相关的并且共享磁盘的容器组成,Pid的命名空间共享还没有应用到Docker中 和相互独立的容器一样,Pod是一种相对短暂的存在,而不是持久存在的,正如我们在Pod的生命周期中提到的,Pod被安排到结点上,并且保持在这个节点上直到被终止(根据重启的设定)或者被删除,当一个节点死掉之后,上面的所有Pod均会被删除。特殊的Pod永远不会被转移到的其他的节点,作为替代,他们必须被replace. 三 通过kubeadm方式创建一个kubernetes 对kubernetes的概念和组件有所了解以后,就可以通过kubeadm的方式创建一个kubernetes集群。 安装前准备工作 创建虚拟机 创建至少2台虚拟机,可以在本地或者公有云。 下载部署软件 需要下载的软件包括calico、demo-images、docker-ce、kube、kube-images、kubectl、metrics-server 安装部署 具体安装过程参考官网文档: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/ 四 安装后的练习 安装后详读官方文档,做下面这些组件的练习操作,要达到非常熟练的程度。 Node Namespace Pod Deployment DaemonSet Service Job Static Pod ConfigMap Secrets Volume Init-containers Affinity and Anti-Affinity Monitor and logs Taints and Tolerations Cordon and Drain Backing up etcd 这些内容都非常熟练以后,基本就达到了入门的水平。
红亮 2020-03-02 11:09:17 0 浏览量 回答数 0

问题

【精品问答】Python面试题汇总130问(框架篇)

在python语言中,有着特别厉害的三大框架。 这三个框架分别为:Flask框架,Tornado框架,Django框架。本次问答帮助大家整理了框架中常见的面试问题! 1...
珍宝珠 2019-12-01 22:04:22 1524 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。
2019-12-01 23:14:00 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。
2019-12-01 23:14:01 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。
2019-12-01 23:14:02 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。
2019-12-01 23:14:02 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。
2019-12-01 23:14:01 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。
2019-12-01 23:14:00 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。
2019-12-01 23:14:01 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档在OSS中,操作的基本数据单元是文件(Object)。OSS Python SDK提供了丰富的文件上传方式: 简单上传:文件最大不能超过5GB。追加上传:文件最大不能超过5GB。断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。 说明:各种上传方式的适用场景请参见开发指南中的上传文件。 上传过程中,您还可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。 简单上传通过bucket.put_object方法上传文件。上传方法支持多种类型的输入源,输入源有如下几种类型: 类型 上传方式 字符串 直接上传 Bytes 直接上传 Unicode 自动转换为UTF-8编码的Bytes进行上传 本地文件 文件对象(File Object),必须以二进制方式打开(如“rb”模式) 网络流 可迭代对象(Iterable),以Chunked Encoding的方式上传 上传字符串以下代码用于上传字符串: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 返回值。result = bucket.put_object('<yourObjectName>', 'content of object')# HTTP返回码。print('http status: {0}'.format(result.status))# 请求ID。请求ID是请求的唯一标识,强烈建议在程序日志中添加此参数。print('request_id: {0}'.format(result.request_id))# ETag是put_object方法返回值特有的属性。print('ETag: {0}'.format(result.etag))# HTTP响应头部。print('date: {0}'.format(result.headers['date'])) 上传Bytes以下代码用于上传Bytes: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', b'content of object') 上传Unicode以下代码用于上传Unicode: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')bucket.put_object('<yourObjectName>', u'content of object') 上传本地文件以下代码用于上传本地文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。with open('<yourLocalFile>', 'rb') as fileobj: # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。 fileobj.seek(1000, os.SEEK_SET) # Tell方法用于返回当前位置。 current = fileobj.tell() bucket.put_object('<yourObjectName>', fileobj) Python SDK还提供了一个更加便捷的方法用于上传本地文件: bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>') 上传网络流以下代码用于上传网络流: # -*- coding: utf-8 -*-import oss2import requests# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# requests.get返回的是一个可迭代对象(Iterable),此时Python SDK会通过Chunked Encoding方式上传。input = requests.get('http://www.aliyun.com')bucket.put_object('<yourObjectName>', input) 追加上传以下代码用于追加上传文件: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 设置首次上传的追加位置(Position参数)为0。result = bucket.append_object('<yourObjectName>', 0, 'content of first append')# 如果不是首次上传,可以通过bucket.head_object方法或上次追加返回值的next_position属性,得到追加位置。bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 如果文件已经存在,如下两种情况将会抛出异常: 不是可追加文件,则抛出ObjectNotAppendable异常。是可追加文件,但设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。 断点续传上传断点续传上传将要上传的文件分成若干个分片(Part)分别上传,所有分片都上传完成后,将所有分片合并成完整的文件,完成整个文件的上传。 您可以通过oss2.resumable_upload方法断点续传上传指定文件,该方法包含以下参数: 参数 描述 是否必需 默认值 bucket 存储空间名称 是 无 key 文件名称 是 无 filename 待上传的本地文件名称 是 无 store 指定保存断点信息的目录 否 HOME目录下建立的.py-oss-upload目录 headers HTTP头部 否 无 multipart_threshold 文件长度大于该值时,则用分片上传 否 10MB part_size 分片大小 否 自动计算 progress_callback 上传进度回调函数 否 无 num_threads 并发上传的线程数 否 1 以下代码用于断点续传上传: # -*- coding: utf-8 -*-import oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当文件长度大于或等于可选参数multipart_threshold(默认值为10MB)时,会使用分片上传。如未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>') Python SDK 2.1.0以上版本支持设置可选参数进行断点续传上传,代码如下: # 如使用store指定了目录,则保存断点信息在指定目录中。如使用num_threads设置上传并发数,请将oss2.defaults.connection_pool_size设成大于或等于线程数。默认线程数为1。oss2.resumable_upload(bucket, '<yourObjectName>', '<yourLocalFile>', store=oss2.ResumableStore(root='/tmp'), multipart_threshold=100*1024, part_size=100*1024, num_threads=4) 断点续传详情请参见开发指南中的断点续传。 分片上传分片上传(Multipart Upload)分为以下三个步骤: 初始化(bucket.init_multipart_upload):获得Upload ID。上传分片(bucket.upload_part):上传分片数据。这一步可以并发进行。完成上传(bucket.complete_multipart_upload):所有分片上传完成后,合并分片,生成OSS文件。 以下代码用于分片上传文件: # -*- coding: utf-8 -*-import osfrom oss2 import SizedFileAdapter, determine_part_sizefrom oss2.models import PartInfoimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')key = '<yourObjectName>'filename = '<yourLocalFile>'total_size = os.path.getsize(filename)# determine_part_size方法用来确定分片大小。part_size = determine_part_size(total_size, preferred_size=100 * 1024)# 初始化分片。upload_id = bucket.init_multipart_upload(key).upload_idparts = []# 逐个上传分片。with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(key, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1# 完成分片上传。bucket.complete_multipart_upload(key, upload_id, parts)# 验证分片上传。with open(filename, 'rb') as fileobj: assert bucket.get_object(key).read() == fileobj.read() 进度条进度条用于指示上传或下载的进度。下面的代码以bucket.put_object方法为例,介绍如何使用进度条。 # -*- coding: utf-8 -*-from __future__ import print_functionimport os, sysimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 当无法确定待上传的数据长度时,total_bytes的值为None。def percentage(consumed_bytes, total_bytes): if total_bytes: rate = int(100 * (float(consumed_bytes) / float(total_bytes))) print('\r{0}% '.format(rate), end='') sys.stdout.flush()# progress_callback为可选参数,用于实现进度条功能。bucket.put_object('<yourObjectName>', 'a'*1024*1024, progress_callback=percentage) 进度条的完整示例代码请参见GitHub。 上传回调以下代码用于上传回调: # -*- coding: utf-8 -*-import jsonimport base64import osimport oss2# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')# Endpoint以杭州为例,其它Region请按实际情况填写。bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')# 准备回调参数。callback_dict = {}# 设置回调请求的服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。callback_dict['callbackUrl'] = 'http://oss-demo.aliyuncs.com:23450'# 设置回调请求消息头中Host的值, 如oss-cn-hangzhou.aliyuncs.com。callback_dict['callbackHost'] = 'oss-cn-hangzhou.aliyuncs.com'# 设置发起回调时请求body的值。callback_dict['callbackBody'] = 'filename=${object}&size=${size}&mimeType=${mimeType}'# 设置发起回调请求的Content-Type。callback_dict['callbackBodyType'] = 'application/x-www-form-urlencoded'# 回调参数是Json格式,并且需要Base64编码。callback_param = json.dumps(callback_dict).strip()base64_callback_body = base64.b64encode(callback_param)# 回调参数编码后放在Header中发送给OSS。headers = {'x-oss-callback': base64_callback_body}# 上传并回调。result = bucket.put_object('<yourObjectName>', 'a'*1024*1024, headers) put_object、put_object_from_file、complete_multipart_upload支持上传回调功能。上传回调的详细说明请参见API参考中的上传回调。上传回调的完整示例代码请参见GitHub。
2019-12-01 23:14:01 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务