如何在 Go 中使用 Vultr 對象存儲

介紹

Vultr 對象存儲是一種高度可擴展、與 S3 兼容的雲對象存儲解決方案,用於存儲文件或對象。 本指南解釋瞭如何在 Go 中使用 Vultr 對象存儲GoVultr v2以及如何使用適用於 Go 的 AWS 開發工具包管理對象存儲中的存儲桶。

以前的要求

將需要:

  • 在 Linux、Windows 或 macOS 上運行的計算機工作站
  • 安裝在您的計算機工作站上的最新版本的 Go

這些示例使用 Linux $ 提示,但這些命令也適用於 Mac 和 Windows。

使用 Go 管理 Vultr 對象存儲

  1. 生成一個API 密鑰從你的API 配置經過啟用您的 API.

    警告:確保您的 API 密鑰安全。您的 API 密鑰可以訪問您的整個 Vultr 帳戶,公開公開您的 API 密鑰可能會危及您的帳戶。

  2. 創建一個新的項目文件夾。

                              
                                $ mkdir ObjectStorage
    
                              
                            
  3. 將目錄更改為新文件夾。

                              
                                $ cd ObjectStorage
    
                              
                            
  4. 初始化模塊。

                              
                                $ go mod init ObjectStorage
    
                              
                            
  5. 安裝GoVultr v2.

                              
                                $ go get -u github.com/vultr/govultr/v2
    
                              
                            
  6. 安裝oAuth2 去.

                              
                                $ go get golang.org/x/oauth2
    
                              
                            
  7. 將您的 API 密鑰設置為環境變量。 代替 YOUR-API-KEY-HERE 使用您的 API 密鑰在您的API 配置.

    Linux 和 macOS 工作站運行:

                              
                                $ export VULTR_API_KEY=YOUR-API-KEY-HERE
    
                              
                            

    Windows 工作站運行:

                              
                                C:\> setx VULTR_API_KEY "YOUR-API-KEY-HERE"
    
                              
                            
  8. 使用您最喜歡的純文本編輯器創建和編輯 main.go . Linux 用戶可以使用 nano Mac 和 Windows 用戶可以選擇 TextEdit 任何一個 Notepad .

                              
                                $ nano main.go
    
                              
                            
  9. 將以下代碼粘貼到 main.go 它配置了 main 打包並導入所有必要的包。

                              
                                package main
    
    import (
        "bufio"
         "context"
         "fmt"
         "log"
         "os"
         "strings"
         "time"
    
         "github.com/vultr/govultr/v2"
         "golang.org/x/oauth2"
    )
    
                              
                            
  10. 將以下代碼粘貼到 main.go 它聲明了全局變量。

                              
                                var (
         apiKey       = os.Getenv("VULTR_API_KEY")
         vc           *govultr.Client
         ctx          = context.Background()
         input        int
         input2       string
         loop         string
         objStorageID string
    )
    
                              
                            
  11. 將以下代碼粘貼到 main.go 初始化oAuth2 配置,代幣來源Vultr 客戶端.

                              
                                func init() {
        config := &oauth2.Config{}
        ts := config.TokenSource(ctx, &oauth2.Token{AccessToken: apiKey})
        vc = govultr.NewClient(oauth2.NewClient(ctx, ts))
    }
    
                              
                            

使用 GoVultr 進行對象存儲管理

填寫您的 main.go 每個函數的文件。 每個函數都針對特定的對象存儲操作。

函數:listClusters()

此函數列出所有對象存儲集群。 如果枚舉集群時出錯或未找到集群,則停止程序。

                      
                        func listClusters() {
     clusterList, meta, err := vc.ObjectStorage.ListCluster(ctx, nil)
     if err != nil {
          log.Panicf("Error listing clusters: %s", err)
     }
     if meta.Total <= 0 {
          log.Panic("There are no clusters found to create an Object Storage.")
     }
     log.Printf("List of All Clusters: %+v", clusterList)
}

                      
                    

函數:createObjStorage()

此函數在您選擇的集群上創建一個對象存儲,然後在返回後打印其完整信息。積極的. 如果創建對象存儲有任何錯誤,則停止程序。

