1. 导入相应的库
  1. import Photos
  2. import AliyunOSSiOS

选取照片需要继承 UIImagePickerControllerDelegate,UINavigationControllerDelegate

  1. class TestViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{
  2.  
  3. }

在info.plist中添加相关配置如下

  1. <!-- 相册 -->
  2. <key>NSPhotoLibraryUsageDescription</key>
  3. <string>App需要您的同意,才能访问相册</string>
  4. <!-- 相机 -->
  5. <key>NSCameraUsageDescription</key>
  6. <string>App需要您的同意,才能访问相机</string>

从相册选择图片

  1. func selectPicture() {
  2.  
  3. if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
  4. let picker = UIImagePickerController()
  5. picker.delegate = self
  6. picker.sourceType = UIImagePickerControllerSourceType.photoLibrary
  7. self.present(picker, animated: true, completion: {
  8. () -> Void in
  9. })
  10. }else{
  11. print("error")
  12. }
  13. }

拍照图片选取

  1. func camera() {
  2.  
  3. if UIImagePickerController.isSourceTypeAvailable(.camera){
  4. let picker = UIImagePickerController()
  5. picker.delegate = self
  6. picker.sourceType = UIImagePickerControllerSourceType.camera
  7. self.present(picker, animated: true, completion: { () -> Void in
  8. })
  9. }else{
  10. print("error")
  11. }
  12.  
  13. }

拍照与相册选取会进入同一个回调中,如下所示

  1. func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [String :Any]){
  2.  
  3. let pickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage,
  4. type:String = (info[UIImagePickerControllerMediaType]as!String)
  5.  
  6. let fileManager = FileManager.default
  7. let rootPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,
  8. .userDomainMask, true)[0] as String
  9.  
  10. let date = NSDate(),
  11. timeInterval = date.timeIntervalSince1970 * 1000
  12.  
  13. //将图片保存在本地
  14. let filePath = "\(rootPath)/" + String(timeInterval) + ".png"
  15. let imageData = UIImageJPEGRepresentation(pickedImage, 1.0)
  16. fileManager.createFile(atPath: filePath, contents: imageData, attributes: nil)
  17.  
  18. //上传
  19. uploadPic(url: URL.init(fileURLWithPath: filePath))
  20.  
  21. if type == "public.image" {
  22. //关闭选择框
  23. picker.dismiss(animated:true, completion:nil)
  24. }
  25.  
  26. }

  

初始化上传配置相关信息(通过StsToken回调管理token信息) 我是通过Alamofire获取数据

  1. //初始化上传设置
  2. func initClient() {
  3.  
  4. //上传配置设置
  5. let conf = OSSClientConfiguration()
  6. conf.maxRetryCount = 2
  7. conf.timeoutIntervalForRequest = 300
  8. conf.timeoutIntervalForResource = TimeInterval(24 * 60 * 60)
  9. conf.maxConcurrentRequestCount = 50
  10.  
  11. //实现获取StsToken回调
  12. let credential2:OSSCredentialProvider = OSSFederationCredentialProvider.init(federationTokenGetter: { () -> OSSFederationToken? in
  13.  
  14. let tcs = OSSTaskCompletionSource<AnyObject>.init()
  15.  
  16. Alamofire.request("获取相关配置的接口地址", method: .get, parameters: [: ])
  17. .responseJSON { (response) in
  18.  
  19. if let value = response.result.value {
  20.  
  21. let json = JSON(value)
  22.  
  23. if json["code"] == 1{
  24. tcs.setResult(json as AnyObject?)
  25. }else{
  26. tcs.setError("error" as! Error)
  27. }
  28. }
  29. }
  30.  
  31. tcs.task.waitUntilFinished()
  32.  
  33. if tcs.task.error != nil {
  34. return nil
  35. }else {
  36.  
  37. let jsonData:JSON = JSON(tcs.task.result as AnyObject),
  38. tokenInfo:OSSFederationToken = OSSFederationToken()
  39.  
  40. tokenInfo.tAccessKey = "通过返回的jsonData自行赋值"
  41. tokenInfo.tSecretKey = "通过返回的jsonData自行赋值"
  42. tokenInfo.tToken = "通过返回的jsonData自行赋值"
  43. tokenInfo.expirationTimeInGMTFormat = "通过返回的jsonData自行赋值"
  44.  
  45. return tokenInfo
  46. }
  47.  
  48. })
  49.  
  50. //实例化
  51. ossClient = OSSClient(endpoint: EndPoint, credentialProvider: credential2, clientConfiguration: conf)
  52. }

上传方法为(在上传之前先调用initClient):

  1. //上传图片
  2. func uploadPic(url: URL) {
  3.  
  4. let ossPutObj: OSSPutObjectRequest = OSSPutObjectRequest()
  5. //key为上传到阿里云的路径
  6. let key = "image/" + md5String(str: String(describing: url)) + ".jpg"
  7.  
  8. ossPutObj.bucketName = BucketName
  9. ossPutObj.objectKey = key
  10. ossPutObj.uploadingFileURL = url
  11.  
  12. ossPutObj.uploadProgress = { (bytesSent, totalBytesSent, totalBytesExpectedToSend) -> Void in
  13. print(String(bytesSent) + "/" + String(totalBytesSent) + "/" + String(totalBytesExpectedToSend))
  14. }
  15.  
  16. let uploadTask = ossClient?.putObject(ossPutObj)
  17.  
  18. uploadTask?.continue({ (uploadTask) -> Any? in
  19.  
  20. if let _err = uploadTask.error {
  21. print(_err)
  22. } else {
  23. if (uploadTask.result as? OSSPutObjectResult) != nil {
  24. //上传成功后预览地址自行拼接
  25. }
  26. }
  27. return uploadTask
  28. })
  29.  
  30. }

  

