Todos los productos
Search
Centro de documentos

Object Storage Service:Multipart upload (Go SDK V1)

Última actualización: Sep 03, 2026

Object Storage Service (OSS) ofrece una función de carga multiparte para objetos grandes. Este proceso consiste en dividir un objeto grande en partes más pequeñas, cargarlas de forma independiente y luego invocar la API CompleteMultipartUpload para combinar las partes en un solo objeto. Esto permite realizar cargas reanudables.

Notas

  • En este tema se utiliza el endpoint público de la región China (Hangzhou). Si desea acceder a OSS desde otros servicios de Alibaba Cloud en la misma región que OSS, utilice un endpoint interno. Para obtener más información sobre las regiones y endpoints de OSS, consulte Regions and endpoints.

  • En este tema, las credenciales de acceso se obtienen de variables de entorno. Para obtener más información sobre cómo configurar las credenciales de acceso, consulte Configure access credentials.

  • Este tema muestra cómo crear una instancia de OSSClient con un endpoint de OSS. Para configuraciones alternativas, como el uso de un dominio personalizado o la autenticación con credenciales de Security Token Service (STS), consulte Configure a client (Go SDK V1).

  • La carga multiparte utiliza InitiateMultipartUpload, UploadPart y CompleteMultipartUpload. Debe contar con el permiso oss:PutObject. Grant custom access policies to a RAM user.

  • El código de ejemplo de este tema requiere Go SDK V2.2.5 o posterior.

Procedimiento de carga multiparte

La carga multiparte consta de tres pasos:

  1. Inicializar una carga multiparte.

    Puede invocar el método Bucket.InitiateMultipartUpload. OSS devuelve un ID de carga único a nivel global.

  2. Cargar partes.

    Puede invocar el método Bucket.UploadPart para cargar los datos de cada parte.

    Nota
    • Para un mismo ID de carga, el número de parte identifica la posición relativa de una parte dentro del objeto. Si carga nuevos datos con el mismo número de parte, se sobrescriben los datos existentes de esa parte en OSS.

    • OSS devuelve el hash MD5 de los datos de la parte recibida en el encabezado ETag.

    • OSS calcula el hash MD5 de los datos cargados y lo compara con el hash MD5 que calcula el SDK. Si ambos hashes MD5 no coinciden, se devuelve el código de error InvalidDigest.

  3. Completar la carga multiparte.

    Una vez cargadas todas las partes, puede invocar el método Bucket.CompleteMultipartUpload para combinarlas en un objeto completo.

Código de ejemplo

Puede utilizar el siguiente código para realizar una carga multiparte completa.

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 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.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Create an OSSClient instance.
	// Set yourEndpoint to the endpoint of the bucket. For example, for a bucket in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed.
	// Set yourRegion to the region where the bucket is located. For example, for a bucket in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Set the signature version.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Set the bucket name.
	bucketName := "examplebucket"
	// Set the full path of the object. The full path cannot contain the bucket name.
	objectName := "exampleobject.txt"
	// Set the full path of the local file. If you do not specify a local path, the file is uploaded from the local path that corresponds to the project of the sample program.
	localFilename := "/localpath/exampleobject.txt"

	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Set the part size in bytes. In this example, the part size is set to 5 MB.
	partSize := int64(5 * 1024 * 1024)

	// Call the multipart upload function.
	if err := uploadMultipart(bucket, objectName, localFilename, partSize); err != nil {
		log.Fatalf("Failed to upload multipart: %v", err)
	}

}