本指南使用 ClusterID 2 這是 Vultr 在新澤西的對象存儲位置, ewr1.vultrobjects.com .

                      
                        func createObjStorage() {
     var objStorageName string
     clusterID := 2
     fmt.Print("Enter Your Desired Object Storage Name: ")
     scanner := bufio.NewScanner(os.Stdin)
     for scanner.Scan() {
          objStorageName = scanner.Text()
          fmt.Print()
          if objStorageName != "" {
               break
          }
     }
     objStorageNew, errn := vc.ObjectStorage.Create(ctx, clusterID, objStorageName)
     if errn != nil {
          log.Panicf("Error creating storage: %s", errn)
     } else {
          log.Printf("Succesfully created an Object Storage with ID: %s", objStorageNew.ID)
     }
     for {
          objStorageNewInfo, erri := vc.ObjectStorage.Get(ctx, objStorageNew.ID)
          if erri != nil {
               log.Panicf("Error getting Object Storage Information: %s", erri)
          }
          if objStorageNewInfo.Status == "active" {
               log.Print("Your Object Storage is now Active.")
               log.Printf("Object Storage Information: %+v", objStorageNewInfo)
               log.Println("S3 Credentials: ")
               log.Printf("Hostname: %s | Access Key: %s | Secret Key: %s", objStorageNewInfo.S3Hostname, objStorageNewInfo.S3AccessKey, objStorageNewInfo.S3SecretKey)
               break
          }
          log.Printf("The Object Storage is currently %s. Waiting another ten seconds until it becomes active.", objStorageNewInfo.Status)
          time.Sleep(time.Second * 10)
     }
}

                      
                    

該功能需要用戶輸入:對象存儲所需的用戶名稱。 然後它會創建一個新的對象存儲並每隔十秒檢查一次新創建的對象存儲的狀態,直到它被激活。 一旦對象存儲狀態變為活動狀態,它就會顯示其完整信息。

函數:listObjStorage1() 和 listObjStorage2()

這些函數列出了您帳戶中的所有對象存儲。 有兩種方法可以顯示對象的存儲信息。

首先:將所有對象存儲一一列出,然後以JSON格式顯示數據。

                      
                        func listObjStorage1() {
     objStorageList, meta, err := vc.ObjectStorage.List(ctx, nil)
     log.Printf("The Total Number of Object Storage: %d", meta.Total)
     for x := 0; x != len(objStorageList); x++ {
          log.Printf("Object Storage #%d:", x+1)
          log.Printf("List of Object Storage: %+v", objStorageList[x])
          log.Println()
     }
     if err != nil {
          log.Panicf("Error listing Object Storage: %s", err)
     }
}

                      
                    

此功能以 JSON 格式顯示您帳戶中的活動對象存儲總數及其完整信息。

第二:將所有對象存儲一一列出,然後通過鍵值對顯示每個對象存儲中的數據。

                      
                        func listObjStorage2() {
     objStorageList, meta, err := vc.ObjectStorage.List(ctx, nil)
     log.Printf("The Total Number of Object Storage: %d", meta.Total)
     for x := 0; x != len(objStorageList); x++ {
          log.Printf("Object Storage #%d:", x+1)
          log.Printf("Date Created: %s", objStorageList[x].DateCreated)
          log.Printf("Object Storage ID: %s", objStorageList[x].ID)
          log.Printf("Object Storage Label: %s", objStorageList[x].Label)
          log.Printf("Object Storage Location: %s", objStorageList[x].Location)
          log.Printf("Object Storage Region: %s", objStorageList[x].Region)
          log.Printf("Object Storage Hostname: %s", objStorageList[x].S3Hostname)
          log.Printf("Object Storage Access Key: %s", objStorageList[x].S3AccessKey)
          log.Printf("Object Storage Secret Key: %s", objStorageList[x].S3SecretKey)
          log.Printf("Object Storage Status: %s", objStorageList[x].Status)
          log.Printf("Object Storage Cluster ID: %d", objStorageList[x].ObjectStoreClusterID)
          log.Println()
     }
     if err != nil {
          log.Panicf("Error listing Object Storage: %s", err)
     }
}

                      
                    

此功能顯示您帳戶中的活動對象存儲總數及其完整信息。 這對象存儲標識當您想要操作對象存儲時需要。

函數:getObjStorage()

此函數顯示特定對象存儲的完整信息,或者如果從其對象存儲獲取信息時出錯,則停止程序。

                      
                        func getObjStorage() {
     fmt.Println("To Get your Object Storage's ID, List all of your Object Storage.")
     fmt.Print("Enter Your Object Storage's ID to get its Full Information (e.g. cb676a46-66fd-4dfb-b839-443f2e6c0b60): ")
     fmt.Scan(&objStorageID)
     objStorageGet, err := vc.ObjectStorage.Get(ctx, objStorageID)
     log.Printf("Full information of Object Storage with an ID \"%s\".", objStorageID)
     log.Printf("Object Storage ID: %s", objStorageGet.ID)
     log.Printf("Date Created: %s", objStorageGet.DateCreated)
     log.Printf("Label: %s", objStorageGet.Label)
     log.Printf("Location: %s", objStorageGet.Location)
     log.Printf("Region: %s", objStorageGet.Region)
     log.Printf("S3 Hostname: %s", objStorageGet.S3Hostname)
     log.Printf("S3 Access Key: %s", objStorageGet.S3AccessKey)
     log.Printf("S3 Secret Key: %s", objStorageGet.S3SecretKey)
     log.Printf("Status: %s", objStorageGet.Status)
     log.Printf("Cluster ID: %d", objStorageGet.ObjectStoreClusterID)
     log.Println()
     if err != nil {
          log.Panicf("Error Getting Object Storage that has an ID %s: %s", objStorageID, err)
     }
}

                      
                    

