Todos os produtos
Search
Central de documentação

Object Storage Service:Impedir a substituição de objetos com o mesmo nome usando o OSS SDK for Python 1.0

Última atualização: Sep 22, 2026

Por padrão, o carregamento de um objeto com nome idêntico substitui o existente. Este tópico descreve como configurar o cabeçalho de solicitação x-oss-forbid-overwrite para impedir que a cópia, o carregamento simples ou o carregamento multipart substituam objetos existentes com o mesmo nome.

Observações

  • Este tópico usa o ponto de extremidade público da região China (Hangzhou). Para acessar o OSS a partir de outros serviços do Alibaba Cloud na mesma região, use um ponto de extremidade interno. Para obter mais informações sobre as regiões e pontos de extremidade do OSS, consulte Regions and endpoints.

  • Este tópico utiliza credenciais de acesso obtidas de variáveis de ambiente. Para obter mais informações sobre como configurar credenciais de acesso, consulte Configure access credentials using OSS SDK for Python 1.0.

  • Este tópico demonstra como criar uma instância do OSSClient com um ponto de extremidade do OSS. Para configurações alternativas, como usar um domínio personalizado ou autenticar-se com credenciais do Security Token Service (STS), consulte Initialization.

Impedir substituições em uma tarefa de carregamento simples

O código de exemplo a seguir mostra como impedir que o carregamento simples substitua objetos existentes com o mesmo nome:

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"

# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# Upload the object. 
# Specify whether the object that is uploaded by calling the PutObject operation overwrites the existing object that has the same name. 
# By default, if x-oss-forbid-overwrite is not specified, the object that is uploaded overwrites the existing object that has the same name. 
# If x-oss-forbid-overwrite is set to false, the object that is uploaded overwrites the existing object that has the same name. 
# If x-oss-forbid-overwrite is set to true, the object that is uploaded cannot overwrite the existing object that has the same name. If an object that has the same name exists in the bucket, OSS returns an error. 
headers = {'x-oss-forbid-overwrite': 'true'}
result = bucket.put_object('yourObjectName', 'content of object', headers=headers)

# Display the returned HTTP status code. 
print('http status: {0}'.format(result.status))
# Display the request ID. A request ID uniquely identifies a request. We recommend that you add this parameter to the logs. 
print('request_id: {0}'.format(result.request_id))
# Display the ETag value returned by the put_object method. 
print('ETag: {0}'.format(result.etag))
# Display the HTTP response headers. 
print('date: {0}'.format(result.headers['date']))

Impedir substituições em uma tarefa de cópia de objeto

  • Copiar um objeto pequeno

    O exemplo de código abaixo mostra como copiar um objeto pequeno sem substituir o objeto existente com o mesmo nome:

    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    # Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
    auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
    # Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    # Specify the name of your bucket.
    bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
    
    # Specify whether the object that is copied by calling the copy_object operation overwrites the existing object that has the same name. 
    # By default, if x-oss-forbid-overwrite is not specified, an existing object is overwritten by a copied object with the same name. 
    # If x-oss-forbid-overwrite is set to false, an existing object is overwritten by a copied object with the same name. 
    # If x-oss-forbid-overwrite is set to true, an existing object is not overwritten by a copied object with the same name. If the existing object has the same name as the copied object, an error is reported. 
    headers = dict()
    headers = {'x-oss-forbid-overwrite':'true'}
    bucket.copy_object('yourSourceBucketName', 'yourSourceObjectName', 'yourDestinationObjectName', headers=headers)
  • Copiar um objeto grande

    O trecho de código a seguir mostra como impedir que a cópia multipart de um objeto grande substitua um objeto existente com o mesmo nome:

    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    from oss2.models import PartInfo
    from oss2 import determine_part_size
    # Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
    region = "cn-hangzhou"
    
    # Specify the name of your bucket.
    bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
    
    src_object = 'yourSourceObjectName'
    dst_object = 'yourDestinationObjectName'
    
    total_size = bucket.head_object(src_object).content_length
    part_size = determine_part_size(total_size, preferred_size=100 * 1024)
    
    # Initiate a multipart upload task. 
    # Specify whether to overwrite an object that has the same name when you copy an object. 
    # By default, if x-oss-forbid-overwrite is not specified, the object that is copied overwrites the existing object that has the same name. 
    # If x-oss-forbid-overwrite is set to false, the object that is copied overwrites the existing object that has the same name. 
    # If x-oss-forbid-overwrite is set to true, an existing object is not overwritten by a copied object with the same name. If the existing object has the same name as the copied object, an error is reported. 
    headers = dict()
    headers = {'x-oss-forbid-overwrite': 'true'}
    upload_id = bucket.init_multipart_upload(dst_object, headers=headers).upload_id
    parts = []
    
    # Copy each part. 
    part_number = 1
    offset = 0
    while offset < total_size:
        num_to_upload = min(part_size, total_size - offset)
        byte_range = (offset, offset + num_to_upload - 1)
    
        result = bucket.upload_part_copy(bucket.bucket_name, src_object, byte_range,dst_object, upload_id, part_number)
        parts.append(PartInfo(part_number, result.etag))
    
        offset += num_to_upload
        part_number += 1
    
    # Complete the multipart copy task. 
    # Specify whether to overwrite an object that has the same name when you copy an object. 
    # By default, if x-oss-forbid-overwrite is not specified, the object that is uploaded overwrites the existing object that has the same name. 
    # If x-oss-forbid-overwrite is set to false, the object that is uploaded overwrites the existing object that has the same name. 
    # If x-oss-forbid-overwrite is set to true, an existing object is not overwritten by a copied object with the same name. If the existing object has the same name as the copied object, an error is reported. 
    headers = dict()
    headers = {'x-oss-forbid-overwrite':'true'}
    bucket.complete_multipart_upload(dst_object, upload_id, parts, headers=headers)

