get_object.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package sample
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "os"
  8. "strconv"
  9. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  10. )
  11. // GetObjectSample Get Object Sample
  12. func GetObjectSample() {
  13. // 创建Bucket
  14. bucket, err := GetTestBucket(bucketName)
  15. if err != nil {
  16. HandleError(err)
  17. }
  18. // 上传对象
  19. err = bucket.PutObjectFromFile(objectKey, localFile)
  20. if err != nil {
  21. HandleError(err)
  22. }
  23. // 场景1:下载object存储到ReadCloser,注意需要Close
  24. body, err := bucket.GetObject(objectKey)
  25. if err != nil {
  26. HandleError(err)
  27. }
  28. data, err := ioutil.ReadAll(body)
  29. body.Close()
  30. if err != nil {
  31. HandleError(err)
  32. }
  33. data = data // use data
  34. // 场景2:下载object存储到bytes数组,适合小对象
  35. buf := new(bytes.Buffer)
  36. body, err = bucket.GetObject(objectKey)
  37. if err != nil {
  38. HandleError(err)
  39. }
  40. io.Copy(buf, body)
  41. body.Close()
  42. // 场景3:下载object存储到本地文件,用户打开文件
  43. fd, err := os.OpenFile("mynewfile-1.jpg", os.O_WRONLY|os.O_CREATE, 0660)
  44. if err != nil {
  45. HandleError(err)
  46. }
  47. defer fd.Close()
  48. body, err = bucket.GetObject(objectKey)
  49. if err != nil {
  50. HandleError(err)
  51. }
  52. io.Copy(fd, body)
  53. body.Close()
  54. // 场景4:下载object存储到本地文件
  55. err = bucket.GetObjectToFile(objectKey, "mynewfile-2.jpg")
  56. if err != nil {
  57. HandleError(err)
  58. }
  59. // 场景5:满足约束条件下载,否则返回错误。GetObjectToFile具有相同功能。
  60. // 修改时间,约束条件满足,执行下载
  61. body, err = bucket.GetObject(objectKey, oss.IfModifiedSince(pastDate))
  62. if err != nil {
  63. HandleError(err)
  64. }
  65. body.Close()
  66. // 修改时间,约束条件不满足,不执行下载
  67. _, err = bucket.GetObject(objectKey, oss.IfUnmodifiedSince(pastDate))
  68. if err == nil {
  69. HandleError(err)
  70. }
  71. meta, err := bucket.GetObjectDetailedMeta(objectKey)
  72. if err != nil {
  73. HandleError(err)
  74. }
  75. md5 := meta.Get(oss.HTTPHeaderEtag)
  76. // 校验内容,约束条件满足,执行下载
  77. body, err = bucket.GetObject(objectKey, oss.IfMatch(md5))
  78. if err != nil {
  79. HandleError(err)
  80. }
  81. body.Close()
  82. // 校验内容,约束条件不满足,不执行下载
  83. body, err = bucket.GetObject(objectKey, oss.IfNoneMatch(md5))
  84. if err == nil {
  85. HandleError(err)
  86. }
  87. // 场景6:指定value的开始结束位置下载object,可以实现断点下载。GetObjectToFile具有相同功能。
  88. meta, err = bucket.GetObjectDetailedMeta(objectKey)
  89. if err != nil {
  90. HandleError(err)
  91. }
  92. fmt.Println("Object Meta:", meta[oss.HTTPHeaderContentLength])
  93. var partSize int64 = 100 * 1024
  94. objectSize, err := strconv.ParseInt(meta.Get(oss.HTTPHeaderContentLength), 10, 0)
  95. fd, err = os.OpenFile("myfile.jpg", os.O_WRONLY|os.O_CREATE, 0660)
  96. if err != nil {
  97. HandleError(err)
  98. }
  99. defer fd.Close()
  100. for i := int64(0); i < objectSize; i += partSize {
  101. option := oss.Range(i, oss.GetPartEnd(i, objectSize, partSize))
  102. body, err := bucket.GetObject(objectKey, option)
  103. if err != nil {
  104. HandleError(err)
  105. }
  106. io.Copy(fd, body)
  107. body.Close()
  108. }
  109. // 场景7:内容进行 GZIP压缩传输的用户。GetObject/GetObjectToWriter具有相同功能。
  110. err = bucket.PutObjectFromFile(objectKey, htmlLocalFile)
  111. if err != nil {
  112. HandleError(err)
  113. }
  114. err = bucket.GetObjectToFile(objectKey, "myhtml.gzip", oss.AcceptEncoding("gzip"))
  115. if err != nil {
  116. HandleError(err)
  117. }
  118. // 删除object和bucket
  119. err = DeleteTestBucketAndObject(bucketName)
  120. if err != nil {
  121. HandleError(err)
  122. }
  123. fmt.Println("GetObjectSample completed")
  124. }