4. 文件上传¶
在NOS中用户的基本操作单元是对象,亦可以理解为文件,NOS PYTHON SDK提供了丰富的上传接口,可以通过以下的方式上传文件:
- 字符串上传
- 本地文件上传
- 分片上传
字符串上传、本地文件上传最大为100M,分片上传对文件大小没有限制
4.1. 字符串上传¶
您可以使用put_object上传字符串内容到文件中,具体实现如下:
bucketName = "使用的桶名,注意命名规则"
key = "使用的对象名,注意命名规则"
content = "Hello NOS!"
response = s3Client.put_object(Bucket=bucketName, Key=key, Body=content)
Attention
- 上传的字符串内容不超过100M
4.2. 本地文件上传¶
您可以使用put_object上传文件内容,具体实现如下:
bucketName = "使用的桶名,注意命名规则"
key = "使用的对象名,注意命名规则"
file_name = "待上传文件的名称"
response = s3Client.put_object(Body=open(file_name, "rb"), Bucket=bucketName,Key=key)
Attention
- 上传的文件内容不超过100M
- 必须以二进制的方式打开文件
4.3. 分片上传¶
除了通过put_object接口上传文件到NOS之外,NOS还提供了另外一种上传模式-分片上传,用户可以在如下应用场景内(但不限于此),使用分片上传模式,如:
- 需支持断点上传
- 上传超过100M的文件
- 网络条件较差,经常和NOS服务器断开连接
- 上传文件之前无法确定文件的大小
4.3.1. 原始接口分片上传¶
您可以使用原始的分片上传接口进行分片上传,一般流程如下所示:
- 初始化一个分片上传任务(create_multipart_upload)
- 逐个或并行上传分片(upload_part)
- 完成分片上传(complete_multipart_upload)或者取消分片上传(abort_multipart_upload)
下面通过一个完整的示例说明了如何通过原始的api接口一步一步的进行分片上传操作,如果用户需要做断点续传等高级操作,可以参考下面代码:
bucketName = "使用的桶名,注意命名规则"
key = "使用的对象名,注意命名规则"
# step 1. 初始化一个分块上传,获取分块上传ID,桶名 + 对像名 + 分块上传ID 唯一确定一个分块上传
initUpload = s3Client.create_multipart_upload(Bucket=bucketName, Key=key)
# 分块上传ID用于后续分块上传操作
uploadId = initUpload["UploadId"]
# step 2. 上传分块
index = 0
slice_size = 10 * 1024 * 1024
with open(file_name, "rb") as fp:
while True:
index += 1
part = fp.read(slice_size)
if not part:
break
uploadPart = s3Client.upload_part(Bucket=bucketName, Key=key, PartNumber=index, UploadId=uploadId, Body=part)
print(uploadPart)
# step 3. 列出所有分块,完成分块上传
rParts = s3Client.list_parts(Bucket=bucketName, Key=key, UploadId=uploadId)
partEtags = []
for part in rParts["Parts"]:
partEtags.append({"PartNumber": part["PartNumber"], "ETag": part["ETag"]})
s3Client.complete_multipart_upload(Bucket=bucketName, Key=key, UploadId=uploadId, MultipartUpload={
'Parts': partEtags
})
Attention
- 上面程序一共分为三个步骤:a. create_multipart_upload b. upload_part c. complete_multipart_upload
- upload_part 方法要求除最后一个Part以外,其他的Part大小都要大于或等于16K。但是upload_part接口并不会立即校验上传Part的大小(因为不知道是否为最后一块),只有当complete_multipart_upload的时候才会校验。
- Part号码的范围是1~10000。如果超出这个范围,NOS将返回InvalidArgument的错误码。
- Part的大小为16K到100M
- 分片上传任务初始化或上传部分分片后,可以使用abort_multipart_upload接口中止分片上传事件。当分片上传事件被中止后,就不能再使用这个upload_id做任何操作,已经上传的分片数据也会被删除。
- 在完成上传时,需要在参数中提供上传块的ETag与块编号(PartNumber)的组合信息,具体操作参考上面代码。