在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
导入相应的库 import Photos import AliyunOSSiOS 选取照片需要继承 UIImagePickerControllerDelegate,UINavigationControllerDelegate class TestViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{ } 在info.plist中添加相关配置如下 <!-- 相册 --> <key>NSPhotoLibraryUsageDescription</key> <string>App需要您的同意,才能访问相册</string> <!-- 相机 --> <key>NSCameraUsageDescription</key> <string>App需要您的同意,才能访问相机</string> 从相册选择图片 func selectPicture() { if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){ let picker = UIImagePickerController() picker.delegate = self picker.sourceType = UIImagePickerControllerSourceType.photoLibrary self.present(picker, animated: true, completion: { () -> Void in }) }else{ print("error") } } 拍照图片选取 func camera() { if UIImagePickerController.isSourceTypeAvailable(.camera){ let picker = UIImagePickerController() picker.delegate = self picker.sourceType = UIImagePickerControllerSourceType.camera self.present(picker, animated: true, completion: { () -> Void in }) }else{ print("error") } } 拍照与相册选取会进入同一个回调中,如下所示 func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [String :Any]){ let pickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage, type:String = (info[UIImagePickerControllerMediaType]as!String) let fileManager = FileManager.default let rootPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String let date = NSDate(), timeInterval = date.timeIntervalSince1970 * 1000 //将图片保存在本地 let filePath = "\(rootPath)/" + String(timeInterval) + ".png" let imageData = UIImageJPEGRepresentation(pickedImage, 1.0) fileManager.createFile(atPath: filePath, contents: imageData, attributes: nil) //上传 uploadPic(url: URL.init(fileURLWithPath: filePath)) if type == "public.image" { //关闭选择框 picker.dismiss(animated:true, completion:nil) } }
初始化上传配置相关信息(通过StsToken回调管理token信息) 我是通过Alamofire获取数据 //初始化上传设置 func initClient() { //上传配置设置 let conf = OSSClientConfiguration() conf.maxRetryCount = 2 conf.timeoutIntervalForRequest = 300 conf.timeoutIntervalForResource = TimeInterval(24 * 60 * 60) conf.maxConcurrentRequestCount = 50 //实现获取StsToken回调 let credential2:OSSCredentialProvider = OSSFederationCredentialProvider.init(federationTokenGetter: { () -> OSSFederationToken? in let tcs = OSSTaskCompletionSource<AnyObject>.init() Alamofire.request("获取相关配置的接口地址", method: .get, parameters: [: ]) .responseJSON { (response) in if let value = response.result.value { let json = JSON(value) if json["code"] == 1{ tcs.setResult(json as AnyObject?) }else{ tcs.setError("error" as! Error) } } } tcs.task.waitUntilFinished() if tcs.task.error != nil { return nil }else { let jsonData:JSON = JSON(tcs.task.result as AnyObject), tokenInfo:OSSFederationToken = OSSFederationToken() tokenInfo.tAccessKey = "通过返回的jsonData自行赋值" tokenInfo.tSecretKey = "通过返回的jsonData自行赋值" tokenInfo.tToken = "通过返回的jsonData自行赋值" tokenInfo.expirationTimeInGMTFormat = "通过返回的jsonData自行赋值" return tokenInfo } }) //实例化 ossClient = OSSClient(endpoint: EndPoint, credentialProvider: credential2, clientConfiguration: conf) } 上传方法为(在上传之前先调用initClient): //上传图片 func uploadPic(url: URL) { let ossPutObj: OSSPutObjectRequest = OSSPutObjectRequest() //key为上传到阿里云的路径 let key = "image/" + md5String(str: String(describing: url)) + ".jpg" ossPutObj.bucketName = BucketName ossPutObj.objectKey = key ossPutObj.uploadingFileURL = url ossPutObj.uploadProgress = { (bytesSent, totalBytesSent, totalBytesExpectedToSend) -> Void in print(String(bytesSent) + "/" + String(totalBytesSent) + "/" + String(totalBytesExpectedToSend)) } let uploadTask = ossClient?.putObject(ossPutObj) uploadTask?.continue({ (uploadTask) -> Any? in if let _err = uploadTask.error { print(_err) } else { if (uploadTask.result as? OSSPutObjectResult) != nil { //上传成功后预览地址自行拼接 } } return uploadTask }) }
"https://oss-cn-hangzhou.aliyuncs.com"
, UINavigationControllerDelegate |
请发表评论