
# 分段上传简介(Python SDK)
对于较大文件上传，可以切分成段上传。用户可以在如下的应用场景内（但不仅限于此），使用分段上传的模式：
- 上传超过100MB大小的文件。
- 网络条件较差，和OBS服务端之间的链接经常断开。
- 上传前无法确定将要上传文件的大小。
分段上传分为如下3个步骤：
1. [初始化分段上传任务](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1002.html)（ObsClient.initiateMultipartUpload）。
2. [逐个或并行上传段](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1003.html)（ObsClient.uploadPart）。
3. [合并段](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1006.html)（ObsClient.completeMultipartUpload）或[取消分段上传任务](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1008.html)(ObsClient.abortMultipartUpload)。
本示例用于展示完整的多段上传，具体为初始化上传段任务、上传每个段、合并段。
```
# -*- coding:utf-8 -*-
import os
import traceback
from obs import ObsClient, CompleteMultipartUploadRequest, CompletePart
# 推荐通过环境变量获取AK/SK，这里也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险
# 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
ak = os.getenv("AccessKeyID")
sk = os.getenv("SecretAccessKey")
# 如需使用临时AK/SK和SecurityToken访问OBS，则同样推荐通过环境变量获取
# security_token = os.getenv("SecurityToken")
# server填写Bucket对应的Endpoint，这里以华北-北京四为例，其他地区请按实际情况填写
server = "https://obs.cn-north-4.myhuaweicloud.com"
# 创建obsClient实例
# 如果使用临时AK/SK和SecurityToken访问OBS，需要在创建实例时通过security_token参数指定securityToken值
obs_client = ObsClient(access_key_id=ak, secret_access_key=sk, server=server) 
try: 
    # 桶名 
    bucket_name = "examplebucket" 
    # 对象名 
    object_key = "objectname" 
    # 对象的MIME类型 
    content_type = 'text/plain' 
    # 初始化分段上传任务 
    resp = obs_client.initiateMultipartUpload(bucket_name, object_key, 
                                             content_type = content_type) 
    # 获取初始化上传任务的uploadId 
    upload_id = resp.body["uploadId"] 
    # 上传段大小 
    part_size = 512 * 1024 * 1024 
    # 段号 
    part_num = 1 
    # 指明object字段是否代表文件路径，默认为False、此处为True 
    is_file = True 
    # 本地要上传的对象文件 
    filepath = r"D:\tmp\file.txt" 
    content_length = os.path.getsize(filepath) 
    # 源文件中某一分段的起始偏移大小。 
    offset = 0 
    etags = {} 
    while offset < content_length: 
        part_size = min(part_size, (content_length - offset)); 
        # 用于上传段 
        resp1 = obs_client.uploadPart(bucket_name, object_key, part_num, upload_id, filepath, is_file, part_size, offset) 
        etags[part_num] = resp1.body.etag 
        offset = offset + part_size 
        part_num = part_num + 1 
    completes = [] 
    for i in range(1, part_num): 
        completes.append(CompletePart(i, etags[i])) 
    # 用于合并段 
    complete_multipart_upload_request = CompleteMultipartUploadRequest(parts=completes) 
    resp = obs_client.completeMultipartUpload(bucket_name, object_key, upload_id, complete_multipart_upload_request) 
    # 返回码为2xx时，接口调用成功，否则接口调用失败 
    if resp.status < 300: 
        print('Upload Part Succeeded') 
        print('requestId:', resp.requestId) 
        print('etag:', resp.body.etag) 
    else: 
        print('Upload Part Failed') 
        print('requestId:', resp.requestId) 
        print('errorCode:', resp.errorCode) 
        print('errorMessage:', resp.errorMessage) 
except Exception: 
    print('multPartsUpload Failed') 
    print(traceback.format_exc())
```
其他分段操作请参考：
- [分段上传-列举已上传的段(Python SDK)](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1004.html)
- [分段上传-列举分段上传任务(Python SDK)](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1005.html)
- [分段上传-复制段(Python SDK)](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1007.html)
- [分段上传-取消分段上传任务(Python SDK)](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_1008.html)
 
