swift 拍照(相册选择)并将图片上传至阿里云

先在 info.plist 文件中配置相机,相册权限:

建议直接复制英文部分

Privacy - Camera Usage Description 开启相机权限,以便您拍照上传照片

Privacy - Photo Library Usage Description 开启相册权限,以便您上传照片

image.png

代码部分也可以直接复制粘贴使用;这样就得到了选择的图片文件;

、、、

//底部弹框选择
func showBottomAlert(){
    
    let alertController=UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
    
    let cancel=UIAlertAction(title:"取消", style: .cancel, handler: nil)
    let takingPictures=UIAlertAction(title:"拍照", style: .default)
    {
        action in
        self.goCamera()
        
    }
    let localPhoto=UIAlertAction(title:"相册", style: .default)
    {
        action in
        self.goImage()
        
    }
    alertController.addAction(cancel)
    alertController.addAction(takingPictures)
    alertController.addAction(localPhoto)
    self.present(alertController, animated:true, completion:nil)
}

/// 去拍照
func goCamera(){
    if UIImagePickerController.isSourceTypeAvailable(.camera){
        let  cameraPicker = UIImagePickerController()
        cameraPicker.delegate = self
        cameraPicker.allowsEditing = true
        cameraPicker.sourceType = .camera
        //在需要的地方present出来
        self.present(cameraPicker, animated: true, completion: nil)
    } else {
        print("不支持拍照")
    }
}

/// 去相册
func goImage(){
    let photoPicker =  UIImagePickerController()
    photoPicker.delegate = self
    photoPicker.allowsEditing = true
    photoPicker.sourceType = .photoLibrary
    //在需要的地方present出来
    self.present(photoPicker, animated: true, completion: nil)
}
 //图片代理回调
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    VVLoadView.show()
    print("获得照片============= \(info)")
    let image : UIImage = info[UIImagePickerController.InfoKey.editedImage] as! UIImage
    
    //显示设置的照片
    self.takePhotoBtn.setTitle("", for: .normal)
    self.takePhotoBtn.setBackgroundImage(image, for: .normal)
    
//        let rootPath:NSString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
//        //图片文件路径
//        let filePath = rootPath.strings(byAppendingPaths: ["selectedImage.jpg"]).first
    let pickedImage = image.normalizedImage()
    let originData = pickedImage.jpegData(compressionQuality: 1.0)
    var imageData:Data?
    if ((originData?.count ?? 0) / 1024) > 5000 {
        imageData = pickedImage.jpegData(compressionQuality: 0.1)
    } else {
        imageData = pickedImage.jpegData(compressionQuality: 0.3)
    }
    
  //阿里工具类图片上传
    DSImageUploader.shared.uploadImages(imageData!) {(urlStr, success) in
        DispatchQueue.main.async {
            VVLoadView.shareInstance.dissMissAnim()
        }
        if success {
            self.enterPhoto = urlStr
//这是最终获得的图片url,可以随意使用
            print("上传成功:",urlStr)
        } else {
            VVHub.show(msg: "上传失败")
        }
    }
    
    self.dismiss(animated: true, completion: nil)
}

、、、

接下来就是配置阿里云上传了

  1. pods导入阿里库

pod 'AliyunOSSiOS'

2.封装一个公共上传的工具类

、、、

   import Foundation
    import AliyunOSSiOS

typealias StringBoolCallback = (_ text:String, _ value:Bool) -> Void

class DSImageUploader {

static let shared = DSImageUploader.init()

let config = OSSClientConfiguration()

let credantial = OSSFederationCredentialProvider { () -> OSSFederationToken? in

    lettoken =OSSFederationToken()

    token.tAccessKey=DSPublicKeys.OSS_KEY

    token.tSecretKey = DSPublicKeys.OSS_SECRECT

    returntoken

}

let client: OSSClient

init() {

    OSSLog.enable()

    config.maxRetryCount = 2

    config.timeoutIntervalForRequest = 30

    config.timeoutIntervalForResource = 120

    client=OSSClient(endpoint:DSPublicKeys.OSS_END_POINT, credentialProvider:credantial, clientConfiguration:config)

  }
}

extension DSImageUploader {

  funcuploadImages(_image:Data, completionHandler:@escaping StringBoolCallback) {

    letinterval =Date().timeIntervalSince1970

    let put = OSSPutObjectRequest()

    put.bucketName = "dasyun-public-statics"

    put.objectKey="IOSYunPark\(interval).jpg"

    put.uploadingData= image

    put.uploadProgress= { bytesSent, totalByteSent, totalByteExpectedToSendin

//            print(bytesSent, totalByteSent, totalByteExpectedToSend)

    }

    letputTask =client.putObject(put)

    putTask.continue({ (task:OSSTask) ->Any?in

        iftask.error==nil{

            print("upload object success!")

            letstr =DSPublicKeys.OSS_END_POINT.components(separatedBy:CharacterSet.init(charactersIn:"//")).last

            leturl =String(format:"http://%@.%@/%@", put.bucketName, str!, put.objectKey)

            print("上传图片成功:", url)

            DispatchQueue.main.async{

               completionHandler(url, true)

            }

        }else{

            leterror:NSError= (task.error)!asNSError

            print("图片上传错误:",error.description)

            completionHandler("", false)

        }

        returnnil

        }).waitUntilFinished()

  }

}

、、、

用的时候就调用:

imageData 为拍照或相册选择后的图片转为 Data :

let imageData = image.jpegData(compressionQuality: 1.0)

、、、

DSImageUploader.shared.uploadImages(imageData!) { [weakself] (urlStr, success)in

        guard self != nil else { return }

        ifsuccess {

        //"上传成功"

        }else{

           //"上传失败"

        }

    }

、、、

复制上门代码需要注意的是 bucketName 参数是需要看自己在 阿里上配置的,不是固定死的;objectKey 参数随意命名;

DSPublicKeys.OSS_KEY(图2) 是我自己定义的宏,用自己的阿里 key 和 secrect 字符串替换即可,DSPublicKeys.OSS_END_POINT 同样;这四个参数都是配置完阿里后都会有的;

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