Minio client object is created using minio-go:
package main
import (
"fmt"
"github.com/minio/minio-go"
)
func main() {
secure := true // Make HTTPS requests by default.
s3Client, err := minio.New("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY", secure)
if err != nil {
fmt.Println(err)
return
}
}
s3Client can be used to perform operations on S3 storage. APIs are described below.
#### MakeBucket(bucketName string, location string) error Create a new bucket.
Parameters
bucketName
string - Name of the bucket.location
string - region valid values are us-west-1, us-west-2, eu-west-1, eu-central-1, ap-southeast-1, ap-northeast-1, ap-southeast-2, sa-east-1
Return Values
err
error
Example
err := s3Client.MakeBucket("mybucket", "us-west-1")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Successfully created mybucket.")
#### ListBuckets() ([]BucketInfo, error) Lists all buckets.
Return Values
buckets
[]BucketInfo : array ofBucketInfo
objects that contain:Name
string : name of the bucketCreationDate
time.Time : date the bucket was created
err
error
Example
buckets, err := s3Client.ListBuckets()
if err != nil {
fmt.Println(err)
return
}
for _, bucket := range buckets {
fmt.Println(bucket)
}
#### BucketExists(bucketName string) error Check if bucket exists.
Parameters
bucketName
string : name of the bucket
Return Values
err
error
Example
err := s3Client.BucketExists("mybucket")
if err != nil {
fmt.Println(err)
return
}
#### RemoveBucket(bucketName string) error Remove a bucket.
Parameters
bucketName
string : name of the bucket
Return Values
err
error
Example
err := s3Client.RemoveBucket("mybucket")
if err != nil {
fmt.Println(err)
return
}
#### GetBucketPolicy(bucketName string, objectPrefix string) (BucketPolicy, error) Get access permissions on a bucket or a prefix.
Parameters
bucketName
string : name of the bucketobjectPrefix
string : name of the object prefix
Return Values
bucketPolicy
BucketPolicy : string that contains: 'none', 'readonly', 'readwrite', or 'writeonly'err
error
Example
bucketPolicy, err := s3Client.GetBucketPolicy("mybucket", "")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Access permissions for mybucket is", bucketPolicy)
#### SetBucketPolicy(bucketname string, objectPrefix string, policy BucketPolicy) error Set access permissions on bucket or an object prefix.
Parameters
bucketName
string: name of the bucketobjectPrefix
string : name of the object prefixpolicy
BucketPolicy: policy can be BucketPolicyNone, BucketPolicyReadOnly, BucketPolicyReadWrite, BucketPolicyWriteOnly
Return Values
err
error
Example
err := s3Client.SetBucketPolicy("mybucket", "myprefix", BucketPolicyReadWrite)
if err != nil {
fmt.Println(err)
return
}
#### RemoveBucketPolicy(bucketname string, objectPrefix string) error Remove existing permissions on bucket or an object prefix.
Parameters
bucketName
string: name of the bucketobjectPrefix
string : name of the object prefix
Return Values
err
error
Example
err := s3Client.RemoveBucketPolicy("mybucket", "myprefix")
if err != nil {
fmt.Println(err)
return
}
#### ListObjects(bucketName string, prefix string, recursive bool, doneCh chan struct{}) <-chan ObjectInfo List objects in a bucket.
Parameters
bucketName
string: name of the bucketobjectPrefix
string: the prefix of the objects that should be listedrecursive
bool:true
indicates recursive style listing andfalse
indicates directory style listing delimited by '/'doneCh
chan struct{} : channel for pro-actively closing the internal go routine
Return Values
<-chan ObjectInfo
chan ObjectInfo: Read channel for all the objects in the bucket, the object is of the format:objectInfo.Key
string: name of the objectobjectInfo.Size
int64: size of the objectobjectInfo.ETag
string: etag of the objectobjectInfo.LastModified
time.Time: modified time stamp
Example
// Create a done channel to control 'ListObjects' go routine.
doneCh := make(chan struct{})
// Indicate to our routine to exit cleanly upon return.
defer close(doneCh)
isRecursive := true
objectCh := s3Client.ListObjects("mybucket", "myprefix", isRecursive, doneCh)
for object := range objectCh {
if object.Err != nil {
fmt.Println(object.Err)
return
}
fmt.Println(object)
}
#### ListIncompleteUploads(bucketName string, prefix string, recursive bool, doneCh chan struct{}) <-chan ObjectMultipartInfo List partially uploaded objects in a bucket.
Parameters
bucketname
string: name of the bucketprefix
string: prefix of the object names that are partially uploadedrecursive
bool: directory style listing when false, recursive listing when truedoneCh
chan struct{} : channel for pro-actively closing the internal go routine
Return Values
<-chan ObjectMultipartInfo
chan ObjectMultipartInfo : emits multipart objects of the format:multiPartObjInfo.Key
string: name of the incomplete objectmultiPartObjInfo.UploadID
string: upload ID of the incomplete objectmultiPartObjInfo.Size
int64: size of the incompletely uploaded object
Example
// Create a done channel to control 'ListObjects' go routine.
doneCh := make(chan struct{})
// Indicate to our routine to exit cleanly upon return.
defer close(doneCh)
isRecursive := true
multiPartObjectCh := s3Client.ListIncompleteUploads("mybucket", "myprefix", isRecursive, doneCh)
for multiPartObject := range multiPartObjectCh {
if multiPartObject.Err != nil {
fmt.Println(multiPartObject.Err)
return
}
fmt.Println(multiPartObject)
}
#### GetObject(bucketName string, objectName string) *Object Download an object.
Parameters
bucketName
string: name of the bucketobjectName
string: name of the object
Return Values
object
*Object : represents object reader.
Example
object, err := s3Client.GetObject("mybucket", "photo.jpg")
if err != nil {
fmt.Println(err)
return
}
localFile _ := os.Open("/tmp/local-file")
if _, err := io.Copy(localFile, object); err != nil {
fmt.Println(err)
return
}
#### FGetObject(bucketName string, objectName string, filePath string) error Callback is called with `error` in case of error or `null` in case of success
Parameters
bucketName
string: name of the bucketobjectName
string: name of the objectfilePath
string: path to which the object data will be written to
Return Values
err
error
Example
err := s3Client.FGetObject("mybucket", "photo.jpg", "/tmp/photo.jpg")
if err != nil {
fmt.Println(err)
return
}
#### PutObject(bucketName string, objectName string, reader io.Reader, contentType string) (int64, error) Upload contents from `io.Reader` to objectName.
Parameters
bucketName
string: name of the bucketobjectName
string: name of the objectreader
io.Reader: Any golang object implementing io.ReadercontentType
string: content type of the object.
Return Values
totalUploadedSize
int64: Size in bytes of uploaded fileerr
error
Example
file, err := os.Open("my-testfile")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
n, err := s3Client.PutObject("my-bucketname", "my-objectname", object, "application/octet-stream")
if err != nil {
fmt.Println(err)
return
}
#### CopyObject(bucketName string, objectName string, objectSource string, conditions CopyConditions) error Copy a source object into a new object with the provided name in the provided bucket.
Parameters
bucketName
string: name of the bucketobjectName
string: name of the objectobjectSource
string: name of the object source.conditions
CopyConditions: Collection of supported CopyObject conditions. ['x-amz-copy-source', 'x-amz-copy-source-if-match', 'x-amz-copy-source-if-none-match', 'x-amz-copy-source-if-unmodified-since', 'x-amz-copy-source-if-modified-since']
Return Values
err
error
Example
// All following conditions are allowed and can be combined together.
// Set copy conditions.
var copyConds = minio.NewCopyConditions()
// Set modified condition, copy object modified since 2014 April.
copyConds.SetModified(time.Date(2014, time.April, 0, 0, 0, 0, 0, time.UTC))
// Set unmodified condition, copy object unmodified since 2014 April.
// copyConds.SetUnmodified(time.Date(2014, time.April, 0, 0, 0, 0, 0, time.UTC))
// Set matching ETag condition, copy object which matches the following ETag.
// copyConds.SetMatchETag("31624deb84149d2f8ef9c385918b653a")
// Set matching ETag except condition, copy object which does not match the following ETag.
// copyConds.SetMatchETagExcept("31624deb84149d2f8ef9c385918b653a")
err := s3Client.CopyObject("my-bucketname", "my-objectname", "/my-sourcebucketname/my-sourceobjectname", copyConds)
if err != nil {
fmt.Println(err)
return
}
#### FPutObject(bucketName string, objectName string, filePath string, contentType string) (int64, error) Uploads the object using contents from a file
Parameters
bucketName
string: name of the bucketobjectName
string: name of the objectfilePath
string: file path of the file to be uploadedcontentType
string: content type of the object
Return Values
totalUploadedSize
int64: Size in bytes of uploaded fileerr
: error
Example
n, err := s3Client.FPutObject("my-bucketname", "my-objectname", "/tmp/my-filename.csv", "application/csv")
if err != nil {
fmt.Println(err)
return
}
#### StatObject(bucketName string, objectName string) (ObjectInfo, error) Get metadata of an object.
Parameters
bucketName
string: name of the bucketobjectName
string: name of the object
Return Values
objInfo
ObjectInfo : object stat info for following format:objInfo.Size
int64: size of the objectobjInfo.ETag
string: etag of the objectobjInfo.ContentType
string: Content-Type of the objectobjInfo.LastModified
string: modified time stamp
err
error
Example
objInfo, err := s3Client.StatObject("mybucket", "photo.jpg")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(objInfo)
#### RemoveObject(bucketName string, objectName string) error Remove an object.
Parameters
bucketName
string: name of the bucketobjectName
string: name of the object
Return Values
err
error
Example
err := s3Client.RemoveObject("mybucket", "photo.jpg")
if err != nil {
fmt.Println(err)
return
}
#### RemoveIncompleteUpload(bucketName string, objectName string) error Remove an partially uploaded object.
Parameters
bucketName
string: name of the bucketobjectName
string: name of the object
Return Values
err
error
Example
err := s3Client.RemoveIncompleteUpload("mybucket", "photo.jpg")
if err != nil {
fmt.Println(err)
return
}
#### PresignedGetObject(bucketName, objectName string, expiry time.Duration, reqParams url.Values) (*url.URL, error) Generate a presigned URL for GET.
Parameters
bucketName
string: name of the bucket.objectName
string: name of the object.expiry
time.Duration: expiry in seconds.reqParams
url.Values : additional response header overrides supports response-expires, response-content-type, response-cache-control, response-content-disposition
Return Values
url
*url.URL : Presigned URL for GET on an objecterr
error
Example
// Set request parameters for content-disposition.
reqParams := make(url.Values)
reqParams.Set("response-content-disposition", "attachment; filename=\"your-filename.txt\"")
// Generates a presigned url which expires in a day.
presignedURL, err := s3Client.PresignedGetObject("mybucket", "photo.jpg", time.Second * 24 * 60 * 60, reqParams)
if err != nil {
fmt.Println(err)
return
}
#### PresignedPutObject(bucketName string, objectName string, expiry time.Duration) (*url.URL, error) Generate a presigned URL for PUT.
NOTE: you can upload to S3 only with specified object name.
Parameters
bucketName
string: name of the bucketobjectName
string: name of the objectexpiry
time.Duration: expiry in seconds
Return Values
url
*url.URL : Presigned URL for PUT on an objecterr
_error
Example
// Generates a url which expires in a day.
presignedURL, err := s3Client.PresignedPutObject("mybucket", "photo.jpg", time.Second * 24 * 60 * 60)
if err != nil {
fmt.Println(err)
return
}
#### PresignedPostPolicy(policy PostPolicy) (*url.URL, map[string]string, error) PresignedPostPolicy we can provide policies specifying conditions restricting what you want to allow in a POST request, such as bucket name where objects can be uploaded, key name prefixes that you want to allow for the object being created and more.
We need to create our policy first:
policy := minio.NewPostPolicy()
Apply upload policy restrictions:
policy.SetBucket("my-bucketname")
policy.SetKey("my-objectname")
policy.SetExpires(time.Now().UTC().AddDate(0, 0, 10)) // expires in 10 days
// Only allow 'png' images.
policy.SetContentType("image/png")
// Only allow content size in range 1KB to 1MB.
policy.SetContentLengthRange(1024, 1024*1024)
Get the POST form key/value object:
url, formData, err := s3Client.PresignedPostPolicy(policy)
if err != nil {
fmt.Println(err)
return
}
POST your content from the command line using curl
:
fmt.Printf("curl ")
for k, v := range m {
fmt.Printf("-F %s=%s ", k, v)
}
fmt.Printf("-F file=@/etc/bash.bashrc ")
fmt.Printf("%s\n", url)