此功能需要用戶輸入:您的對象存儲 ID,您可以在列出所有對象存儲時找到該 ID。

函數:delObjStorage()

此函數刪除特定對象存儲。

                      
                        func delObjStorage() {
     fmt.Println("To Get your Object Storage's ID, List all of your Object Storage.")
     fmt.Print("Enter the ID of the Object Storage that you want to Delete (e.g. cb676a46-66fd-4dfb-b839-443f2e6c0b60): ")
     fmt.Scan(&objStorageID)
     objStorageDel := vc.ObjectStorage.Delete(ctx, objStorageID)
     if objStorageDel == nil {
          log.Printf("Successfully deleted object storage with an ID \"%s\"", objStorageID)
     }
}

                      
                    

此功能需要用戶輸入:您要刪除的對象存儲的 ID。

函數:更新存儲對象()

此函數更新或更改特定對象存儲的標籤。

                      
                        func updateObjectStorage() {
     var newLabel string
     fmt.Println("To Get your Object Storage's ID, List all of your Object Storage.")
     fmt.Print("Enter the ID of the Object Storage that you want to Update the Label (e.g. cb676a46-66fd-4dfb-b839-443f2e6c0b60): ")
     fmt.Scan(&objStorageID)
     fmt.Print("Enter Your Desired New Object Storage Label: ")
     scanner := bufio.NewScanner(os.Stdin)
     for scanner.Scan() {
          newLabel = scanner.Text()
          fmt.Print()
          if newLabel != "" {
               break
          }
     }
     objStorageUpdate := vc.ObjectStorage.Update(ctx, objStorageID, newLabel)
     if objStorageUpdate == nil {
          log.Printf("Succesfully updated the label of the object storage with an ID of: \"%s\"", objStorageID)
     }
     fmt.Print()
}

                      
                    

此功能需要兩個用戶輸入:您的對象存儲 ID,您可以在列出所有對象存儲時找到它,以及您的新首選對象存儲標籤。

regenKeys() 函數

此函數將生成特定對象存儲的新訪問密鑰和密鑰。

                      
                        func regenKeys() {
     fmt.Println("To Get your Object Storage's ID, List all of your Object Storage.")
     fmt.Print("Enter the ID of the Object Storage that you want to Regenerate Keys (e.g. cb676a46-66fd-4dfb-b839-443f2e6c0b60): ")
     fmt.Scan(&objStorageID)
     objStorageNewKeys, err := vc.ObjectStorage.RegenerateKeys(ctx, objStorageID)
     log.Print("Successfully Regenerated new S3 Credentials.")
     log.Printf("Your Object Storage's New S3 Credentials are: %v", objStorageNewKeys)
     log.Printf("S3 Hostname: %s", objStorageNewKeys.S3Hostname)
     log.Printf("S3 Access Key: %s", objStorageNewKeys.S3AccessKey)
     log.Printf("S3 Secret Key: %s", objStorageNewKeys.S3SecretKey)
     if err != nil {
          log.Panicf("Error Regenerating New S3 Credentials: %v", err)
     }
}

                      
                    

此功能需要用戶輸入:您要為其重新設置密鑰的對象存儲的 ID。

主要功能

該函數詢問用戶他們想要執行什麼對象存儲操作,然後根據用戶輸入調用特定函數。

                      
                        func main() {
     for {
          fmt.Println("Input '1' to List All Object Storage Clusters.")
          fmt.Println("Input '2' to Create an Object Storage.")
          fmt.Println("Input '3' to List All Object Storage (Less Organized).")
          fmt.Println("Input '4' to List All Object Storage (More Organized).")
          fmt.Println("Input '5' to Get the Full Information of your Object Storage.")
          fmt.Println("Input '6' to Delete an Object Storage.")
          fmt.Println("Input '7' to Update an Object Storage's Label.")
          fmt.Println("Input '8' to Regenerate Access Key and Secret Key of your Object Storage.")
          fmt.Print("Your Input: ")
          fmt.Scan(&input)
          switch input {
          case 1:
               listClusters()
          case 2:
               createObjStorage()
          case 3:
               listObjStorage1()
          case 4:
               listObjStorage2()
          case 5:
               getObjStorage()
          case 6:
               delObjStorage()
          case 7:
               updateObjectStorage()
          case 8:
               regenKeys()
          default:
               fmt.Println("Invalid Input! Please try again.")
               continue
          }

          fmt.Print("Do you want to rerun the program? (y/n): ")
          fmt.Scan(&input2)
          loop = strings.ToLower(input2)
          if loop == "n" {
               fmt.Println("Closing the Program...")
               time.Sleep(2 * time.Second)
               break
          } else if loop == "y" {
               continue
          } else {
               log.Fatal("Invalid Input! Closing the Program.")
               time.Sleep(2 * time.Second)
          }
     }
}

                      
                    