"https://oss-cn-hangzhou.aliyuncs.com"

  

, UINavigationControllerDelegate




swift3.0 从相册选取或者拍照上传图片至阿里云OSS的更多相关文章

  1. 上传图片到阿里云OSS和获取上传图片的外网url的步骤

    啥都不说  直接上代码 1.html: <form action="/bcis/api/headImgUpload.json" method="post" ...

  2. Java中使用RestFul接口上传图片到阿里云OSS服务器

    1.接口方法 import java.io.IOException; import javax.servlet.http.HttpServletRequest; import org.springfr ...

  3. vue中上传图片至阿里云oss

    1.开通阿里云的oss服务这些这里就不多做介绍了 2.登入阿里云的后台管理系统创建一个Bucket 3.在后台管理系统中进入访问控制 4.点击用户管理->新建用户->填写相关信息,就生成了 ...

  4. 上传图片到阿里云oss

    阿里云地址 登录阿里云管理控制台,创建对象存储oss private static final String endpoint = "http://oss-cn-shanghai.aliyu ...

  5. TP框架上传图片至阿里云oss

    首先安装阿里云oss扩展: composer require aliyuncs/oss-sdk-php 如果这个安装不上可以直接下载SDK的包: 链接:https://pan.baidu.com/s/ ...

  6. swoft 上传图片到 阿里云oss aliyun-oss

    1.swoft  获取上传的文件 .官方文档上面没有看到 $files = $request->getUploadedFiles(); $file = $files['file']; 2.在模型 ...

  7. laravel使用阿里云OSS上传图片

    需要自己注册阿里云账号并且开通oss服务,建立Bucket存储空间,此步骤不做演示 一.composer安装:使用composer在项目根目录执行以下命令 composer require johnl ...

  8. swift3.0调用相册

    swift3.0调用相册首先需要注意: 1.swift3.0中调用相机和相册会导致崩溃 1.需要在info.plist文件中加入两个键值对,如下: /// 都是String类型,内容任意的字符串即可 ...

  9. koa2使用阿里云oss的nodejs sdk实现上传图片

    nodejs实现上传图片到阿里云,自然是写成接口形式比较方便,前端监听input file的改变,把file对象传入到formData中传入后端,不能直接传入file对象,后端需要接受formData ...

随机推荐

  1. linux统计cdn日志慢请求

    ./stat_ip.sh live-https.log-0510.gz 1000 #首先用shell脚本可以统计出?日志慢请求查询时间超过?秒对应的ip和对应的调用次数(传两个参数) #!/bin/b ...

  2. eclipse在多modules项目结构下避免模块间依赖引用的场景

    这个在单一classLoader时,不会有问题.如果多classloader下会有问题. 假设工程有两个模块,module2 依赖module1 当我们执行mvc eclipse:eclipse后,然 ...

  3. html网页的兼容性和css优先级

    网页不仅是在一个浏览器上显示的网页,也要多考虑其他浏览器的兼容性,火狐.谷歌.搜狗等浏览器总体来说,网页的变化不大,最主要的是还是IE浏览器. color:red\9; IE6  IE7   IE8  ...

  4. 在MacOS中,Unity使用VSCode开发,4.7版本无法正常使用C#

    我在MacOS中安装了两个版本的Unity,一个是4.7版本,一个是5.6版本,在5.6版本中使用VSCode打开项目时,可以正常代码提示和查看,但是打开4.7版本的项目时,无法正常提示和查看. 经过 ...

  5. 【Python3之多进程】

    一.进程和线程的简单解释 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 用生活举例: (转自阮一峰网络日志) 1.计算机的核心是CPU,它承担了所有 ...

  6. ES6的转换器

    ---恢复内容开始--- ES6代码转为ES5代码的转换器 1.Babel 2.Traceur,Google公司出品 Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有 ...

  7. 缓动动画(json)

    function animate(obj, json){ clearInterval(obj.timer); obj.timer=setInterval(function(){ var flag = ...

  8. 工程经验总结之吹水"管理大境界"

    1.个人认为项目管理最核心的能力是预见风险和快速解决风险的能力. 从实践来看,没有百分百的完美计划,任何计划都有出现偏差的可能,或者说计划总是不会按照最初的设定去完美执行的. 项目经理存在的主要价值就 ...

  9. maven简介及基础使用

    一.Maven简介 Maven可译为"知识的积累"."专家",主要服务于基于Java平台的项目构建.依赖管理和项目信息管理. 1.Maven-项目构建工具    ...

  10. 禅道SQA

    背景 近期以项目质量和测试管理的角色介入了一个大型的项目中间,项目的业务测试方面重点在节点把控和风险跟进. 以往进行测试进度展示是通过bug解决进度及整体走势图来进行体现,这块手工作图太过麻烦,干脆整 ...