Ao baixar um único objeto de um bucket, você pode especificar condições de baixa com base no horário da última modificação ou no ETag (identificador do conteúdo do objeto). Se as condições especificadas estiverem satisfeitas, o objeto será baixado. Caso contrário, o sistema retorna um erro e não realiza a baixa. Use a baixa condicional para reduzir a transmissão pela rede, diminuir o consumo de recursos e aumentar a eficiência do processo.
Observações
Este tópico usa o endpoint público da região China (Hangzhou). Caso queira acessar o OSS a partir de outros serviços da Alibaba Cloud na mesma região, use um endpoint interno. Para mais informações sobre as regiões e os endpoints do OSS, consulte Regions and endpoints.
Neste tópico, você obtém as credenciais de acesso a partir de variáveis de ambiente. Para mais informações sobre como configurar as credenciais de acesso, consulte Configure access credentials.
Este tópico mostra como criar uma instância do OSSClient com um endpoint do OSS. Para configurações alternativas, como o uso de domínio personalizado ou a autenticação com credenciais do Security Token Service (STS), consulte Configure a client (Go SDK V1).
O download condicional requer a permissão
oss:GetObject. Para mais informações, consulte Grant a custom policy.
Condições
A tabela a seguir descreve as condições disponíveis para a baixa de objetos.
Você pode usar If-Modified-Since e If-Unmodified-Since juntos. Também é possível usar If-Match e If-None-Match em conjunto.
Obtenha o ETag chamando ossClient.getObjectMetadata.
|
Parâmetro |
Descrição |
Método de configuração |
|
If-Modified-Since |
O objeto pode ser baixado se o horário especificado for anterior ao último horário de modificação do objeto. Caso contrário, retorna 304 Not Modified. |
oss.IfModifiedSince |
|
If-Unmodified-Since |
O objeto pode ser baixado se o horário especificado for posterior ou igual ao último horário de modificação do objeto. Caso contrário, retorna 412 Precondition Failed. |
oss.IfUnmodifiedSince |
|
If-Match |
O objeto pode ser baixado se o ETag especificado corresponder ao ETag do objeto. Caso contrário, retorna 412 Precondition Failed. |
oss.IfMatch |
|
If-None-Match |
O objeto pode ser baixado se o ETag especificado for diferente do ETag do objeto. Caso contrário, retorna 304 Not Modified. |
oss.IfNoneMatch |
Exemplos
O código de exemplo a seguir mostra como executar a baixa condicional:
package main
import (
"fmt"
"os"
"time"
"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 {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create an OSSClient instance.
// 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 your actual endpoint.
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Specify the version of the signature algorithm.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Specify the name of your bucket.
bucket, err := client.Bucket("yourBucketName")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// For example, an object was last modified at 18:43:02, on November 21, 2023. If the specified time is earlier than the last modified time, the object meets the If-Modified-Since condition and the object is downloaded.
date := time.Date(2023, time.November, 21, 10, 40, 02, 0, time.UTC)
// The object is not downloaded if it does not meet the specified conditions.
// Specify the full path of the object. Do not include the bucket name in the full path.
err = bucket.GetObjectToFile("yourObjectName", "LocalFile", oss.IfUnmodifiedSince(date))
if err == nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// The object is downloaded if it meets the specified conditions.
err = bucket.GetObjectToFile("yourObjectName", "LocalFile", oss.IfModifiedSince(date))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}