創建對象存儲項目

填完後 main.go 包含示例代碼的文件,保存並關閉文件。 然後將代碼編譯成二進制可執行文件。

                      
                        $ go build

                      
                    

運行可執行文件,然後選擇要執行的對象存儲操作。

                      
                        $ ./ObjectStorage

                      
                    

多維數據集操作

要管理您的存儲桶,請使用適用於 Go 的 AWS 開發工具包.

配置立方體項目環境

  1. 創建一個新的項目文件夾。

                              
                                $ mkdir Bucket
    
                              
                            
  2. 將目錄更改為新文件夾。

                              
                                $ cd Bucket
    
                              
                            
  3. 初始化模塊。

                              
                                $ go mod init Bucket
    
                              
                            
  4. 安裝適用於 Go 的 AWS 開發工具包.

                              
                                $ go get github.com/aws/aws-sdk-go
    
                              
                            
  5. 安裝啞劇類型. 該包用於設置要上傳的每個文件的內容類型。

                              
                                $ go get github.com/gabriel-vasile/mimetype
    
                              
                            
  6. 從以下位置獲取對象存儲的訪問密鑰和密鑰vultr 的網站或使用 ObjectStorage 上面的程序。

  7. 將對象存儲的訪問密鑰和密鑰設置為環境變量。 代替 YOUR-ACCESS-KEY-HERE YOUR-SECRET-KEY-HERE 使用對象存儲的訪問密鑰和密鑰。

    Linux 和 macOS 工作站運行:

                              
                                $ export ACCESS_KEY=YOUR-ACCESS-KEY-HERE
    $ export SECRET_KEY=YOUR-SECRET-KEY-HERE
    
                              
                            

    Windows 工作站運行:

                              
                                C:\> setx ACCESS_KEY "YOUR-ACCESS-KEY-HERE"
    C:\> setx SECRET_KEY "YOUR-SECRET-KEY-HERE"
    
                              
                            
  8. 使用您最喜歡的純文本編輯器創建和編輯 main.go . Linux 用戶可以使用 nano Mac 和 Windows 用戶可以選擇 TextEdit 任何一個 Notepad .

                              
                                $ nano main.go
    
                              
                            
  9. 將以下代碼粘貼到 main.go 它配置了 main 打包並導入所有必要的包。

                              
                                package main
    
    import (
         "fmt"
         "io/ioutil"
         "log"
         "os"
         "path"
         "regexp"
         "strings"
         "time"
    
         "github.com/aws/aws-sdk-go/aws"
         "github.com/aws/aws-sdk-go/aws/awserr"
         "github.com/aws/aws-sdk-go/aws/credentials"
         "github.com/aws/aws-sdk-go/aws/session"
         "github.com/aws/aws-sdk-go/service/s3"
         "github.com/gabriel-vasile/mimetype"
    )
    
                              
                            
  10. 將以下代碼粘貼到 main.go 它聲明了全局變量。

                              
                                var (
         s3Vultr    *s3.S3
         accessKey  = os.Getenv("ACCESS_KEY")
         secretKey  = os.Getenv("SECRET_KEY")
         bucketName string
         directory  string
         filename   string
         input      int
         input2     string
         loop       string
    )
    
                              
                            
  11. 將以下代碼粘貼到 main.go 初始化 Vultr S3 會話。

                              
                                func init() {
        s3Vultr = s3.New(session.Must(session.NewSession(&aws.Config{
            Region:      aws.String("ewr"),
            Credentials: credentials.NewStaticCredentials(accessKey, secretKey, ""),
            Endpoint:    aws.String("https://ewr1.vultrobjects.com/"),
        })))
    }
    
                              
                            

使用適用於 Go 的 AWS 開發工具包的存儲桶操作

填寫您的 main.go 每個函數的文件。 每個功能都針對特定的存款操作。

函數:listAllBuckets()

此函數列出對象存儲中的所有存儲桶。

                      
                        func listAllBuckets() (ret *s3.ListBucketsOutput) {
     ret, err := s3Vultr.ListBuckets(&s3.ListBucketsInput{})
     if err != nil {
          panic(err)
     }
     return ret
}

                      
                    

函數:createBucket()