// Multipart upload function.
func uploadMultipart(bucket *oss.Bucket, objectName, localFilename string, partSize int64) error {
	// Split the local file into parts.
	chunks, err := oss.SplitFileByPartSize(localFilename, partSize)
	if err != nil {
		return fmt.Errorf("failed to split file into chunks: %w", err)
	}

	// Open the local file.
	file, err := os.Open(localFilename)
	if err != nil {
		return fmt.Errorf("failed to open file: %w", err)
	}
	defer file.Close()

	// Step 1: Initialize a multipart upload event.
	imur, err := bucket.InitiateMultipartUpload(objectName)
	if err != nil {
		return fmt.Errorf("failed to initiate multipart upload: %w", err)
	}

	// Step 2: Upload parts.
	var parts []oss.UploadPart
	for _, chunk := range chunks {
		part, err := bucket.UploadPart(imur, file, chunk.Size, chunk.Number)
		if err != nil {
			// If a part fails to be uploaded, try to abort the multipart upload task.
			if abortErr := bucket.AbortMultipartUpload(imur); abortErr != nil {
				log.Printf("Failed to abort multipart upload: %v", abortErr)
			}
			return fmt.Errorf("failed to upload part: %w", err)
		}
		parts = append(parts, part)
	}

	// Set the access control list (ACL) of the object to private. By default, the ACL of the object is inherited from the bucket.
	objectAcl := oss.ObjectACL(oss.ACLPrivate)

	// Step 3: Complete the multipart upload.
	_, err = bucket.CompleteMultipartUpload(imur, parts, objectAcl)
	if err != nil {
		// If the upload fails to be completed, try to abort the upload.
		if abortErr := bucket.AbortMultipartUpload(imur); abortErr != nil {
			log.Printf("Failed to abort multipart upload: %v", abortErr)
		}
		return fmt.Errorf("failed to complete multipart upload: %w", err)
	}

	log.Printf("Multipart upload completed successfully.")
	return nil
}

Preguntas frecuentes

¿Cómo cancelo un evento de carga multiparte?

Puede utilizar el método Bucket.AbortMultipartUpload para cancelar un evento de carga multiparte en los siguientes escenarios.

  1. Error de archivo:

    • Si detecta que un archivo está dañado o contiene código malicioso durante la carga, puede cancelarla para evitar posibles amenazas.

  2. Red inestable:

    • Si la conexión de red es inestable o se interrumpe, algunas partes podrían perderse o dañarse durante la carga. Puede cancelar la carga y reiniciarla para garantizar la integridad y consistencia de los datos.

  3. Límites de recursos:

    • Si su espacio de almacenamiento es limitado y el archivo por cargar es demasiado grande, puede cancelar la carga para liberar recursos de almacenamiento. Esto le permite asignar recursos a tareas más importantes.

  4. Operación accidental:

    • Si inicia accidentalmente una tarea de carga innecesaria o carga una versión incorrecta del archivo, puede cancelar el evento de carga.

...
if err = bucket.AbortMultipartUpload(imur); err != nil {
log.Fatalf("failed to abort multipart upload: %w", err)
}

log.Printf("Multipart upload aborted successfully.")

¿Cómo listo las partes cargadas?

Puede utilizar el método Bucket.ListUploadedParts para listar las partes que se han cargado correctamente para un evento de carga multiparte específico en los siguientes escenarios.

Monitorear el progreso de la carga:

  1. Cargas de archivos grandes:

    • Al cargar un archivo grande, puede listar las partes cargadas para asegurarse de que la carga avanza según lo esperado e identificar rápidamente cualquier problema.

  2. Cargas reanudables:

    • Si la red es inestable o la carga se interrumpe, puede consultar las partes cargadas para decidir si reintenta cargar las partes restantes. Esto le ayuda a reanudar la carga.

  3. Solución de problemas:

    • Si ocurre un error durante la carga, puede revisar las partes cargadas para localizar rápidamente el origen del problema. Por ejemplo, si falla la carga de una parte específica, puede resolver el problema en consecuencia.

  4. Gestión de recursos:

    • En escenarios donde necesita controlar estrictamente el uso de recursos, puede monitorear el progreso de la carga para gestionar mejor el espacio de almacenamiento y los recursos de ancho de banda. Esto garantiza una utilización eficiente de los recursos.

...	
if lsRes, err := bucket.ListUploadedParts(imur); err != nil {
log.Fatalf("Failed to list uploaded parts: %v", err)
}

for _, upload := range lsRes.UploadedParts {
log.Printf("List PartNumber: %d, ETag: %s, LastModified: %v\n", upload.PartNumber, upload.ETag, upload.LastModified)
}

Listar eventos de carga multiparte

Puede utilizar el método Bucket.ListMultipartUploads para listar todos los eventos de carga multiparte en curso en un bucket en los siguientes escenarios.