Impedir substituições em uma tarefa de carregamento multipart

O código de exemplo abaixo mostra como impedir que o carregamento multipart substitua um objeto existente com o mesmo nome:

# -*- coding: utf-8 -*-
import os
from oss2 import SizedFileAdapter, determine_part_size
from oss2.models import PartInfo
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"

# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

key = 'yourObjectName'
filename = 'yourLocalFile'

total_size = os.path.getsize(filename)
# Specify the determine_part_size method to determine the part size. 
part_size = determine_part_size(total_size, preferred_size=100 * 1024)

# Initiate a multipart upload task. 
# Specify whether to overwrite the existing object that has the same name when you perform multipart upload. 
# By default, if x-oss-forbid-overwrite is not specified, the object that is uploaded overwrites the existing object that has the same name. 
# If x-oss-forbid-overwrite is set to false, the object that is uploaded overwrites the existing object that has the same name. 
# If x-oss-forbid-overwrite is set to true, the object that is uploaded cannot overwrite the existing object that has the same name. If an object that has the same name exists in the bucket, OSS returns an error. 
headers = {'x-oss-forbid-overwrite': 'true'}
upload_id = bucket.init_multipart_upload(key, headers=headers).upload_id
parts = []

# Upload the parts. 
with open(filename, 'rb') as fileobj:
    part_number = 1
    offset = 0
    while offset < total_size:
        num_to_upload = min(part_size, total_size - offset)
        # The SizedFileAdapter(fileobj, size) method generates a new object and recalculates the position from which the append operation starts. 
        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

# Complete the multipart upload task. 
# Specify whether to overwrite the existing object that has the same name when you perform multipart upload. 
# By default, if x-oss-forbid-overwrite is not specified, the object that is uploaded overwrites the existing object that has the same name. 
# If x-oss-forbid-overwrite is set to false, the object that is uploaded overwrites the existing object that has the same name. 
# If x-oss-forbid-overwrite is set to true, the object that is uploaded cannot overwrite the existing object that has the same name. If an object that has the same name exists in the bucket, OSS returns an error. 
headers = {'x-oss-forbid-overwrite': 'true'}
bucket.complete_multipart_upload(key, upload_id, parts, headers=headers)

# Verify the result of the multipart upload task. 
with open(filename, 'rb') as fileobj:
    assert bucket.get_object(key).read() == fileobj.read()

Referências

  • Para obter mais informações sobre a operação de API de carregamento simples, consulte PutObject.

  • Para obter mais informações sobre a operação de API de cópia de objeto, consulte CopyObject.

  • Para obter mais informações sobre as operações de API de carregamento multipart, consulte InitiateMultipartUpload e CompleteMultipartUpload.