這個函數有兩個輔助函數, nameCheck() newBucket() . 在您的對象存儲中創建一個存儲桶,如果存儲桶名稱已存在,則停止程序。 需要用戶輸入:您的存款首選名稱。 如果您輸入的存儲桶名稱不符合命名存儲桶的條件,系統會提示您重新輸入另一個存儲桶名稱。

                      
                        func nameCheck(str string) bool {
     checker := regexp.MustCompile(`^[a-z0-9-]*$`).MatchString(str)
     alphanumeric := "abcdefghijklmnopqrstuvwxyz1234567890"
     if checker && strings.Contains(alphanumeric, string(str[0])) && len(str) >= 3 && len(str) <= 63 {
          return true
     } else {
          return false
     }
}

func newBucket() (ret *s3.CreateBucketOutput) {
     _, err := s3Vultr.CreateBucket(&s3.CreateBucketInput{
          Bucket: aws.String(bucketName),
          CreateBucketConfiguration: &s3.CreateBucketConfiguration{
               LocationConstraint: aws.String(""),
          },
     })
     if awsError, ok := err.(awserr.Error); ok {
          if awsError.Code() == s3.ErrCodeBucketAlreadyExists {
               log.Fatalf("Bucket %q already exists. Error: %v", bucketName, awsError.Code())
          }
     } else {
          log.Printf("Successfully created bucket %q", bucketName)
     }
     return ret
}

func createBucket() (ret *s3.CreateBucketOutput) {
     for {
          fmt.Println("Bucket names are unique to their location and must meet the following criteria:")
          fmt.Println("Only lowercase and starts with a letter or number. No spaces.")
          fmt.Println("Bucket name may contain dashes")
          fmt.Println("Must be between 3 and 63 characters long.")
          fmt.Print("Enter your preferred Name for the Bucket: ")
          fmt.Scan(&bucketName)
          if nameCheck(bucketName) {
               break
          } else {
               fmt.Printf("%q does not meet the criteria above. Please try again.", bucketName)
               fmt.Print("\n\n")
               continue
          }
     }
     bucketList := listAllBuckets()
     if len(bucketList.Buckets) != 0 {
          for _, bucket := range bucketList.Buckets {
               if bucketName == *bucket.Name {
                    log.Fatalf("Bucket %q already exists and is owned by you.", bucketName)
               } else {
                    newBucket()
                    break
               }
          }
     } else {
          newBucket()
     }
     return ret
}

                      
                    

createBucket() 該函數檢查您的輸入存儲桶名稱是否已經存在並且歸您所有,然後調用 nameCheck() 功能和 newBucket() 功能。

nameCheck() 該函數檢查用戶輸入的存儲桶名稱是否符合命名存儲桶的條件,並再次詢問是否不符合。 使用 regexp 包檢查輸入是否只包含小寫字母、數字和連字符。 要檢查輸入是否以字母或數字開頭,請使用 strings 包裹 strings.Contains() . 它還檢查輸入長度是否在 3 到 63 個字符之間。

newBucket() 如果輸入的存儲桶名稱不存在,該函數會嘗試創建一個新存儲桶,否則返回錯誤。

函數:raiseObject()

此函數將文件或對像上傳到特定存儲庫。 它需要三個用戶輸入:您要存儲文件的存儲桶的名稱,您要在存儲桶中放置文件的路徑或目錄,最後是您要上傳的文件的路徑。

                      
                        func uploadObject() (ret *s3.PutObjectOutput) {
     fmt.Print("Enter the name of the bucket where you want to upload the File/Object: ")
     fmt.Scan(&bucketName)
     fmt.Print("Enter the Path or Directory where you want to upload the File/Object in the bucket: (e.g., assets/css/): ")
     fmt.Scan(&directory)
     fmt.Print("Enter the Path to the file that you want to upload (e.g., css/styles.css): ")
     fmt.Scan(&filename)

     f, err := os.Open(filename)
     if err != nil {
          panic(err)
     }
     var mtype2 string
     if strings.Contains(filename, ".css") {
          mtype2 = "text/css"
     } else {
          mtype, errmime := mimetype.DetectFile(filename)
          if errmime != nil {
               log.Fatalf("Error getting Content-Type: %v", errmime)
          }
          mtype2 = mtype.String()
     }

     log.Println("Uploading Object:", filename)
     ret, err = s3Vultr.PutObject(&s3.PutObjectInput{
          Body:        f,
          Bucket:      aws.String(bucketName),
          Key:         aws.String(path.Join(directory, strings.Split(filename, "https://www.vultr.com/")[strings.Count(filename, "https://www.vultr.com/")])),
          ACL:         aws.String("public-read"),
          ContentType: aws.String(mtype2),
     })

     if err != nil {
          panic(err)
     } else {
          log.Printf("File %q was Uploaded Successfully.", filename)
     }
     return ret
}

                      
                    

