0

我已經成功將靜態圖像上傳到AWS服務器。當我將它與imagepicker結合使用時,我面臨着一個奇怪的問題,因爲即使我選擇並命名它們,也會將相同的圖像上傳到AWS。代碼如下:Amazon S3 Cognito - 從圖像選擇器上傳圖像 - Swift 3

internal func imagePickerController(_ picker: UIImagePickerController, 
didFinishPickingMediaWithInfo info: [String : Any]) 
{ 
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
    var imageUrl   = info[UIImagePickerControllerReferenceURL] as? NSURL 
    let imageName   = imageUrl?.lastPathComponent 
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! 
    let photoURL   = NSURL(fileURLWithPath: documentDirectory) 
    let localPath   = photoURL.appendingPathComponent(imageName!) 

    print("image name : \(imageName)") 

    if !FileManager.default.fileExists(atPath: localPath!.path) { 
     do { 
      try UIImageJPEGRepresentation(image, 1.0)?.write(to: localPath!) 
      print("file saved") 
      //let imageData = NSData(contentsOf: localPath!) 
      //let finalURL = localPath! 

      //this is in swift 2; above 2 lines are its equivalent in swift3. I think the problem lies here 
      //let imageData = NSData(contentsOfFile: localPath)! 
      //imageURL = NSURL(fileURLWithPath: localPath) 

     }catch { 
      print("error saving file") 
     } 
    } 
    else { 
     print("file already exists") 
    } 

    self.dismiss(animated: true, completion: nil) 

    let credentialProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: "identity pool id") 
    let configuration = AWSServiceConfiguration(region: .APSoutheast1, credentialsProvider: credentialProvider) 
    AWSServiceManager.default().defaultServiceConfiguration = configuration 

    //these are the static values I used that worked perfectly fine with separate images 
    //let localFileName = "Alerts_bg" 
    //let ext = "png" 
    //let remoteName = localFileName + "." + ext 
    //let imageURL = Bundle.main.url(forResource: localFileName, withExtension: ext)! 

    let transferManager = AWSS3TransferManager.default() 

    let uploadRequest = AWSS3TransferManagerUploadRequest()! 
    uploadRequest.bucket = "bucket" 
    let imageAWSName = "ios_" + NSUUID().uuidString + ".jpg" 
    uploadRequest.key = imageAWSName 
    uploadRequest.body = localPath! as URL 
    uploadRequest.contentType = "image/jpg" 

    print("req123 : \(uploadRequest)") 

    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("progress : \(totalBytesSent)/\(totalBytesExpectedToSend)") 
     }) 
    } 

    transferManager.upload(uploadRequest).continueWith(executor: AWSExecutor.mainThread(), block: { (task:AWSTask<AnyObject>) -> Any? in 
     if let error = task.error { 
      print("Upload failed with error: (\(error.localizedDescription))") 
     } 
     if task.result != nil { 

      let s3URL = URL(string: "https://s3-ap-southeast-1.amazonaws.com/bucket/\(imageAWSName)")! 
      print("Uploaded to:\(s3URL)") 
     } 
     return nil 
    }) 

dismiss(animated:true, completion: nil) //5 
} 

我看到很多博客如thisthis,但這些都是在早期版本的迅速和我無法將其轉換斯威夫特3與AWS適當地組合imagepicker。 有人請幫忙。

回答

1

我找到了解決我的問題:

let imageAWSName = "ios_" + NSUUID().uuidString + ".jpg" 

    let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! 
    let photoURL   = NSURL(fileURLWithPath: documentDirectory) 
    let localPath   = photoURL.appendingPathComponent(imageAWSName) 

    if !FileManager.default.fileExists(atPath: localPath!.path) { 
     do { 
      try UIImageJPEGRepresentation(image, 1.0)?.write(to: localPath!) 
      print("file saved") 
     }catch { 
      print("error saving file") 
     } 
    } 
    else { 
     print("file already exists") 
    } 

    let credentialProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: 「your identity pool id」) 
    let configuration = AWSServiceConfiguration(region: .APSoutheast1, credentialsProvider: credentialProvider) 
    AWSServiceManager.default().defaultServiceConfiguration = configuration 

    let transferManager = AWSS3TransferManager.default() 

    let uploadRequest = AWSS3TransferManagerUploadRequest()! 
    let yourBucketName = 「your bucket name」 
    uploadRequest.bucket = yourBucketName 

    uploadRequest.key = imageAWSName 
    uploadRequest.body = localPath! as URL 
    uploadRequest.contentType = "image/jpg" 

    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("progress : \(totalBytesSent)/\(totalBytesExpectedToSend)") 
     }) 
    } 

    transferManager.upload(uploadRequest).continueWith(executor: AWSExecutor.mainThread(), block: { (task:AWSTask<AnyObject>) -> Any? in 
     if let error = task.error { 
      print("Upload failed with error: (\(error.localizedDescription))") 
     } 
     if task.result != nil { 

      let s3URL = URL(string: "https://s3-ap-southeast-1.amazonaws.com/\(yourBucketName)/\(imageAWSName)")! 
      print("Uploaded to:\(s3URL)") 
     } 
     return nil 
    }) 

    self.picker.dismiss(animated: true, completion: nil) 

確保在localPath來使用的imageAWSName始終是不同的,因爲我已經做了。這是主要的東西,否則AWS即使從拾取器中選取不同的圖像,也會多次保存相同的圖像。

希望它有助於未來的人!

0

其實,當你這樣做:

let photoURL   = NSURL(fileURLWithPath: documentDirectory) 
let localPath   = photoURL.appendingPathComponent(imageName!) 

您創建了localPath爲URL
所以,當你正在做的:

let imageURL = NSURL(fileURLWithPath: localPath) 

它給錯誤的,因爲是localPath爲不URLString。 在這裏,你可以直接使用如:

let imageURL = localPath! 
+0

所以你的意思是說我可以直接使用localPath?我不需要再次形成URL? – Mamta

+0

是的,這將解決你的'不能轉換價值...'錯誤 – D4ttatraya

+0

好的。我刪除了這兩行。將靜態AWS代碼與圖像選擇器結合仍然面臨問題。你能幫助我嗎? – Mamta