Для одного из проектов потребовалось сделать сервис по хранению файлов в одном из провайдеров, поддерживающих 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 вы можете найти тут.