你的文件預設訪問控制列表 (ACL)被設定為私人的默認情況下,這意味著除了您之外沒有人可以訪問它。 要正確提供文件,您必須授予公共讀取權限並正確設置文件的內容類型。 場地 ACL 與價值 public-read 給所有用戶一個訪問並擁有 a全面控制. 當您將文件上傳到存儲桶時,默認的內容類型通常是 application/octet-stream . 為了自動設置文件的內容類型,程序使用啞劇類型包來檢測每個文件MIME 類型或內容類型. 手錶此支持的 mime 類型列表供你參考。 意識到CSS不在支持的 mime 類型列表中,因此使用 strings.Contains() . 如果文件名有 .css 擴展,將內容類型設置為 text/css .

函數:listObjects()

此函數列出存儲桶中的所有文件或對象。 需要用戶輸入:存儲庫名稱以列出其文件。

                      
                        func listObjects() (ret *s3.ListObjectsV2Output) {
     fmt.Print("Enter the name of the bucket to list its file/s: ")
     fmt.Scan(&bucketName)
     ret, err := s3Vultr.ListObjectsV2(&s3.ListObjectsV2Input{
          Bucket: aws.String(bucketName),
     })

     if err != nil {
          panic(err)
     }
     return ret
}

                      
                    

函數:getObject()

此函數將文件或對像從存儲桶下載到其所在目錄的同一目錄 main.go 或二進制可執行文件是。 它需要三個用戶輸入:存儲庫名稱、目錄或文件路徑以及要下載的文件的名稱。

                      
                        func getObject() {
     fmt.Print("Enter the name of the bucket that contains the file that you want to download: ")
     fmt.Scan(&bucketName)
     fmt.Print("Enter the Path or Directory of the file (e.g. assets/css/): ")
     fmt.Scan(&directory)
     fmt.Print("Enter the name of the file that you want to download(e.g., styles.css): ")
     fmt.Scan(&filename)
     log.Println("Downloading: ", filename)

     ret, err := s3Vultr.GetObject(&s3.GetObjectInput{
          Bucket: aws.String(bucketName),
          Key:    aws.String(path.Join(directory, strings.Split(filename, "https://www.vultr.com/")[strings.Count(filename, "https://www.vultr.com/")])),
     })

     if err != nil {
          panic(err)
     }

     body, _ := ioutil.ReadAll(ret.Body)
     err = ioutil.WriteFile(filename, body, 0644)
     if err != nil {
          panic(err)
     }
     log.Println("File Downloaded Successfully.")
}

                      
                    

此函數使用以下方法將文件讀入存儲桶 ioutil.ReadAll() 然後使用寫入返回的數據 ioutil.WriteFile() . 將文件另存為 filename 644 權限,這意味著所有者擁有讀和寫訪問,而組和其他人只有使用權。

函數:removeObject()

此函數從存儲庫中刪除文件或對象。 它需要三個用戶輸入:包含要刪除的文件的存儲庫的名稱、存儲庫中文件的路徑或目錄以及要刪除的文件的名稱。

                      
                        func deleteObject() (ret *s3.DeleteObjectOutput) {
     fmt.Print("Enter the name of the bucket that contains the file that you want to delete: ")
     fmt.Scan(&bucketName)
     fmt.Print("Enter the Path or Directory of the file in the bucket (e.g., assets/css/): ")
     fmt.Scan(&directory)
     fmt.Print("Enter the name of the file that you want to delete (e.g., styles.css): ")
     fmt.Scan(&filename)
     log.Println("Deleting: ", filename)
     ret, err := s3Vultr.DeleteObject(&s3.DeleteObjectInput{
          Bucket: aws.String(bucketName),
          Key:    aws.String(path.Join(directory, strings.Split(filename, "https://www.vultr.com/")[strings.Count(filename, "https://www.vultr.com/")])),
     })

     if err != nil {
          panic(err)
     } else {
          log.Printf("%q deleted Successfully", filename)
     }
     return ret
}

                      
                    

函數:removeAllObjects()

此函數刪除存儲庫中的所有文件或對象。 需要用戶輸入:多維數據集名稱你想清空什麼 當您要刪除存儲桶時,此功能很有用,因為您需要先刪除其所有內容,然後才能將其刪除。

                      
                        func deleteAllObjects() {
     fmt.Scan(&bucketName)
     objectList, errList := s3Vultr.ListObjectsV2(&s3.ListObjectsV2Input{
          Bucket: aws.String(bucketName),
     })
     if errList != nil {
          log.Fatalf("Error Listing objects: %v", errList)
     }
     for _, object := range objectList.Contents {
          log.Printf("Deleting %v", *object.Key)
          _, err := s3Vultr.DeleteObject(&s3.DeleteObjectInput{
               Bucket: aws.String(bucketName),
               Key:    aws.String(*object.Key),
          })
          log.Printf("%v Deleted Successfully", *object.Key)
          if err != nil {
               log.Fatalf("Error Deleteing Objects.")
          }
     }
     log.Println("All Files deleted successfully.")
}

                      
                    

