Files
storage/s3/s3_methods.go
Zhang Huangbin 1ddcc7b3fc Add example in README.
Use `map[string][]byte` instead of `map[string]string`.
2023-09-05 16:27:09 +08:00

51 lines
1.3 KiB
Go

package s3
import (
"bytes"
"fmt"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
// Additional methods for S3, but not required by gofiber Storage interface.
// SetWithChecksum sets key with value and checksum.
// Key of `checksum` map is algorithm in upper cases, value is the checksum.
// Currently only 4 algorithm are supported: `CRC32`, `CRC32C`, `SHA1`, `SHA256`.
//
// For more information, see [PutObjectInput](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/s3#PutObjectInput).
func (s *Storage) SetWithChecksum(key string, val []byte, checksum map[string][]byte) error {
if len(key) <= 0 {
return nil
}
ctx, cancel := s.requestContext()
defer cancel()
poi := &s3.PutObjectInput{
Bucket: &s.bucket,
Key: aws.String(key),
Body: bytes.NewReader(val),
}
for alg, sum := range checksum {
switch alg {
case "CRC32":
poi.ChecksumCRC32 = aws.String(fmt.Sprintf("%x", sum))
case "CRC32C":
poi.ChecksumCRC32C = aws.String(fmt.Sprintf("%x", sum))
case "SHA1":
poi.ChecksumSHA1 = aws.String(fmt.Sprintf("%x", sum))
case "SHA256":
poi.ChecksumSHA256 = aws.String(fmt.Sprintf("%x", sum))
default:
return fmt.Errorf("invalid checksum algorithm: %s", alg)
}
}
_, err := s.uploader.Upload(ctx, poi)
return err
}