如何使用Swift在本地保存Amazon S3文件?

时间:2016-03-16 08:48:51

标签: ios swift amazon-web-services amazon-s3 amazon-cognito

我最近一直致力于通过Amazon S3服务上传和下载文件的项目,特别是用户上传的个人资料图片。我也在使用Amazon Cognito(用户名,全名等),我喜欢Cognito的一个原因是它将下载的数据保存在手机本地,即使应用程序处于脱机状态也会显示。然后,当应用程序上线时,它会更新任何数据更改。不幸的是,S3不会发生同样的情况。每次应用程序启动时,都必须先从我的S3存储桶下载配置文件图片,然后再显示它们。我想要做的是让应用程序从iOS设备上的S3存储桶中保存用户的个人资料图片,这样即使应用程序离线,用户也可以看到他们的照片。这是我现在拥有的:

func downloadImage(){

    var completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock?

    //downloading image
    let S3BucketName: String = "*******"
    let S3DownloadKeyName: String = self.credentialsProvider.identityId + "/profileImage.png"

    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)
            //   self.statusLabel.text = "Downloading..."
            NSLog("Progress is: %f",progress)
        })
    }

    completionHandler = { (task, location, data, error) -> Void in
        dispatch_async(dispatch_get_main_queue(), {
            if ((error) != nil){
                NSLog("Failed with error")
                NSLog("Error: %@",error!);
                //self.statusLabel.text = "Failed"
            } else {
                //self.statusLabel.text = "Success"
                self.userProfile.image = UIImage(data: data!)
                self.profileBackground.image = 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 {
            NSLog("Error: %@",error.localizedDescription);
            //  self.statusLabel.text = "Failed"
        }
        if let exception = task.exception {
            NSLog("Exception: %@",exception.description);
            //  self.statusLabel.text = "Failed"
        }
        if let _ = task.result {
            //    self.statusLabel.text = "Starting Download"
            NSLog("Download Starting!")
            // Do something with uploadTask.
        }
        return nil;
    }

} 

提前致谢!

1 个答案:

答案 0 :(得分:0)

这是从S3 Bucket下载图像并将其保存到本地电话的助手 下一次,如果您要查找此图像。帮助程序将检查本地副本是否存在,如果不存在,它将从S3下载

import UIKit
import AWSCore
import AWSS3

class S3Helper: NSObject {

@objc var completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock?

@objc lazy var transferUtility = {
    AWSS3TransferUtility.default()
}()

let DocDirPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

func downloadImage(imageView: UIImageView!, S3Folder: String, S3FileName: String) {
    let S3DownloadKeyName: String = S3Folder + "/" + S3FileName
    imageView.image = UIImage(named: "ic_place_holder.pdf")

    let filePath = DocDirPath.appendingPathComponent(S3FileName).path
    let fileManager = FileManager.default
    if fileManager.fileExists(atPath: filePath) {
        let imageURL = self.DocDirPath.appendingPathComponent(S3FileName)
        imageView.image = UIImage(contentsOfFile: imageURL.path)!
    } else {

        let expression = AWSS3TransferUtilityDownloadExpression()
        expression.progressBlock = {(task, progress) in
            DispatchQueue.main.async(execute: {

            })
        }

        self.completionHandler = { (task, location, data, error) -> Void in
            DispatchQueue.main.async(execute: {
                if let error = error {
                    NSLog("Failed with error: \(error)")
                    //self.statusLabel.text = "Failed"
                }
                else{
                    //self.statusLabel.text = "Success"
                    imageView.image = UIImage(data: data!)

                    do{
                        let imgPath = URL(fileURLWithPath: self.DocDirPath.appendingPathComponent(S3FileName).path)
                        try (imageView.image ?? UIImage(named: "ic_place_holder.pdf")!).jpegData(compressionQuality: 1.0)?.write(to: imgPath, options: .atomic)
                    } catch let error1{
                        print(error1.localizedDescription)
                    }
                }
            })
        }

        transferUtility.downloadData(
            forKey: S3DownloadKeyName,
            expression: expression,
            completionHandler: completionHandler).continueWith { (task) -> AnyObject? in
                if let error = task.error {
                    NSLog("Error: %@",error.localizedDescription);
                    DispatchQueue.main.async(execute: {
                        //self.statusLabel.text = "Failed"
                    })
                }

                if let _ = task.result {
                    DispatchQueue.main.async(execute: {
                        //self.statusLabel.text = "Downloading..."
                    })
                    NSLog("Download Starting!")
                    // Do something with uploadTask.
                }
                return nil;
            }
    }
}

}