該函數首先列出存儲桶的所有內容,然後獲取扳手將用於刪除每個文件的每個對象。

函數:deleteBucket()

此函數從您的對象存儲中刪除一個存儲桶。 需要用戶輸入:您要刪除的存儲桶的名稱。

                      
                        func deleteBucket() (ret *s3.DeleteBucketOutput) {
     deleteAllObjects()
     ret, err := s3Vultr.DeleteBucket(&s3.DeleteBucketInput{
          Bucket: aws.String(bucketName),
     })
     if err != nil {
          if awsError, ok := err.(awserr.Error); ok {
               switch awsError.Code() {
               case s3.ErrCodeNoSuchBucket:
                    log.Fatalf("No Bucket exists with the name '%s'", bucketName)
                    log.Println()
               default:
                    panic(err)
               }
          }
     }
     log.Printf("Bucket %q deleted Successfully.", bucketName)
     return ret
}

                      
                    

該函數調用 deleteAllObjects() 首先刪除其所有內容,因為您必須先清空存儲桶,然後才能將其刪除。

魔方的主要功能

main() 該函數詢問用戶他們想要執行的存款操作,然後根據用戶輸入調用特定函數。

                      
                        func main() {
     for {
          fmt.Println("Input '1' to List All Buckets in your Object Storage.")
          fmt.Println("Input '2' to Create a new Bucket.")
          fmt.Println("Input '3' to Delete a Bucket.")
          fmt.Println("Input '4' to Upload a File/Object.")
          fmt.Println("Input '5' to List All Files/Objects inside a Bucket.")
          fmt.Println("Input '6' to Download a File/Object from a Bucket.")
          fmt.Println("Input '7' to Delete a File/Object from a Bucket.")
          fmt.Println("Input '8' to Delete All Files/Objects from a Bucket.")
          fmt.Print("Your Input: ")
          fmt.Scan(&input)
          switch input {
          case 1:
               log.Println(listAllBuckets())
          case 2:
               createBucket()
          case 3:
               fmt.Print("Enter the Name of the Bucket that you want to Delete: ")
               deleteBucket()
          case 4:
               uploadObject()
          case 5:
               log.Println(listObjects())
          case 6:
               getObject()
          case 7:
               deleteObject()
          case 8:
               fmt.Print("Enter the Name of the Bucket that you want to Empty: ")
               deleteAllObjects()
          default:
               log.Println("Invalid Input! Please try again.")
               continue
          }

          fmt.Print("Do you want to rerun the program? (y/n): ")
          fmt.Scan(&input2)
          loop = strings.ToLower(input2)
          if loop == "n" {
               fmt.Println("Closing the Program...")
               time.Sleep(2 * time.Second)
               break
          } else if loop == "y" {
               continue
          } else {
               log.Fatalln("Invalid Input! Closing the Program.")
               time.Sleep(2 * time.Second)
          }
     }
}

                      
                    

構建立方體項目

填完後 main.go 包含示例代碼的文件,保存並關閉文件。 然後將代碼編譯成二進制可執行文件。

                      
                        $ go build

                      
                    

運行可執行文件,然後選擇要執行的存儲庫操作。

                      
                        $ ./Bucket

                      
                    

使用 Vultr 對象存儲服務的靜態文件

您必須做兩件重要的事情來使用 Vultr 對象存儲服務靜態文件。 首先你必須授予公共讀取權限對你所有的靜態文件. 其次,你需要為每個文件設置正確的內容類型或者當您訪問靜態文件的 URL 時,您的文件將被下載。

在此示例中,您將創建示例 HTML 和 CSS 靜態文件並使用 Vultr 對象存儲託管它們。

  1. 您將使用相同的項目。 Bucket 和相同的可執行文件 Bucket.exe 創建存儲桶並上傳文件,因為其設置(標準 ACL 和內容類型)設置為授予公共讀取訪問權限並自動設置內容類型。

                              
                                $ cd Bucket
    
                              
                            
  2. 創建一個名為的 HTML 文件 index.html .

                              
                                $ nano index.html
    
                              
                            
  3. 將此示例 HTML 代碼粘貼到您的 index.html 文件,然後保存並退出文件。

                              
                                <!DOCTYPE html>
    <html >
    <head>
        <link rel="stylesheet" href="#">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>This is a Sample Static File Hosted with Vultr Object Storage</title>
    </head>
    <body>
        <h1>This is a Heading 1</h1>
        <h2>This is a Heading 2</h2>
        <h3>This is a Heading 3</h3>
        <h4>This is a Heading 4</h4>
        <h5>This is a Heading 5</h5>
        <h6>This is a Heading 6</h6>
        <p>This is a Sample Static File Hosted with Vultr Object Storage.</p>
    </body>
    </html>
    
                              
                            
  4. 創建一個名為 css .

  5. 創建一個名為的 CSS 文件 style.css css 粘合劑。

                              
                                $ nano css/style.css
    
                              
                            
  6. 將此示例 CSS 代碼粘貼到您的 style.css 文件,然後保存並退出文件。

                              
                                h1 {color: blue;}
    h2 {color: red;}
    h3 {color: green;}
    h4 {background-color: blue;}
    h5 {background-color: red;}
    h6 {background-color: green;}
    
                              
                            
  7. 運行二進制可執行文件 Bucket.exe .

                              
                                $ ./Bucket
    
                              
                            
  8. 創建一個新的多維數據集。 進入 2 創建一個新的存儲桶,然後將存儲桶命名為 my-static-hosting 或您喜歡的任何存儲桶名稱。

    這是示例運行:

                              
                                Input '1' to List All Buckets in your Object Storage.
    Input '2' to Create a new Bucket.
    Input '3' to Delete a Bucket.
    Input '4' to Upload a File/Object.
    Input '5' to List All Files/Objects inside a Bucket.
    Input '6' to Download a File/Object from a Bucket.
    Input '7' to Delete a File/Object from a Bucket.
    Input '8' to Delete All Files/Objects from a Bucket.
    Your Input: 2
    Bucket names are unique to their location and must meet the following criteria:
    Only lowercase and starts with a letter or number. No spaces.
    Bucket name may contain dashes
    Must be between 3 and 63 characters long.
    Enter your preferred name for the Bucket: my-static-hosting
    2022/07/29 17:31:45 Successfully created bucket "my-static-hosting"
    Do you want to rerun the program? (y/n): n
    Closing the Program...
    
                              
                            
  9. 上傳你的 index.html 文件和 style.css 訴訟程序。 跑 Bucket.exe 再次,然後輸入 4 上傳文件。 出現提示時重新運行程序,因為您有兩個文件要加載。

    這是示例程序執行:

                              
                                $ ./Bucket
    
    Input '1' to List All Buckets in your Object Storage.
    Input '2' to Create a new Bucket.
    Input '3' to Delete a Bucket.
    Input '4' to Upload a File/Object.
    Input '5' to List All Files/Objects inside a Bucket.
    Input '6' to Download a File/Object from a Bucket.
    Input '7' to Delete a File/Object from a Bucket.
    Input '8' to Delete All Files/Objects from a Bucket.
    Your Input: 4
    Enter the name of the bucket where you want to upload the File/Object: my-static-hosting
    Enter the Path or Directory where you want to upload the File/Object in the bucket: (e.g., assets/css/): /
    Enter the Path to the file that you want to upload (e.g., css/styles.css): index.html
    2022/07/29 17:36:03 Uploading Object: index.html
    2022/07/29 17:36:04 File "index.html" was Uploaded Successfully.
    Do you want to rerun the program? (y/n): y
    Input '1' to List All Buckets in your Object Storage.
    Input '2' to Create a new Bucket.
    Input '3' to Delete a Bucket.
    Input '4' to Upload a File/Object.
    Input '5' to List All Files/Objects inside a Bucket.
    Input '6' to Download a File/Object from a Bucket.
    Input '7' to Delete a File/Object from a Bucket.
    Input '8' to Delete All Files/Objects from a Bucket.
    Your Input: 4
    Enter the name of the bucket where you want to upload the File/Object: my-static-hosting
    Enter the Path or Directory where you want to upload the File/Object in the bucket: (e.g., assets/css/): css/
    Enter the Path to the file that you want to upload (e.g., css/styles.css): css/style.css
    2022/07/29 17:36:16 Uploading Object: css/style.css
    2022/07/29 17:36:17 File "css/style.css" was Uploaded Successfully.
    Do you want to rerun the program? (y/n): n
    Closing the Program...
    
                              
                            
  10. 在您的網絡瀏覽器中,轉到 https://bucketname.ewr1.vultrobjects.com/filename . 例如, https://my-static-hosting.ewr1.vultrobjects.com/index.html .

  11. 請注意,當您訪問文件的 URL 時,會顯示您的靜態 HTML 文件而不是下載該文件。 鏈接的 CSS 樣式表也被應用。
  12. 您可以上傳其他類型的媒體,例如圖像、視頻等,以進一步測試使用 Vultr 對象存儲的靜態文件服務。

更多信息

有關 Vultr 對象存儲、GoVultr V2、Vultr API v2 和適用於 Go 的 AWS 開發工具包的更多信息,請參閱以下資源:

文章標題 名稱(可選) 電子郵件(可選) 描述

發送建議

相關文章