Загрузка файла в S3 с Go и minio-go client

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

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *