阿里雲團隊努力不懈,力求將最新的技術內容更快地以您最熟悉的語言呈現。本文由簡體中文內容自動轉碼而成,過程無人工干預。阿里雲不保證此自動轉碼的準確性、完整性及時效性。因轉碼造成的任何內容錯誤及因此可能帶來的損失,阿里雲概不負責,敬請見諒。本文内容請以簡體中文版本為準。
全部產品
Search
文件中心

管理檔案

更新時間: Oct 19, 2018

您可以通過一系列的介面管理儲存空間(Bucket)下的檔案(Object),包括以下操作:

判斷檔案是否存在

以下代碼用於判斷指定的檔案是否存在:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. // 獲取儲存空間。
  15. bucket, err := client.Bucket("<yourBucketName>")
  16. if err != nil {
  17. fmt.Println("Error:", err)
  18. os.Exit(-1)
  19. }
  20. // 判斷檔案是否存在。
  21. isExist, err := bucket.IsObjectExist("<yourObjectName>")
  22. if err != nil {
  23. fmt.Println("Error:", err)
  24. os.Exit(-1)
  25. }
  26. fmt.Println("Exist:", isExist)
  27. }

管理檔案存取權限

檔案的存取權限(ACL)有以下四種:

存取權限 描述 存取權限值
繼承Bucket 檔案遵循儲存空間的存取權限。 oss.ACLDefault
私有 檔案的擁有者和授權使用者有該檔案的讀寫權限,其他使用者沒有許可權操作該檔案。 oss.ACLPrivate
公共讀 檔案的擁有者和授權使用者有該檔案的讀寫權限,其他使用者只有檔案的讀許可權。請謹慎使用該許可權。 oss.ACLPublicRead
公共讀寫 所有使用者都有該檔案的讀寫權限。請謹慎使用該許可權。 oss.PublicReadWrite

檔案的存取權限優先順序高於儲存空間的存取權限。例如儲存空間的存取權限是私有,而檔案的存取權限是公共讀寫,則所有使用者都有該檔案的讀寫權限。如果某個檔案沒有設定過存取權限,則遵循儲存空間的存取權限。

檔案存取權限的完整範例程式碼請參見GitHub

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. // 獲取儲存空間。
  15. bucket, err := client.Bucket("<yourBucketName>")
  16. if err != nil {
  17. fmt.Println("Error:", err)
  18. os.Exit(-1)
  19. }
  20. // 設定檔案的存取權限。
  21. err = bucket.SetObjectACL("<yourObjectName>", oss.ACLPublicReadWrite)
  22. if err != nil {
  23. fmt.Println("Error:", err)
  24. os.Exit(-1)
  25. }
  26. // 獲取檔案的存取權限。
  27. aclRes, err := bucket.GetObjectACL("<yourObjectName>")
  28. if err != nil {
  29. fmt.Println("Error:", err)
  30. os.Exit(-1)
  31. }
  32. fmt.Println("Object ACL:", aclRes.ACL)
  33. }

管理檔案元資訊

檔案元資訊(Object Meta)詳情請參見開發指南中的檔案元資訊。 檔案元資訊的完整代碼請參見GitHub

設定檔案元資訊

您可以在上傳檔案時設定檔案元資訊。可設定的檔案元資訊如下:

參數 說明
CacheControl 指定該檔案被下載時的網頁的緩存行為。
ContentDisposition 指定該檔案被下載時的名稱。
ContentEncoding 指定該檔案被下載時的內容編碼格式。
Expires 設定緩存過期時間,格式是格林威治時間(GMT)。
ServerSideEncryption 指定OSS建立檔案時的伺服器端加密編碼演算法。有效值:AES256。
ObjectACL 指定OSS建立的檔案的存取權限。
Meta 自訂元資訊,以X-Oss-Meta-為首碼的參數。
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "time"
  6. "strings"
  7. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  8. )
  9. func main() {
  10. // 建立OSSClient執行個體。
  11. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  12. if err != nil {
  13. fmt.Println("Error:", err)
  14. os.Exit(-1)
  15. }
  16. // 獲取儲存空間。
  17. bucket, err := client.Bucket("<yourBucketName>")
  18. if err != nil {
  19. fmt.Println("Error:", err)
  20. os.Exit(-1)
  21. }
  22. // 設定檔案元資訊:過期時間為2049年1月10日 23:00:00 GMT,存取權限為公共讀,自訂元資訊為MyProp(取值MyPropVal)
  23. expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
  24. options := []oss.Option{
  25. oss.Expires(expires),
  26. oss.ObjectACL(oss.ACLPublicRead),
  27. oss.Meta("MyProp", "MyPropVal"),
  28. }
  29. // 使用資料流上傳檔案。
  30. err = bucket.PutObject("<yourObjectName>", strings.NewReader("MyObjectValue"), options...)
  31. if err != nil {
  32. fmt.Println("Error:", err)
  33. os.Exit(-1)
  34. }
  35. // 獲取檔案元資訊。
  36. props, err := bucket.GetObjectDetailedMeta("<yourObjectName>")
  37. if err != nil {
  38. fmt.Println("Error:", err)
  39. os.Exit(-1)
  40. }
  41. fmt.Println("Object Meta:", props)
  42. }

修改檔案元資訊

您可以一次修改一條或多條元資訊,代碼如下:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. objectName := "<yourObjectName>"
  16. // 獲取儲存空間。
  17. bucket, err := client.Bucket(bucketName)
  18. if err != nil {
  19. fmt.Println("Error:", err)
  20. os.Exit(-1)
  21. }
  22. // 一次修改一條元資訊。
  23. err = bucket.SetObjectMeta(objectName, oss.Meta("MyMeta", "MyMetaValue1"))
  24. if err != nil {
  25. fmt.Println("Error:", err)
  26. os.Exit(-1)
  27. }
  28. // 一次修改多條元資訊。
  29. options := []oss.Option{
  30. oss.Meta("MyMeta", "MyMetaValue2"),
  31. oss.Meta("MyObjectLocation", "HangZhou"),
  32. }
  33. err = bucket.SetObjectMeta(objectName, options...)
  34. if err != nil {
  35. fmt.Println("Error:", err)
  36. os.Exit(-1)
  37. }
  38. // 獲取檔案元資訊。
  39. props, err := bucket.GetObjectDetailedMeta(objectName)
  40. if err != nil {
  41. fmt.Println("Error:", err)
  42. os.Exit(-1)
  43. }
  44. fmt.Println("Object Meta:", props)
  45. }

獲取檔案元資訊

以下代碼用於獲取檔案元資訊:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. objectName := "<yourObjectName>"
  16. // 獲取儲存空間。
  17. bucket, err := client.Bucket(bucketName)
  18. if err != nil {
  19. fmt.Println("Error:", err)
  20. os.Exit(-1)
  21. }
  22. // 獲取檔案元資訊。
  23. props, err := bucket.GetObjectDetailedMeta(objectName)
  24. if err != nil {
  25. fmt.Println("Error:", err)
  26. os.Exit(-1)
  27. }
  28. fmt.Println("Object Meta:", props)
  29. }

列舉檔案

OSS檔案按照字母順序排列。您可以通過Bucket.ListObjects列出儲存空間下的檔案。主要的參數如下:

參數 說明
delimiter 對檔案名稱進行分組的一個字元。所有名稱包含指定的首碼且第一次出現delimiter字元之間的檔案作為一組元素(commonPrefixes)。
prefix 限定返回的檔案必須以prefix作為首碼。
maxKeys 限定此次列舉檔案的最大個數。預設值為100,最大值為1000。
marker 列舉指定marker之後的檔案。

ListObjects的完整代碼請參見Github。>

簡單列舉檔案

您可以使用預設參數獲取儲存空間的檔案清單,預設返回100條記錄。代碼如下:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. // client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. // 獲取儲存空間。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 簡單列舉檔案。
  22. lsRes, err := bucket.ListObjects()
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. // 列印結果。
  28. fmt.Println("Objects:", lsRes.Objects)
  29. for _, object := range lsRes.Objects {
  30. fmt.Println("Object:", object.Key)
  31. }
  32. }

列舉指定個數的檔案

以下代碼用於列舉指定個數的檔案:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. // client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. // 獲取儲存空間。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 設定列舉檔案的最大個數,並列舉檔案。
  22. lsRes, err := bucket.ListObjects(oss.MaxKeys(200))
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. // 列印結果。
  28. fmt.Println("Objects:", lsRes.Objects)
  29. for _, object := range lsRes.Objects {
  30. fmt.Println("Object:", object.Key)
  31. }
  32. }

列舉指定首碼的檔案

以下代碼用於列舉包含指定首碼(prefix)的檔案:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. // client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. // 獲取儲存空間。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 列舉包含指定首碼的檔案。預設列舉100個檔案。
  22. lsRes, err := bucket.ListObjects(oss.Prefix("my-object-"))
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. // 列印結果。
  28. fmt.Println("Objects:", lsRes.Objects)
  29. for _, object := range lsRes.Objects {
  30. fmt.Println("Object:", object.Key)
  31. }
  32. }

列舉指定marker之後的檔案

參數marker代表檔案名稱。以下代碼用於列舉指定marker之後的檔案:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. // client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. // 獲取儲存空間。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 列舉指定marker之後的檔案。預設列舉100個檔案。
  22. lsRes, err := bucket.ListObjects(oss.Marker("my-object-xx"))
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. // 列印結果。
  28. fmt.Println("Objects:", lsRes.Objects)
  29. for _, object := range lsRes.Objects {
  30. fmt.Println("Object:", object.Key)
  31. }
  32. }

分頁列舉所有檔案

以下代碼用於分頁列舉指定儲存空間下的所有檔案。每頁列舉的檔案個數通過maxKeys指定。

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. // client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. // 獲取儲存空間。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 分頁列舉所有檔案。每頁列舉200個。
  22. marker := oss.Marker("")
  23. for {
  24. lsRes, err := bucket.ListObjects(oss.MaxKeys(200), marker)
  25. if err != nil {
  26. fmt.Println("Error:", err)
  27. os.Exit(-1)
  28. }
  29. marker = oss.Marker(lsRes.NextMarker)
  30. fmt.Println("Objects:", lsRes.Objects)
  31. if !lsRes.IsTruncated {
  32. break
  33. }
  34. }
  35. }

分頁列舉指定marker之後的檔案

以下代碼用於分頁列舉指定maker之後的檔案。每頁列舉的檔案個數通過maxKeys指定。

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. // client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. // 獲取儲存空間。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 分頁列舉指定maker之後的檔案。每頁列舉200個。
  22. marker = oss.Marker("my-object-xx")
  23. for {
  24. lsRes, err := bucket.ListObjects(oss.MaxKeys(50), marker)
  25. if err != nil {
  26. fmt.Println("Error:", err)
  27. os.Exit(-1)
  28. }
  29. marker = oss.Marker(lsRes.NextMarker)
  30. fmt.Println("Objects:", lsRes.Objects)
  31. if !lsRes.IsTruncated {
  32. break
  33. }
  34. }
  35. }

分頁列舉指定首碼的檔案

以下代碼用於分頁列舉包含指定首碼的檔案。每頁列舉的檔案個數通過maxKeys指定。

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. // client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. // 獲取儲存空間。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 分頁列舉包含指定首碼的檔案。每頁列舉80個。
  22. prefix := oss.Prefix("my-object-")
  23. marker := oss.Marker("")
  24. for {
  25. lsRes, err := bucket.ListObjects(oss.MaxKeys(80), marker, prefix)
  26. if err != nil {
  27. fmt.Println("Error:", err)
  28. os.Exit(-1)
  29. }
  30. prefix = oss.Prefix(lsRes.Prefix)
  31. marker = oss.Marker(lsRes.NextMarker)
  32. fmt.Println("Objects:", lsRes.Objects)
  33. if !lsRes.IsTruncated {
  34. break
  35. }
  36. }
  37. }

刪除檔案

請您謹慎使用刪除操作,檔案一旦刪除將無法恢複。

刪除檔案的完整代碼請參見GitHub

刪除單個檔案

以下代碼用於刪除單個檔案:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. objectName := "<yourObjectName>"
  16. // 獲取儲存空間。
  17. bucket, err := client.Bucket(bucketName)
  18. if err != nil {
  19. fmt.Println("Error:", err)
  20. os.Exit(-1)
  21. }
  22. // 刪除單個檔案。
  23. err = bucket.DeleteObject(objectName)
  24. if err != nil {
  25. fmt.Println("Error:", err)
  26. os.Exit(-1)
  27. }
  28. }

刪除多個檔案

您可以通過Bucket.DeleteObjects來刪除多個檔案,並通過DeleteObjectsQuiet參數來指定是否返回刪除的結果。預設返回刪除成功的檔案。

以下代碼用於大量刪除檔案:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. // 獲取儲存空間。
  16. bucket, err := client.Bucket(bucketName)
  17. if err != nil {
  18. fmt.Println("Error:", err)
  19. os.Exit(-1)
  20. }
  21. // 返回刪除成功的檔案。
  22. delRes, err := bucket.DeleteObjects([]string{"my-object-1", "my-object-2"})
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. fmt.Println("Deleted Objects:", delRes.DeletedObjects)
  28. // 不返回刪除的結果。
  29. _, err = bucket.DeleteObjects([]string{"my-object-3", "my-object-4"},
  30. oss.DeleteObjectsQuiet(true))
  31. if err != nil {
  32. fmt.Println("Error:", err)
  33. os.Exit(-1)
  34. }
  35. }

拷貝檔案

拷貝檔案的完整代碼請參見Github

同一儲存空間內拷貝檔案

以下代碼用於在同一個儲存空間內拷貝檔案:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. objectName := "<yourObjectName>"
  16. destObjectName := "<yourDestObjectName>"
  17. // 獲取儲存空間。
  18. bucket, err := client.Bucket(bucketName)
  19. if err != nil {
  20. fmt.Println("Error:", err)
  21. os.Exit(-1)
  22. }
  23. // 拷貝檔案到同一個儲存空間的另一個檔案。
  24. _, err = bucket.CopyObject(objectName, destObjectName)
  25. if err != nil {
  26. fmt.Println("Error:", err)
  27. os.Exit(-1)
  28. }
  29. }

跨儲存空間拷貝檔案

您可以將其它儲存空間的檔案拷貝到當前儲存空間,也可以將當前儲存空間的檔案拷貝到其它儲存空間。代碼如下:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func main() {
  8. // 建立OSSClient執行個體。
  9. // client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  10. if err != nil {
  11. fmt.Println("Error:", err)
  12. os.Exit(-1)
  13. }
  14. bucketName := "<yourBucketName>"
  15. srcBucketName := "<yourSrcBucketName>"
  16. dstBucketName := "<yourDstBucketName>"
  17. srcObjectName := "<yourSrcObjectName>"
  18. dstObjectName := "<yourDstObjectName>"
  19. // 獲取儲存空間。
  20. bucket, err := client.Bucket(bucketName)
  21. if err != nil {
  22. fmt.Println("Error:", err)
  23. os.Exit(-1)
  24. }
  25. // 從其它儲存空間(srcBucketName)拷貝源檔案(srcObjectName)到本儲存空間。
  26. bucket.CopyObjectFrom(srcBucketName, srcObjectName, dstObjectName)
  27. if err != nil {
  28. fmt.Println("CopyObjectFrom Error:", err)
  29. os.Exit(-1)
  30. }
  31. // 從本儲存空間拷貝源檔案(srcObjectName)到其它儲存空間(dstBucketName)。
  32. bucket.CopyObjectTo(dstBucketName, dstObjectName, srcObjectName)
  33. if err != nil {
  34. fmt.Println("CopyObjectTo Error:", err)
  35. os.Exit(-1)
  36. }
  37. }

拷貝時處理檔案元資訊

您可以在拷貝檔案時通過MetadataDirective參數來處理檔案元資訊。MetadataDirective的取值如下:

  • oss.MetaCopy:預設值。目標檔案的元資訊與源檔案的元資訊相同,即拷貝源檔案的元資訊。
  • oss.MetaReplace:使用指定的元資訊覆蓋源檔案的元資訊。

MetadataDirective取值為oss.MetaReplace時,可以指定的元資訊如下:

