4 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
確保您具有以下權(quán)限:“s3:GetObject”、“s3:ListBucket”、
關(guān)于安全性,AWS剛剛為S3引入了強(qiáng)一致性
s3svc = s3.New(sess)
func keyExists(bucket string, key string) (bool, error) {
_, err := s3svc.HeadObject(&s3.HeadObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
})
if err != nil {
if aerr, ok := err.(awserr.Error); ok {
switch aerr.Code() {
case "NotFound": // s3.ErrCodeNoSuchKey does not work, aws is missing this error code so we hardwire a string
return false, nil
default:
return false, err
}
}
return false, err
}
return true, nil
}

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您使用適用于 Go V2 的 AWS 開(kāi)發(fā)工具包:
import (
? ? ...
? ? awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
? ? ...
)
func uploaded(ctx context.Context, client *s3.Client, bucket string, key string) (bool, error) {
? ? _, err := client.HeadObject(ctx, &s3.HeadObjectInput{
? ? ? ? Bucket: aws.String(bucket),
? ? ? ? Key:? ? aws.String(key),
? ? })
? ? if err != nil {
? ? ? ? var responseError *awshttp.ResponseError
? ? ? ? if errors.As(err, &responseError) && responseError.ResponseError.HTTPStatusCode() == http.StatusNotFound {
? ? ? ? ? ? return false, nil
? ? ? ? }
? ? ? ? return false, err
? ? }
? ? return true, nil
}

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以嘗試使用以下代碼來(lái)獲取對(duì)象元數(shù)據(jù):
sess, err := session.NewSession(&aws.Config{
? ? Region: aws.String("your-region"),
})
if err != nil {
? ? //handle error here
}
svc := s3.New(session.Must(sess, err))
output, err := svc.HeadObject(&s3.HeadObjectInput{
? ? Bucket: aws.String("bucket_name"),
? ? Key:? ? aws.String("object_key"),
})
if err != nil {
? ? //handle error here
}
fmt.Println(output.LastModified) //do something with metadata

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
只需參考 AWS API S3 HeadObject 方法:AWS API 文檔。如果缺少對(duì)象,它將返回狀態(tài)代碼 404。
HEAD 請(qǐng)求與對(duì)象上的 GET 操作具有相同的選項(xiàng)。該響應(yīng)與 GET 響應(yīng)相同,只是沒(méi)有響應(yīng)正文。因此,如果 HEAD 請(qǐng)求生成錯(cuò)誤,它會(huì)返回通用的 404 Not Found 或 403 Forbidden 代碼。
import (
? "context"
? "github.com/aws/aws-sdk-go-v2/aws"
? "github.com/aws/aws-sdk-go-v2/service/s3"
? "log"
)
func IsObjectExistsInS3Bucket(bucketName string, objectKey string) bool{
? _, err := executeHeadObjectMethodOnS3Api(bucketName, objectKey)
? return ! handleErrorOnS3HeadObjectAction(bucketName, objectKey, err)
}
func executeHeadObjectMethodOnS3Api(bucketName string, objectKey string) (output *s3.HeadObjectOutput, err error){
? s3Client := getS3Client()
? return s3Client.HeadObject(context.TODO(), &s3.HeadObjectInput{
? ? Bucket:? ? ? ? ? ? ? ?aws.String(bucketName),
? ? Key:? ? ? ? ? ? ? ? ? aws.String(objectKey),
? })
}
func handleErrorOnS3HeadObjectAction(bucketName, objectKey string, err error) (hit bool){
? logUnableToHeadObjectFromS3Bucket(bucketName, objectKey, err)
? return err != nil
}
func logUnableToHeadObjectFromS3Bucket(bucketName string, objectKey string, err error) {
? if err != nil {
? ? log.Printf("Unable to head object {%s} from S3 bucket {%s}: { %v }", objectKey, bucketName, err)
? }
}
- 4 回答
- 0 關(guān)注
- 210 瀏覽
添加回答
舉報(bào)