Escenarios de monitoreo:

  1. Gestión de carga masiva de archivos:

    • Cuando necesita cargar muchos archivos, puede usar el método ListMultipartUploads para monitorear todas las actividades de carga multiparte en tiempo real. Esto asegura que todos los archivos se carguen correctamente por partes.

  2. Detección y recuperación de fallos:

    • Si ocurren problemas de red u otros fallos durante la carga, algunas partes podrían no cargarse. Al monitorear los eventos de carga multiparte en curso, puede detectar estos problemas oportunamente y tomar medidas para reanudar las cargas.

  3. Optimización y gestión de recursos:

    • Durante cargas de archivos a gran escala, monitorear los eventos de carga multiparte en curso puede ayudar a optimizar la asignación de recursos. Por ejemplo, puede ajustar el uso de ancho de banda u optimizar la directiva de carga según el progreso de la misma.

  4. Migración de datos:

    • Al ejecutar un proyecto de migración de datos a gran escala, puede monitorear todos los eventos de carga multiparte en curso para garantizar el buen desarrollo de la tarea de migración. Esto le permite detectar y resolver rápidamente cualquier problema potencial.

Configuración de parámetros

Parámetro

Descripción

Delimiter

Carácter utilizado para agrupar nombres de objetos. Todos los nombres de objetos que contienen el prefijo especificado y aparecen antes de la primera aparición del carácter delimitador se agrupan como un solo elemento.

MaxUploads

Número máximo de eventos de carga multiparte a devolver. Tanto el valor predeterminado como el valor máximo son 1000.

KeyMarker

Eventos de carga multiparte cuyos nombres de objeto son lexicográficamente mayores que el valor del parámetro KeyMarker. Puede usar este parámetro junto con el parámetro UploadIDMarker para especificar la posición inicial de los resultados a devolver.

Prefix

Prefijo que deben contener los nombres de objeto devueltos. Tenga en cuenta que si usa el parámetro Prefix en una consulta, los nombres de objeto devueltos seguirán conteniendo el prefijo.

UploadIDMarker

Posición inicial de los resultados a devolver. Este parámetro se usa junto con el parámetro KeyMarker.

  • Si no se establece el parámetro KeyMarker, OSS ignora este parámetro.

  • Si se establece el parámetro KeyMarker, los resultados de la consulta incluyen lo siguiente:

    • Eventos de carga multiparte cuyos nombres de objeto son lexicográficamente mayores que el valor del parámetro KeyMarker.

    • Eventos de carga multiparte cuyos nombres de objeto son iguales al valor del parámetro KeyMarker pero cuyos ID de carga son mayores que el valor del parámetro UploadIDMarker.

  • Usar parámetros predeterminados.

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.KeyMarker(keyMarker), oss.UploadIDMarker(uploadIdMarker))
    if err != nil {
    log.Fatalf("failed to list multipart uploads: %w", err)
    }
    
    for _, upload := range lsRes.Uploads {
    log.Printf("Upload: %s, UploadID: %s\n", upload.Key, upload.UploadID)
    }
  • Especificar el prefijo como file.

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.Prefix('file'))
    if err != nil {
    log.Fatalf("failed to list multipart uploads with prefix: %w", err)
    }
    
    log.Printf("Uploads:", lsRes.Uploads)
  • Especificar que se devuelva un máximo de 100 resultados.

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.MaxUploads(100))
    if err != nil {
    log.Fatalf("failed to list multipart uploads with limit: %w", err)
    }
    
    log.Printf("Uploads:", lsRes.Uploads)
  • Especificar el prefijo como file y que se devuelva un máximo de 100 resultados.

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.Prefix("file"), oss.MaxUploads(100))
    if err != nil {
    log.Fatalf("failed to list multipart uploads with prefix and limit: %w", err)
    }
    
    log.Printf("Uploads:", lsRes.Uploads)

Referencias

  • Para ver el código de ejemplo completo de carga multiparte, consulte Ejemplo en GitHub.

  • Una carga multiparte completa implica tres operaciones de API. Para obtener más información sobre estas operaciones, consulte los siguientes temas:

    • Para obtener más información sobre la operación de API utilizada para inicializar un evento de carga multiparte, consulte InitiateMultipartUpload.

    • Para obtener más información sobre la operación de API utilizada para cargar una parte, consulte UploadPart.

    • Para obtener más información sobre la operación de API utilizada para completar una carga multiparte, consulte CompleteMultipartUpload.

  • Para obtener más información sobre la operación de API utilizada para cancelar un evento de carga multiparte, consulte AbortMultipartUpload.

  • Para obtener más información sobre la operación de API utilizada para listar partes cargadas, consulte ListUploadedParts.

  • Para obtener más información sobre la operación de API utilizada para listar todos los eventos de carga multiparte en curso (eventos que se han iniciado pero aún no se han completado ni cancelado), consulte ListMultipartUploads.