get_object.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package sample
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "os"
  8. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  9. )
  10. // GetObjectSample 展示了流式下载、范围下载、断点续传下载的用法
  11. func GetObjectSample() {
  12. // 创建Bucket
  13. bucket, err := GetTestBucket(bucketName)
  14. if err != nil {
  15. HandleError(err)
  16. }
  17. // 上传对象
  18. err = bucket.PutObjectFromFile(objectKey, localFile)
  19. if err != nil {
  20. HandleError(err)
  21. }
  22. // 场景1:下载object存储到ReadCloser,注意需要Close。
  23. body, err := bucket.GetObject(objectKey)
  24. if err != nil {
  25. HandleError(err)
  26. }
  27. data, err := ioutil.ReadAll(body)
  28. body.Close()
  29. if err != nil {
  30. HandleError(err)
  31. }
  32. data = data // use data
  33. // 场景2:下载object存储到bytes数组,适合小对象。
  34. buf := new(bytes.Buffer)
  35. body, err = bucket.GetObject(objectKey)
  36. if err != nil {
  37. HandleError(err)
  38. }
  39. io.Copy(buf, body)
  40. body.Close()
  41. // 场景3:下载object存储到本地文件,用户打开文件传入句柄。
  42. fd, err := os.OpenFile("mynewfile-1.jpg", os.O_WRONLY|os.O_CREATE, 0660)
  43. if err != nil {
  44. HandleError(err)
  45. }
  46. defer fd.Close()
  47. body, err = bucket.GetObject(objectKey)
  48. if err != nil {
  49. HandleError(err)
  50. }
  51. io.Copy(fd, body)
  52. body.Close()
  53. // 场景4:下载object存储到本地文件。
  54. err = bucket.GetObjectToFile(objectKey, "mynewfile-2.jpg")
  55. if err != nil {
  56. HandleError(err)
  57. }
  58. // 场景5:满足约束条件下载,否则返回错误。GetObject/GetObjectToFile/DownloadFile都支持该功能。
  59. // 修改时间,约束条件满足,执行下载。
  60. body, err = bucket.GetObject(objectKey, oss.IfModifiedSince(pastDate))
  61. if err != nil {
  62. HandleError(err)
  63. }
  64. body.Close()
  65. // 修改时间,约束条件不满足,不执行下载。
  66. _, err = bucket.GetObject(objectKey, oss.IfUnmodifiedSince(pastDate))
  67. if err == nil {
  68. HandleError(err)
  69. }
  70. meta, err := bucket.GetObjectDetailedMeta(objectKey)
  71. if err != nil {
  72. HandleError(err)
  73. }
  74. etag := meta.Get(oss.HTTPHeaderEtag)
  75. // 校验内容,约束条件满足,执行下载。
  76. body, err = bucket.GetObject(objectKey, oss.IfMatch(etag))
  77. if err != nil {
  78. HandleError(err)
  79. }
  80. body.Close()
  81. // 校验内容,约束条件不满足,不执行下载。
  82. body, err = bucket.GetObject(objectKey, oss.IfNoneMatch(etag))
  83. if err == nil {
  84. HandleError(err)
  85. }
  86. // 场景6:大文件分片下载,支持并发下载,断点续传功能。
  87. // 分片下载,分片大小为100K。默认使用不使用并发下载,不使用断点续传。
  88. err = bucket.DownloadFile(objectKey, "mynewfile-3.jpg", 100*1024)
  89. if err != nil {
  90. HandleError(err)
  91. }
  92. // 分片大小为100K,3个协程并发下载。
  93. err = bucket.DownloadFile(objectKey, "mynewfile-3.jpg", 100*1024, oss.Routines(3))
  94. if err != nil {
  95. HandleError(err)
  96. }
  97. // 分片大小为100K,3个协程并发下载,使用断点续传下载文件。
  98. err = bucket.DownloadFile(objectKey, "mynewfile-3.jpg", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
  99. if err != nil {
  100. HandleError(err)
  101. }
  102. // 断点续传功能需要使用本地文件,记录哪些分片已经下载。该文件路径可以Checkpoint的第二个参数指定,如果为空,则为下载文件目录。
  103. err = bucket.DownloadFile(objectKey, "mynewfile-3.jpg", 100*1024, oss.Checkpoint(true, "mynewfile.cp"))
  104. if err != nil {
  105. HandleError(err)
  106. }
  107. // 场景7:内容进行 GZIP压缩传输的用户。GetObject/GetObjectToFile具有相同功能。
  108. err = bucket.PutObjectFromFile(objectKey, htmlLocalFile)
  109. if err != nil {
  110. HandleError(err)
  111. }
  112. err = bucket.GetObjectToFile(objectKey, "myhtml.gzip", oss.AcceptEncoding("gzip"))
  113. if err != nil {
  114. HandleError(err)
  115. }
  116. // 删除object和bucket
  117. err = DeleteTestBucketAndObject(bucketName)
  118. if err != nil {
  119. HandleError(err)
  120. }
  121. fmt.Println("GetObjectSample completed")
  122. }