2016-12-13 8 views
2

Ich kann ein Bild erfolgreich auf Amazon S3 hochladen, aber ich kann nicht herausfinden, wie der Fortschritt angezeigt werden soll.Upload-Fortschritt für Image Upload auf Amazon S3 mit Swift 3 und Amazon SDK anzeigen

Ich lade gerade so hoch.

import UIKit 
import MapKit 
import CoreData 
import AWSCore 
import AWSCognito 
import AWSS3 
import MobileCoreServices 
import AWSMobileAnalytics 

in meinem Upload-Button habe ich den folgenden Code ...

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) 

Dies ist die upload Funktion ...

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; 
     }) 

    } 

bekam ich den Code für Bild-Upload Fortschritt von Ein anderer Thread, aber die Lösung scheint nicht zu funktionieren oder ich missverstehe sie.

Upload image AWS S3 bucket in swift, und diesen Thread (Swift - AWS S3 Upload Image from Photo Library and download it). Sie haben beide zwei verschiedene Möglichkeiten dies zu tun, der letzte Link, den ich auch nicht zur Arbeit bekommen konnte.

Ich bin mir nicht sicher, was ich falsch mache.

+0

Wo ist das Problem? Sie haben '.uploadProgress' closure, die Ihnen den Fortschritt des Hochladens bietet und Sie sogar in Ihrem Code verwenden. Fügen Sie dort einen Code Update-Fortschritt in UI hinzu und es ist fertig. – user28434

+0

Das Problem war, dass ich zwei verschiedene Methoden zum Hochladen mische und übereinstimmte, also machte ich den Upload-Fortschritt für eine andere Art und Weise, dies zu tun und einen Upload auf eine alternative Weise auszulösen, so dass der Upload-Fortschritt nie funktioniert hat. Ich war verwirrt wegen der vielen Varianten in den Antworten zu diesem Thema. –

Antwort

2

Okay, ich fand die Lösung für mein Problem, anscheinend habe ich einfach nicht genug durchgegangen.

Hier ist meine neue überarbeitete upload Funktion

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 
     }) 

    } 

Dies hat Platz für, wenn Ergebnis erfolgt und während des Upload-Fortschritt und macht viel mehr Sinn.

+0

Können Sie zeigen, wie Sie ein Bild von imagepicker auswählen und eine URL generieren und an AWS senden, wie oben beschrieben. Ich stecke jetzt seit Stunden fest. – Mamta

+0

Sicher, das ist einfach, sobald ich ins Büro komme, können wir hier einen Chat starten –