简单上传提供上传字符串、上传Bytes、上传Unicode、上传网络流以及上传本地文件五种形式。

注意事项

上传文件(Object)时,如果存储空间(Bucket)中已经存在同名文件且对该文件有访问权限,则新添加的文件将覆盖原有的文件,文件添加成功后返回200 OK。

上传文件时涉及填写的公共参数如下:

参数 说明
yourBucketName 填写Bucket名称。
Bucekt名称的命名规范如下:
  • 只能包括小写字母、数字和短划线(-)。
  • 必须以小写字母或者数字开头和结尾。
  • 长度必须在3~63字节之间。
yourObjectName 填写Object名称,即不包含Bucket名称在内的Object的完整路径。
Object命名规范如下:
  • 使用UTF-8编码。
  • 长度必须在1~1023字节之间。
  • 不能以正斜线(/)或者反斜线(\)开头。

有关上传文件的更多信息,请参见PutObject

上传字符串

通过bucket.put_object的方法直接上传字符串的示例代码如下:

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')

# 上传文件。
# 如果需要上传文件时设置文件存储类型(x-oss-storage-class)与访问权限(x-oss-object-acl),请在put_object中设置相关Header,示例如下。
# headers = dict()
# headers["x-oss-storage-class"] = "Standard"
# headers["x-oss-object-acl"] = oss2.OBJECT_ACL_PRIVATE
# 表示不包含Bucket名称在内的Object的完整路径,例如example/folder/abc.jpg。
# result = bucket.put_object('<yourObjectName>', 'content of object', headers=headers)
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方法返回值特有的属性,用于标识一个Object的内容。
print('ETag: {0}'.format(result.etag))
# HTTP响应头部。
print('date: {0}'.format(result.headers['date']))
            

上传Bytes

通过bucket.put_object的方法直接上传Bytes的示例代码如下:

# -*- coding: utf-8 -*-

import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建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

通过bucket.put_object的方法上传Unicode时,OSS会将Unicode自动转换为UTF-8编码的Bytes进行上传,示例代码如下:

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建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')            

上传网络流

OSS将网络流视为可迭代对象(Iterable),并以Chunked Encoding的方式上传,示例代码如下:

# -*- coding: utf-8 -*-
import oss2
import requests

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建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)            

上传本地文件

OSS将本地文件视为文件对象(File Object),上传时必须以二进制方式打开(如rb模式),示例代码如下:

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建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还提供了一个更加便捷的方法用于上传本地文件:

# yourObjectName表示不包含Bucket名称在内的Object的完整路径,例如example/folder/abc.jpg。
# yourLocalFile表示本地文件的完整路径,例如/users/local/abc.jpg。
bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>')