core.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*
  2. * Minio Go Library for Amazon S3 Compatible Cloud Storage
  3. * Copyright 2015-2017 Minio, Inc.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package minio
  18. import (
  19. "context"
  20. "io"
  21. "strings"
  22. "github.com/minio/minio-go/pkg/policy"
  23. )
  24. // Core - Inherits Client and adds new methods to expose the low level S3 APIs.
  25. type Core struct {
  26. *Client
  27. }
  28. // NewCore - Returns new initialized a Core client, this CoreClient should be
  29. // only used under special conditions such as need to access lower primitives
  30. // and being able to use them to write your own wrappers.
  31. func NewCore(endpoint string, accessKeyID, secretAccessKey string, secure bool) (*Core, error) {
  32. var s3Client Core
  33. client, err := NewV4(endpoint, accessKeyID, secretAccessKey, secure)
  34. if err != nil {
  35. return nil, err
  36. }
  37. s3Client.Client = client
  38. return &s3Client, nil
  39. }
  40. // ListObjects - List all the objects at a prefix, optionally with marker and delimiter
  41. // you can further filter the results.
  42. func (c Core) ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (result ListBucketResult, err error) {
  43. return c.listObjectsQuery(bucket, prefix, marker, delimiter, maxKeys)
  44. }
  45. // ListObjectsV2 - Lists all the objects at a prefix, similar to ListObjects() but uses
  46. // continuationToken instead of marker to further filter the results.
  47. func (c Core) ListObjectsV2(bucketName, objectPrefix, continuationToken string, fetchOwner bool, delimiter string, maxkeys int) (ListBucketV2Result, error) {
  48. return c.listObjectsV2Query(bucketName, objectPrefix, continuationToken, fetchOwner, delimiter, maxkeys)
  49. }
  50. // CopyObject - copies an object from source object to destination object on server side.
  51. func (c Core) CopyObject(sourceBucket, sourceObject, destBucket, destObject string, metadata map[string]string) (ObjectInfo, error) {
  52. return c.copyObjectDo(context.Background(), sourceBucket, sourceObject, destBucket, destObject, metadata)
  53. }
  54. // CopyObjectPart - creates a part in a multipart upload by copying (a
  55. // part of) an existing object.
  56. func (c Core) CopyObjectPart(srcBucket, srcObject, destBucket, destObject string, uploadID string,
  57. partID int, startOffset, length int64, metadata map[string]string) (p CompletePart, err error) {
  58. return c.copyObjectPartDo(context.Background(), srcBucket, srcObject, destBucket, destObject, uploadID,
  59. partID, startOffset, length, metadata)
  60. }
  61. // PutObject - Upload object. Uploads using single PUT call.
  62. func (c Core) PutObject(bucket, object string, data io.Reader, size int64, md5Base64, sha256Hex string, metadata map[string]string) (ObjectInfo, error) {
  63. opts := PutObjectOptions{}
  64. m := make(map[string]string)
  65. for k, v := range metadata {
  66. if strings.ToLower(k) == "content-encoding" {
  67. opts.ContentEncoding = v
  68. } else if strings.ToLower(k) == "content-disposition" {
  69. opts.ContentDisposition = v
  70. } else if strings.ToLower(k) == "content-type" {
  71. opts.ContentType = v
  72. } else if strings.ToLower(k) == "cache-control" {
  73. opts.CacheControl = v
  74. } else {
  75. m[k] = metadata[k]
  76. }
  77. }
  78. opts.UserMetadata = m
  79. return c.putObjectDo(context.Background(), bucket, object, data, md5Base64, sha256Hex, size, opts)
  80. }
  81. // NewMultipartUpload - Initiates new multipart upload and returns the new uploadID.
  82. func (c Core) NewMultipartUpload(bucket, object string, opts PutObjectOptions) (uploadID string, err error) {
  83. result, err := c.initiateMultipartUpload(context.Background(), bucket, object, opts)
  84. return result.UploadID, err
  85. }
  86. // ListMultipartUploads - List incomplete uploads.
  87. func (c Core) ListMultipartUploads(bucket, prefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (result ListMultipartUploadsResult, err error) {
  88. return c.listMultipartUploadsQuery(bucket, keyMarker, uploadIDMarker, prefix, delimiter, maxUploads)
  89. }
  90. // PutObjectPart - Upload an object part.
  91. func (c Core) PutObjectPart(bucket, object, uploadID string, partID int, data io.Reader, size int64, md5Base64, sha256Hex string) (ObjectPart, error) {
  92. return c.PutObjectPartWithMetadata(bucket, object, uploadID, partID, data, size, md5Base64, sha256Hex, nil)
  93. }
  94. // PutObjectPartWithMetadata - upload an object part with additional request metadata.
  95. func (c Core) PutObjectPartWithMetadata(bucket, object, uploadID string, partID int, data io.Reader,
  96. size int64, md5Base64, sha256Hex string, metadata map[string]string) (ObjectPart, error) {
  97. return c.uploadPart(context.Background(), bucket, object, uploadID, data, partID, md5Base64, sha256Hex, size, metadata)
  98. }
  99. // ListObjectParts - List uploaded parts of an incomplete upload.x
  100. func (c Core) ListObjectParts(bucket, object, uploadID string, partNumberMarker int, maxParts int) (result ListObjectPartsResult, err error) {
  101. return c.listObjectPartsQuery(bucket, object, uploadID, partNumberMarker, maxParts)
  102. }
  103. // CompleteMultipartUpload - Concatenate uploaded parts and commit to an object.
  104. func (c Core) CompleteMultipartUpload(bucket, object, uploadID string, parts []CompletePart) error {
  105. _, err := c.completeMultipartUpload(context.Background(), bucket, object, uploadID, completeMultipartUpload{
  106. Parts: parts,
  107. })
  108. return err
  109. }
  110. // AbortMultipartUpload - Abort an incomplete upload.
  111. func (c Core) AbortMultipartUpload(bucket, object, uploadID string) error {
  112. return c.abortMultipartUpload(context.Background(), bucket, object, uploadID)
  113. }
  114. // GetBucketPolicy - fetches bucket access policy for a given bucket.
  115. func (c Core) GetBucketPolicy(bucket string) (policy.BucketAccessPolicy, error) {
  116. return c.getBucketPolicy(bucket)
  117. }
  118. // PutBucketPolicy - applies a new bucket access policy for a given bucket.
  119. func (c Core) PutBucketPolicy(bucket string, bucketPolicy policy.BucketAccessPolicy) error {
  120. return c.putBucketPolicy(bucket, bucketPolicy)
  121. }
  122. // GetObject is a lower level API implemented to support reading
  123. // partial objects and also downloading objects with special conditions
  124. // matching etag, modtime etc.
  125. func (c Core) GetObject(bucketName, objectName string, opts GetObjectOptions) (io.ReadCloser, ObjectInfo, error) {
  126. return c.getObject(context.Background(), bucketName, objectName, opts)
  127. }
  128. // StatObject is a lower level API implemented to support special
  129. // conditions matching etag, modtime on a request.
  130. func (c Core) StatObject(bucketName, objectName string, opts StatObjectOptions) (ObjectInfo, error) {
  131. return c.statObject(context.Background(), bucketName, objectName, opts)
  132. }