Swift – AWS S3从图片库上传图片并下载

我看了很多amazon文档,但没有find足够的信息上传和下载图像到S3使用Swift。
我怎样才能做到这一点?

经过很多研究,我已经有了这个工作,

import AWSS3 import AWSCore 

上传:

我假设你已经实现了UIImagePickerControllerDelegate

步骤1:

  • 创build用于保存url的variables:

     var imageURL = NSURL() 
  • 创build上传完成处理程序obj:

     var uploadCompletionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock? 

第2步:imagePickerController(_:didFinishPickingMediaWithInfo:)获取图像URL:

  • 在这个委托方法中设置imageURL值:

     func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]){ //getting details of image let uploadFileURL = info[UIImagePickerControllerReferenceURL] as! NSURL let imageName = uploadFileURL.lastPathComponent let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! as String // getting local path let localPath = (documentDirectory as NSString).stringByAppendingPathComponent(imageName!) //getting actual image let image = info[UIImagePickerControllerOriginalImage] as! UIImage let data = UIImagePNGRepresentation(image) data!.writeToFile(localPath, atomically: true) let imageData = NSData(contentsOfFile: localPath)! imageURL = NSURL(fileURLWithPath: localPath) picker.dismissViewControllerAnimated(true, completion: nil) } 

第3步:imageURL设置为Upload Image to your bucket之后调用uploadImage方法:

 func uploadImage(){ //defining bucket and upload file name let S3BucketName: String = "bucketName" let S3UploadKeyName: String = "public/testImage.jpg" let expression = AWSS3TransferUtilityUploadExpression() expression.uploadProgress = {(task: AWSS3TransferUtilityTask, bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) in dispatch_async(dispatch_get_main_queue(), { let progress = Float(totalBytesSent) / Float(totalBytesExpectedToSend) print("Progress is: \(progress)") }) } self.uploadCompletionHandler = { (task, error) -> Void in dispatch_async(dispatch_get_main_queue(), { if ((error) != nil){ print("Failed with error") print("Error: \(error!)"); } else{ print("Sucess") } }) } let transferUtility = AWSS3TransferUtility.defaultS3TransferUtility() transferUtility.uploadFile(imageURL, bucket: S3BucketName, key: S3UploadKeyName, contentType: "image/jpeg", expression: expression, completionHander: uploadCompletionHandler).continueWithBlock { (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; } } 

下载:

 func downloadImage(){ var completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock? let S3BucketName: String = "bucketName" let S3DownloadKeyName: String = "public/testImage.jpg" let expression = AWSS3TransferUtilityDownloadExpression() expression.downloadProgress = {(task: AWSS3TransferUtilityTask, bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) in dispatch_async(dispatch_get_main_queue(), { let progress = Float(totalBytesSent) / Float(totalBytesExpectedToSend) print("Progress is: \(progress)") }) } completionHandler = { (task, location, data, error) -> Void in dispatch_async(dispatch_get_main_queue(), { if ((error) != nil){ print("Failed with error") print("Error: \(error!)") } else{ //Set your image var downloadedImage = UIImage(data: data!) } }) } let transferUtility = AWSS3TransferUtility.defaultS3TransferUtility() transferUtility.downloadToURL(nil, bucket: S3BucketName, key: S3DownloadKeyName, expression: expression, completionHander: completionHandler).continueWithBlock { (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("Download Starting!") } return nil; } } 

参考。 上传图片

参考。 为下载图像

非常感谢jzorz

如果你只想下载图像,这是一个更简洁和正确的方法来做到这一点:

 func downloadImage(bucketName: String, fileName: String, completion: (image: UIImage?, error: NSError?) -> Void) { let transferUtility = AWSS3TransferUtility.defaultS3TransferUtility() transferUtility.downloadDataFromBucket(bucketName, key: fileName, expression: nil) { (task, url, data, error) in var resultImage: UIImage? if let data = data { resultImage = UIImage(data: data) } completion(image: resultImage, error: error) } }