參數 說明
CacheControl 指定目標檔案被下載時的網頁的緩存行為。
ContentDisposition 指定目標檔案被下載時的名稱。
ContentEncoding 指定目標檔案被下載時的內容編碼格式。
Expires 設定緩存過期時間,格式是格林威治時間(GMT)。
ServerSideEncryption 指定OSS建立目標檔案時的伺服器端加密編碼演算法。有效值:AES256。
ObjectACL 指定OSS建立的目標檔案的存取權限。
Meta 自訂元資訊,以X-Oss-Meta-為首碼的參數。

以下代碼用於在拷貝時處理檔案元資訊:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "time"
  6. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  7. )
  8. func main() {
  9. // 建立OSSClient執行個體。
  10. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  11. if err != nil {
  12. fmt.Println("Error:", err)
  13. os.Exit(-1)
  14. }
  15. bucketName := "<yourBucketName>"
  16. objectName := "<yourObjectName>"
  17. destObjectName := "<yourDestObjectName>"
  18. // 獲取儲存空間。
  19. bucket, err := client.Bucket(bucketName)
  20. if err != nil {
  21. fmt.Println("Error:", err)
  22. os.Exit(-1)
  23. }
  24. // 指定目標檔案的元資訊。
  25. expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
  26. options := []oss.Option{
  27. oss.MetadataDirective(oss.MetaReplace),
  28. oss.Expires(expires),
  29. oss.ObjectACL(oss.ACLPublicRead),
  30. oss.Meta("MyMeta", "MyMetaValue")}
  31. // 使用指定的元資訊覆蓋源檔案的元資訊。
  32. _, err = bucket.CopyObject(objectName, destObjectName, options...)
  33. if err != nil {
  34. fmt.Println("Error:", err)
  35. os.Exit(-1)
  36. }
  37. }

限定條件拷貝

拷貝檔案時,可以指定一個或多個限定條件。滿足限定條件則拷貝,不滿足則返回錯誤,不拷貝。可以使用的限定條件如下:

參數 說明
CopySourceIfMatch 如果源檔案的ETag和指定的ETag匹配,則執行拷貝操作;否則返回錯誤。
CopySourceIfNoneMatch 如果源檔案的ETag和指定的ETag不匹配,則執行拷貝操作;否則返回錯誤。
CopySourceIfModifiedSince 如果指定的時間早於實際修改時間,則執行拷貝操作;否則返回錯誤。
CopySourceIfUnmodifiedSince 如果指定的時間等於或者晚於檔案實際修改時間,則執行拷貝操作;否則返回錯誤。

CopySourceIfMatch和CopySourceIfNoneMatch可以同時存在。CopySourceIfModifiedSince和CopySourceIfUnmodifiedSince可以同時存在。

以下代碼用於限定條件拷貝:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "time"
  6. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  7. )
  8. func main() {
  9. // 建立OSSClient執行個體。
  10. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  11. if err != nil {
  12. fmt.Println("Error:", err)
  13. os.Exit(-1)
  14. }
  15. // bucketName := "<yourBucketName>"
  16. // objectName := "<yourObjectName>"
  17. bucketName := "<yourBucketName>"
  18. objectName := "<yourObjectName>"
  19. destMatchObjectName := "<yourMatchDestObjectName>"
  20. destUnMatchObjectName := "<yourUnmatchDestObjectName>"
  21. // 獲取儲存空間。
  22. bucket, err := client.Bucket(bucketName)
  23. if err != nil {
  24. fmt.Println("Error:", err)
  25. os.Exit(-1)
  26. }
  27. date := time.Date(2011, time.November, 10, 23, 0, 0, 0, time.UTC)
  28. // 滿足限定條件,執行拷貝。
  29. _, err = bucket.CopyObject(objectName, destMatchObjectName, oss.CopySourceIfModifiedSince(date))
  30. if err != nil {
  31. fmt.Println("CopyObject CopySourceIfModifiedSince Error:", err)
  32. }
  33. // 不滿足限定條件,不執行拷貝。
  34. _, err = bucket.CopyObject(objectName, destUnMatchObjectName, oss.CopySourceIfUnmodifiedSince(date))
  35. if err != nil {
  36. fmt.Println("CopyObject CopySourceIfUnmodifiedSince Error:", err)
  37. }
  38. }