2016-12-13 28 views
2

Amazon S3に画像を正常にアップロードできましたが、その進捗状況を示す方法がわかりません。アップロードを表示Amazon S3への画像アップロードの進捗状況Swift 3とAmazon SDK

私は現在そのようにアップロードしています。

私は、次のコードを持っている私のアップロードボタンで
import UIKit 
import MapKit 
import CoreData 
import AWSCore 
import AWSCognito 
import AWSS3 
import MobileCoreServices 
import AWSMobileAnalytics 

...

let myIdentityPoolId = "us-west-2:dca2beb4-9a67-etc....etc..." 
       let credentialsProvider:AWSCognitoCredentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.usWest2, identityPoolId: myIdentityPoolId) 
       let configuration = AWSServiceConfiguration(region: AWSRegionType.usWest2, credentialsProvider: credentialsProvider) 
       AWSServiceManager.default().defaultServiceConfiguration = configuration 

self.uploadImage(filename) 

これはuploadImage機能です...

func uploadImage(filename:String){ 
     print("AWS Upload Image Attempt...") 
     //defining bucket and upload file name 
     let S3BucketName: String = "distribution-tech-mobile-live" 
     let filepath = "\(AppDelegate.appDelegate.applicationDocumentsDirectory())/\(filename)" 
     let imageURL = URL(fileURLWithPath: filepath) 
     let S3UploadKeyName = filename //TODO: Change this later 

     let uploadRequest = AWSS3TransferManagerUploadRequest() 
     uploadRequest?.bucket = S3BucketName 
     uploadRequest?.key = filename 
     uploadRequest?.contentType = "image/jpeg" 
     uploadRequest?.body = imageURL 
     uploadRequest?.serverSideEncryption = AWSS3ServerSideEncryption.awsKms 
     uploadRequest?.uploadProgress = { (bytesSent, totalBytesSent, totalBytesExpectedToSend) -> Void in 
      DispatchQueue.main.async(execute: { 
       self.amountUploaded = totalBytesSent // To show the updating data status in label. 
       self.fileSize = totalBytesExpectedToSend 
       print("\(totalBytesSent)/\(totalBytesExpectedToSend)") 
      }) 
     } 

     self.uploadCompletionHandler = { (task, error) -> Void in 
      DispatchQueue.main.async(execute: { 
       if ((error) != nil){ 
        print("Failed with error") 
        print("Error: \(error!)"); 
       } 
       else{ 
        print("Sucess") 
       } 
      }) 
     } 

     let transferUtility = AWSS3TransferUtility.default() 
     let expression = AWSS3TransferUtilityUploadExpression() 

     transferUtility.uploadFile(imageURL, bucket: S3BucketName, key: S3UploadKeyName, contentType: "image/jpeg", expression: expression, completionHander: uploadCompletionHandler).continue({ (task) -> AnyObject! in 
      if let error = task.error { 
       print("Error: \(error.localizedDescription)") 
      } 
      if let exception = task.exception { 
       print("Exception: \(exception.description)") 
      } 
      if let _ = task.result { 
       print("Upload Starting!") 
      } 

      return nil; 
     }) 

    } 

私はからの画像アップロードの進行状況のためのコードを持って別のスレッドしかし、そこに解決策は動作していないか、私はそれを誤解しています。

Upload image AWS S3 bucket in swiftと、このスレッド(Swift - AWS S3 Upload Image from Photo Library and download it)。彼らには2つの異なる方法があります。私はどちらかの方法で作業することができませんでした。

私が間違っていることはわかりません。

+0

問題はどこですか?アップロードの進行状況を示す '.uploadProgress'クロージャがあり、コード内で使用することさえできます。 UIに進捗状況を更新するコードをいくつか追加してください。 – user28434

+0

問題は、私は2つの異なるアップロード方法を混在させてマッチングしていたので、以前は別の方法でアップロードを進めていました。私はこのトピックに関する答えのすべての変形のために混乱しました。 –

答えて

2

私の問題の解決策を見つけました。明らかに私は十分に追いつかなかったようです。

は、ここに私の新しい改訂uploadImage機能

func uploadImage(filename:String){ 
     print("AWS Upload Image Attempt...") 
     //defining bucket and upload file name 
     let S3BucketName: String = "distribution-tech-mobile-live" 
     let filepath = "\(AppDelegate.appDelegate.applicationDocumentsDirectory())/\(filename)" 
     let imageURL = URL(fileURLWithPath: filepath) 
     let S3UploadKeyName = filename //TODO: Change this later 

     let uploadRequest = AWSS3TransferManagerUploadRequest() 
     uploadRequest?.bucket = S3BucketName 
     uploadRequest?.key = S3UploadKeyName 
     uploadRequest?.contentType = "image/jpeg" 
     uploadRequest?.body = imageURL 
     uploadRequest?.serverSideEncryption = AWSS3ServerSideEncryption.awsKms 
     uploadRequest?.uploadProgress = { (bytesSent, totalBytesSent, totalBytesExpectedToSend) -> Void in 
      DispatchQueue.main.async(execute: { 
       self.amountUploaded = totalBytesSent // To show the updating data status in label. 
       self.fileSize = totalBytesExpectedToSend 
       print("\(totalBytesSent)/\(totalBytesExpectedToSend)") 
      }) 
     } 

     let transferManager = AWSS3TransferManager.default() 
     transferManager?.upload(uploadRequest).continue(with: AWSExecutor.mainThread(), withSuccessBlock: { (taskk: AWSTask) -> Any? in 
      if taskk.error != nil { 
       // Error. 
       print("error") 
      } else { 
       // Do something with your result. 
       print("something with result when its done") 
      } 
      return nil 
     }) 

    } 

これは、アップロードの進捗結果が行われたときのためにとの間のスポットを持っているし、多くの意味があります。

+0

imagepickerから画像を選択してURLを生成し、AWSに送信する方法を上記と同じ方法で表示できますか?私は今この時間にこだわっています – Mamta

+0

私がオフィスに入ると、これは簡単ですがここでチャットを始めることができます –

関連する問題