Для одного из проектов потребовалось сделать сервис по хранению файлов в одном из провайдеров, поддерживающих S3 API. В качестве клиента была использована библиотека minio-go. Minio — это OpenSource аналог S3, а minio-go — удобный клиент для работы с ним.
Напишем приложение-песочницу, которая будет загружать файл с локального компьютера и получать обратно ссылку для скачивания файла с коротким временем жизни:
package main
import (
"log"
"net/url"
"time"
"github.com/minio/minio-go/v6"
)
func main() {
endpoint := "fra1.digitaloceanspaces.com"
location := "fra1"
accessKeyID := ""
secretAccessKey := ""
useSSL := true
bucketName := "sassoft"
objectName := "hello.txt"
filePath := "/hello.txt"
// Initialize minio client object.
minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL)
if err != nil {
log.Fatalln(err)
}
err = uploadFile(minioClient, bucketName, location, objectName, filePath)
if err != nil {
log.Fatalln(err)
}
// Set request parameters
reqParams := make(url.Values)
reqParams.Set("response-content-disposition", "attachment; filename=\""+objectName+"\"")
// Generate presigned get object url.
presignedURL, err := minioClient.PresignedGetObject(bucketName, objectName, time.Duration(1000)*time.Second, reqParams)
if err != nil {
log.Fatalln(err)
}
log.Println(presignedURL)
}
func uploadFile(minioClient *minio.Client, bucketName, location, objectName, filePath string) error {
err := minioClient.MakeBucket(bucketName, location)
if err != nil {
// Check to see if we already own this bucket (which happens if you run this twice)
exists, errBucketExists := minioClient.BucketExists(bucketName)
if errBucketExists == nil && exists {
log.Printf("We already own %s\n", bucketName)
} else {
return err
}
}
n, err := minioClient.FPutObject(bucketName, objectName, filePath, minio.PutObjectOptions{})
if err != nil {
log.Fatalln(err)
}
log.Printf("Successfully uploaded %s of size %d\n", objectName, n)
return nil
}
До запуска программы нужно будет прописать параметры конфигурации вашего S3 хранилища.
Minio-go также поддерживает credentials-chain — конфигурация может быть считана с параметров окружения, .env файлов либо по средствам получения ключей через IAM роль в AWS.
Результат работы программы должен выглядеть примерно так:
2019/12/15 15:38:43 We already own sassoft 2019/12/15 15:38:43 Successfully uploaded hello.txt of size 7 2019/12/15 15:39:01 https://fra1.digitaloceanspaces.com/sassoft/hello.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=4CFKK6D2ZO5CCXHBAOP2%2F20191215%2Ffra1%2Fs3%2Faws4_request&X-Amz-Date=20191215T143854Z&X-Amz-Expires=1000&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22hello.txt%22&X-Amz-Signature=cbde416126778ac707ee4cb17fb42a5283858d4b0611c95b3b8b24a7e38c428f
Больше примеров работы с minio-go вы можете найти тут.