Amazon S3 Cognito – 从图像select器上传图像 – Swift 3

我已经成功将静态图像上传到AWS服务器。 当我把它与imagepicker结合,我面临一个奇怪的问题,因为相同的图像正在上传到AWS,即使我select和命名他们不同。 代码如下:

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 } 

我已经看到了很多博客,如这个和这个,但这些是在早期版本的swift,我无法在Swift 3中转换它,并正确地将imagepicker和AWS结合起来。 有人请帮忙。

我find了解决我的问题的方法:

 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总是与我所做的不同。 这是主要的东西,否则即使你从select器中select不同的图像,AWS也会多次保存相同的图像。

希望它可以帮助未来的人!

其实,当你这样做的时候:

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

您正在创buildlocalPath作为URL
所以当你在做:

 let imageURL = NSURL(fileURLWithPath: localPath) 

它给错误,因为localPath是不是String URL 。 在这里你可以直接使用:

 let imageURL = localPath!