Amplify亚马逊云上传图片

最近公司需要把图片上传从华为云改成亚马逊云,记录一下操作流程,最早亚马逊云是使用AWS的库来进行上传,但是最近亚马逊使用了Amplify方式(Swift语言)上传。特此记录一下基本的操作方式
首先,必须安装 Amplify CLI,先确认本机是否已经安装 nodejs,npm 然后打开终端 输入以下连接完成 Amplify CLI安装,

curl -sL https://aws-amplify.github.io/amplify-cli/install | bash && $SHELL

接下来打开终端,路径设置到工程目录下,运行 Amplify init 命令进行初始化

111.png

222.png

3333.png

创建完成后,会在控制上 IAM-角色-生成两个角色(点击这2个角色分别给他们添加S3Full的权限),还有在S3的桶上自动生成一个桶(如果要用运维给的桶,可以删除自动生成的桶)。
666.png

工程会新增2个json文件
555.png

目前还不能使用,接着要开始引入桶,再次打开终端,输入amplify import storage,选择S3 Bucket
然后 Add auth,添加一个用户池,选择第一个默认 Default configuration.完成用户池的创建
接着会出现bucket,选择运维给你的那个就完成创建
777.png

完成创建后会提示已经创建完成,接着再次打开终端 输入 amplify push 把配置上传到服务器
999.png

上传完成后,在后台点击左上角选择Cognito进入用户池及身份验证,就会看到自己创建的用户池及联合身份
888.png

100.png

然后两个json文件也会出现变化。
接着点击身份池上身份,然后点击右上角编辑身份池,把启用未经验证的身份的访问权限勾上
2323424.png

然后记住自己未经身份验证的角色的名称,接着去控制台的主页选择IAM-角色-点击刚才记住的那个名称,给它添加权限(如果需要用户登录的就给另一个也添加权限)。一般给个S3Full的权限就行
![4444.png](https://upload-images.jianshu.io/upload_images/675253-efbb3850bb721574.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

至此,亚马逊的操作就差不多了。
接下来是工程方面的操作。
如果是纯OC的,可以参考https://github.com/awslabs/aws-sdk-ios-samples
以下是Swift语言的版本,(同时兼容OC环境)
在pod上导入相关的库

  pod 'Amplify'
  pod 'Amplify/Tools'
  pod 'AmplifyPlugins/AWSS3StoragePlugin'
  pod 'AmplifyPlugins/AWSCognitoAuthPlugin'

然后打开工程会看到相应的配置文件

5555.png

接着开始写初始化流程,也可以参照他们官方的文档 https://docs.amplify.aws/lib/q/platform/ios/


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        //初始化流程
        let credentialsProvider = AWSCognitoCredentialsProvider(regionType:.APSoutheast1,
           identityPoolId:"ap-southeast-1:a5f09d6d-e4a5-4997-8f3e-1d388de90abc")
        let configuration = AWSServiceConfiguration(region:.APSoutheast1, credentialsProvider:credentialsProvider)
        try Amplify.add(plugin: AWSCognitoAuthPlugin())
        try Amplify.add(plugin: AWSS3StoragePlugin())
        try Amplify.configure()
        
        return true
    }

然后是注册与登录,如果不需要登录的话,就不需要这2步操作

//注册流程
    func signUp(username: String, password: String, email: String) {
        let userAttributes = [AuthUserAttribute(.email, value: email)]
        let options = AuthSignUpRequest.Options(userAttributes: userAttributes)
        Amplify.Auth.signUp(username: username, password: password, options: options) { result in
            switch result {
            case .success(let signUpResult):
                if case let .confirmUser(deliveryDetails, _) = signUpResult.nextStep {
                    print("Delivery details \(String(describing: deliveryDetails))")
                } else {
                    print("SignUp Complete")
                }
            case .failure(let error):
                
                print("An error occurred while registering a user \(error)")
            }
        }
    }
//登录流程
    func signIn(username: String, password: String, email: String) {
//        Amplify.Auth.signOut()
        Amplify.Auth.signIn(username: username, password: password) { result in
            switch result {
            case .success:
                print("Sign in succeeded")
            case .failure(let error):
                print("Sign in failed \(error)")
            }
        }
    }

然后是上传下载的流程

//下载流程
    func download(name:String){
        let downloadToFileName = FileManager.default.urls(for: .documentDirectory,
                                                          in: .userDomainMask)[0]
            .appendingPathComponent(name)
        
        Amplify.Storage.downloadFile(
            key: name,
            local: downloadToFileName,
            progressListener: { progress in
                print("Progress: \(progress)")
            }, resultListener: { event in
                switch event {
                case .success:
                    print("Completed")
                case .failure(let storageError):
                    print("Failed: \(storageError.errorDescription). \(storageError.recoverySuggestion)")
                }
            })
    }
