multipart_upload.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package sample
  2. import (
  3. "fmt"
  4. "os"
  5. "sync"
  6. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  7. )
  8. // MultipartUploadSample Multipart Upload Sample
  9. func MultipartUploadSample() {
  10. // 创建Bucket
  11. bucket, err := GetTestBucket(bucketName)
  12. if err != nil {
  13. HandleError(err)
  14. }
  15. // 场景1:大文件分片上传,按照文件片大小分片
  16. chunks, err := oss.SplitFileByPartNum(localFile, 3)
  17. if err != nil {
  18. HandleError(err)
  19. }
  20. imur, err := bucket.InitiateMultipartUpload(objectKey)
  21. if err != nil {
  22. HandleError(err)
  23. }
  24. parts := []oss.UploadPart{}
  25. for _, chunk := range chunks {
  26. part, err := bucket.UploadPartFromFile(imur, localFile, chunk.Offset,
  27. chunk.Size, chunk.Number)
  28. if err != nil {
  29. HandleError(err)
  30. }
  31. parts = append(parts, part)
  32. }
  33. _, err = bucket.CompleteMultipartUpload(imur, parts)
  34. if err != nil {
  35. HandleError(err)
  36. }
  37. err = bucket.DeleteObject(objectKey)
  38. if err != nil {
  39. HandleError(err)
  40. }
  41. // 场景2:大文件分片上传,按照指定文件片数
  42. chunks, err = oss.SplitFileByPartSize(localFile, 1024*100)
  43. if err != nil {
  44. HandleError(err)
  45. }
  46. imur, err = bucket.InitiateMultipartUpload(objectKey)
  47. if err != nil {
  48. HandleError(err)
  49. }
  50. parts = []oss.UploadPart{}
  51. for _, chunk := range chunks {
  52. part, err := bucket.UploadPartFromFile(imur, localFile, chunk.Offset,
  53. chunk.Size, chunk.Number)
  54. if err != nil {
  55. HandleError(err)
  56. }
  57. parts = append(parts, part)
  58. }
  59. _, err = bucket.CompleteMultipartUpload(imur, parts)
  60. if err != nil {
  61. HandleError(err)
  62. }
  63. err = bucket.DeleteObject(objectKey)
  64. if err != nil {
  65. HandleError(err)
  66. }
  67. chunks = []oss.FileChunk{
  68. {Number: 1, Offset: 0 * 1024 * 1024, Size: 1024 * 1024},
  69. {Number: 2, Offset: 1 * 1024 * 1024, Size: 1024 * 1024},
  70. {Number: 3, Offset: 2 * 1024 * 1024, Size: 1024 * 1024},
  71. }
  72. // 创建3:大文件上传,您自己打开文件,传入句柄
  73. chunks, err = oss.SplitFileByPartNum(localFile, 3)
  74. if err != nil {
  75. HandleError(err)
  76. }
  77. fd, err := os.Open(localFile)
  78. if err != nil {
  79. HandleError(err)
  80. }
  81. defer fd.Close()
  82. imur, err = bucket.InitiateMultipartUpload(objectKey)
  83. if err != nil {
  84. HandleError(err)
  85. }
  86. parts = []oss.UploadPart{}
  87. for _, chunk := range chunks {
  88. fd.Seek(chunk.Offset, os.SEEK_SET)
  89. part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number)
  90. if err != nil {
  91. HandleError(err)
  92. }
  93. parts = append(parts, part)
  94. }
  95. _, err = bucket.CompleteMultipartUpload(imur, parts)
  96. if err != nil {
  97. HandleError(err)
  98. }
  99. err = bucket.DeleteObject(objectKey)
  100. if err != nil {
  101. HandleError(err)
  102. }
  103. // 场景4:大文件分片上传,初始化时指定对象属性
  104. chunks, err = oss.SplitFileByPartNum(localFile, 3)
  105. if err != nil {
  106. HandleError(err)
  107. }
  108. imur, err = bucket.InitiateMultipartUpload(objectKey, oss.Meta("myprop", "mypropval"))
  109. if err != nil {
  110. HandleError(err)
  111. }
  112. parts = []oss.UploadPart{}
  113. for _, chunk := range chunks {
  114. part, err := bucket.UploadPartFromFile(imur, localFile, chunk.Offset,
  115. chunk.Size, chunk.Number)
  116. if err != nil {
  117. HandleError(err)
  118. }
  119. parts = append(parts, part)
  120. }
  121. _, err = bucket.CompleteMultipartUpload(imur, parts)
  122. if err != nil {
  123. HandleError(err)
  124. }
  125. err = bucket.DeleteObject(objectKey)
  126. if err != nil {
  127. HandleError(err)
  128. }
  129. // 场景5:大文件分片上传,每个分片可以有线程/进程/机器独立完成,下面示例是每个线程上传一个分片
  130. partNum := 4
  131. chunks, err = oss.SplitFileByPartNum(localFile, partNum)
  132. if err != nil {
  133. HandleError(err)
  134. }
  135. imur, err = bucket.InitiateMultipartUpload(objectKey)
  136. if err != nil {
  137. HandleError(err)
  138. }
  139. // 并发上传分片
  140. var waitgroup sync.WaitGroup
  141. var ps = make([]oss.UploadPart, partNum)
  142. for _, chunk := range chunks {
  143. waitgroup.Add(1)
  144. go func(chunk oss.FileChunk) {
  145. part, err := bucket.UploadPartFromFile(imur, localFile, chunk.Offset,
  146. chunk.Size, chunk.Number)
  147. if err != nil {
  148. HandleError(err)
  149. }
  150. ps[chunk.Number-1] = part
  151. waitgroup.Done()
  152. }(chunk)
  153. }
  154. // 等待上传完成
  155. waitgroup.Wait()
  156. // 通知完成
  157. _, err = bucket.CompleteMultipartUpload(imur, ps)
  158. if err != nil {
  159. HandleError(err)
  160. }
  161. err = bucket.DeleteObject(objectKey)
  162. if err != nil {
  163. HandleError(err)
  164. }
  165. // 场景6:大文件分片上传一部分后,中止上传,上传的数据将丢弃,UploadId也将无效
  166. chunks, err = oss.SplitFileByPartNum(localFile, 3)
  167. if err != nil {
  168. HandleError(err)
  169. }
  170. imur, err = bucket.InitiateMultipartUpload(objectKey)
  171. if err != nil {
  172. HandleError(err)
  173. }
  174. parts = []oss.UploadPart{}
  175. for _, chunk := range chunks {
  176. part, err := bucket.UploadPartFromFile(imur, localFile, chunk.Offset,
  177. chunk.Size, chunk.Number)
  178. if err != nil {
  179. HandleError(err)
  180. }
  181. parts = append(parts, part)
  182. }
  183. err = bucket.AbortMultipartUpload(imur)
  184. if err != nil {
  185. HandleError(err)
  186. }
  187. // 删除object和bucket
  188. err = DeleteTestBucketAndObject(bucketName)
  189. if err != nil {
  190. HandleError(err)
  191. }
  192. fmt.Println("MultipartUploadSample completed")
  193. }