本文介绍如何使用分片上传。
上传文件
分片上传(Multipart Upload)分为以下三个步骤:
- 初始化一个分片上传事件。 - 调用initiateMultipartUpload方法返回OSS创建的全局唯一的uploadId。 
- 上传分片。 - 调用uploadPart方法上传分片数据。 
- 完成分片上传。 - 所有分片上传完成后,调用completeMultipartUpload方法将所有分片合并成完整的文件。 
以下通过一个完整的示例对分片上传的流程进行逐步解析:
| let key = "multipart-test"var uploadId : String?
 var parts : Array<AWSS3CompletedPart>?
 
 // 初始化分片上传
 let createMultipartReq = AWSS3CreateMultipartUploadRequest.init()
 createMultipartReq?.bucket = S3BucketName
 createMultipartReq?.key = key
 s3.createMultipartUpload(createMultipartReq!).continueWith(block: { (task:AWSTask<AWSS3CreateMultipartUploadOutput>) -> Any? in
 if let error = task.error {
 print("create multipart request failed with error: (\(error))")
 } else {
 uploadId = task.result?.uploadId
 print("create muiltipart completed!" + uploadId!)
 }
 return nil
 })
 
 // 上传一个分片
 let uploadPartReq = AWSS3UploadPartRequest.init()
 let databody:NSData? = "MY TEST MULTIPART UPLOAD!".data(using: .utf8) as NSData?
 uploadPartReq?.bucket = S3BucketName
 uploadPartReq?.key = key
 uploadPartReq?.partNumber = 1
 uploadPartReq?.body = databody
 s3.uploadPart(uploadPartReq!).continueWith(block: { (task:AWSTask<AWSS3UploadPartOutput>) -> Any? in
 if let error = task.error {
 print("upload part failed with error: (\(error))")
 } else {
 let info = AWSS3CompletedPart.init()
 info?.eTag = task.result?.eTag
 info?.partNumber = 1
 parts = [info!]
 print("upload completed.")
 }
 return nil
 })
 
 // 完成分片上传
 let completinfo = AWSS3CompletedMultipartUpload.init()
 if parts == nil {
 print("no part")
 return
 }
 completinfo?.parts = parts ?? []
 let complete = AWSS3CompleteMultipartUploadRequest.init()
 complete?.bucket = S3BucketName
 complete?.key = key
 complete?.uploadId = uploadId
 complete?.multipartUpload = completinfo
 s3.completeMultipartUpload(complete!).continueWith(block: { (task) -> Any? in
 if let error = task.error {
 print("multipart upload failed with error: (\(error))")
 } else {
 print("multipart upload completed!")
 }
 return nil
 })
 | 
取消分片上传事件
您可以调用abortMultipartUpload方法来取消分片上传事件。当一个分片上传事件被取消后,无法再使用这个uploadId做任何操作,已经上传的分片数据会被删除。
以下代码用于取消分片上传事件:
| var uploads : Array<AWSS3MultipartUpload>?let listpartreq = AWSS3ListMultipartUploadsRequest.init()
 listpartreq?.bucket = S3BucketName
 s3.listMultipartUploads(listpartreq!).continueWith(block: { (task:AWSTask<AWSS3ListMultipartUploadsOutput>) -> Any? in
 if let error = task.error {
 print("list parts failed with error: (\(error))")
 } else {
 let count = task.result?.uploads?.count
 if count == nil {
 print("there not have multipart upload(s) in progress.")
 uploads = Array.init()
 return nil
 }s
 // 取消分片
 uploads = task.result?.uploads
 for upload in uploads! {
 let abortreq = AWSS3AbortMultipartUploadRequest.init()
 abortreq?.bucket = self.S3BucketName
 abortreq?.key = upload.key
 abortreq?.uploadId = upload.uploadId
 s3.abortMultipartUpload(abortreq!).continueWith(block: { (task) -> Any? in
 if let error = task.error {
 print("abort parts failed with error: (\(error))")
 } else {
 print("abort parts completed!")
 }
 return nil
 })
 }
 }
 return nil
 })
 | 
列举正在上传的分片
以下代码用于简单列举正在上传的分片:
| let listpartreq = AWSS3ListMultipartUploadsRequest.init()listpartreq?.bucket = S3BucketName
 s3.listMultipartUploads(listpartreq!).continueWith(block: { (task:AWSTask<AWSS3ListMultipartUploadsOutput>) -> Any? in
 if let error = task.error {
 print("list parts failed with error: (\(error))")
 } else {
 let count = task.result?.uploads?.count
 if count == nil {
 print(" there not have multipart upload(s) in progress.")
 return nil
 }
 print(" \(count!) multipart upload(s) in progress.")
 print("list parts completed!")
 }
 return nil
 })
 |