//上传流程,我这边是改成数组上传
    func uploadData(images:NSArray,index:Int){
       let timeInterval:NSInteger = NSInteger(NSDate.init().timeIntervalSince1970)
       let theFinal = timeInterval
       let stringName = String(format: "path%d.jpg", theFinal)
       let imgGet:UIImage = images.object(at: index) as! UIImage
       let data =  imgGet.jpegData(compressionQuality: 0.5)
//
       let options = StorageUploadDataRequest.Options(accessLevel: .guest)
       Amplify.Storage.uploadData(key: stringName, data: data!, options: options) { progress in
              print("Progress: \(progress)")
          } resultListener: { event in
              switch event {
              case .success(let data):
                if index != images.count-1 {
                    uploadData(images: images, index: index+1)
                }else{
                    print("Completed: \(data)")
                }
              case .failure(let storageError):
                  print("Failed: \(storageError.errorDescription). \(storageError.recoverySuggestion)")
              }
          }
   }

我这里写了一个OC调用Swift的版本,仅供参考,上传的状态可以使用kvo对isUploadImageDone进行监听

import Amplify
import AmplifyPlugins
import AWSCognitoIdentityProvider

//使用单例进行初始化
@objc class UploadImageAmazon: NSObject {
    @objc dynamic var isUploadImageDone:Bool = false
    @objc var aryImages:NSMutableArray = NSMutableArray()
    
    @objc static let staticInstance = UploadImageAmazon()
    @objc static func sharedInstance() -> UploadImageAmazon{
       return staticInstance
   }
   private override init(){
        do {
            let credentialsProvider = AWSCognitoCredentialsProvider(regionType:.APSoutheast1,
               identityPoolId:"ap-southeast-1:84207a2d-de78-45e2-bb6c-fd1c214c6f17")
            let configuration = AWSServiceConfiguration(region:.APSoutheast1, credentialsProvider:credentialsProvider)
            AWSServiceManager.default().defaultServiceConfiguration = configuration
            try Amplify.add(plugin: AWSCognitoAuthPlugin())
            try Amplify.add(plugin: AWSS3StoragePlugin())
            try Amplify.configure()
            print("Amplify configured with storage plugin")
        } catch {
            print("Failed to initialize Amplify with \(error)")
        }
   }
 
    
    func signUp(username: String, password: String, email: String) {
        let userAttributes = [AuthUserAttribute(.email, value: email)]
        let options = AuthSignUpRequest.Options(userAttributes: userAttributes)
        Amplify.Auth.signUp(username: username, password: password, options: options) { result in
            switch result {
            case .success(let signUpResult):
                if case let .confirmUser(deliveryDetails, _) = signUpResult.nextStep {
                    print("Delivery details \(String(describing: deliveryDetails))")
                } else {
                    print("SignUp Complete")
                }
            case .failure(let error):
                
                print("An error occurred while registering a user \(error)")
            }
        }
    }
 
    func signIn(username: String, password: String, email: String) {
//        Amplify.Auth.signOut()
        Amplify.Auth.signIn(username: username, password: password) { result in
            switch result {
            case .success:
                print("Sign in succeeded")
            case .failure(let error):
                print("Sign in failed \(error)")
            }
        }
    }
    
    @objc func uploadData(images:NSArray,index:Int,userid:NSInteger){
        let timeInterval:NSInteger = NSInteger(NSDate.init().timeIntervalSince1970)
        let theFinal = timeInterval + userid
        let stringName = String(format: "feedback/%d.jpg", theFinal)
        let imgGet:UIImage = images.object(at: index) as! UIImage
        let data = imgGet.jpegData(compressionQuality: 0.5)
        Amplify.Storage.uploadData(key:stringName, data: data!,
            progressListener: { progress in
                print("Progress: \(progress)")
            }, resultListener: { (event) in
                switch event {
                case .success(let data):
                    if index != images.count-1 {
                        self.isUploadImageDone = false
                        let next = index + 1
                        self.aryImages.add("public/".appending(stringName))
                        self.uploadData(images: images, index: next,userid: userid)
                    }else{
                        self.aryImages.add("public/".appending(stringName))
                        self.isUploadImageDone = true
                    }
                    print("Completed: \(data)")
                case .failure(let storageError):
                    print("Failed: \(storageError.errorDescription). \(storageError.recoverySuggestion)")
            }
        })
    }
    
    @objc func download(imagePath:String){
        let downloadToFileName = FileManager.default.urls(for: .documentDirectory,
                                                          in: .userDomainMask)[0]
            .appendingPathComponent(imagePath)

        Amplify.Storage.downloadFile(
            key: imagePath,
            local: downloadToFileName,
            progressListener: { progress in
                print("Progress: \(progress)")
            }, resultListener: { event in
                switch event {
                case .success:
                    print("Completed")
                case .failure(let storageError):
                    print("Failed: \(storageError.errorDescription). \(storageError.recoverySuggestion)")
                }
            })
    }
}


以上就是亚马逊云上传图片的基本流程,但是目前有个奇怪的问题,不管是登录还是未登录用户,上传的图片都只能放到public文件夹上,这个问题期待后续能解决,还有如果要删除亚马逊云的配置,不能简单的删除,必须要使用命令,打开终端,输入amplify delete 来进行删除才能删除彻底,不然会在IAM-角色里多了很多没用的角色

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容