导入相应的库
import Photosimport 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 = selfpicker.sourceType = UIImagePickerControllerSourceType.photoLibraryself.present(picker, animated: true, completion: {() -> Void in})}else{print("error")}}
拍照图片选取
func camera() {if UIImagePickerController.isSourceTypeAvailable(.camera){let picker = UIImagePickerController()picker.delegate = selfpicker.sourceType = UIImagePickerControllerSourceType.cameraself.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.defaultlet rootPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask, true)[0] as Stringlet 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 = 2conf.timeoutIntervalForRequest = 300conf.timeoutIntervalForResource = TimeInterval(24 * 60 * 60)conf.maxConcurrentRequestCount = 50//实现获取StsToken回调let credential2:OSSCredentialProvider = OSSFederationCredentialProvider.init(federationTokenGetter: { () -> OSSFederationToken? inlet tcs = OSSTaskCompletionSource<AnyObject>.init()Alamofire.request("获取相关配置的接口地址", method: .get, parameters: [: ]).responseJSON { (response) inif 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 = BucketNameossPutObj.objectKey = keyossPutObj.uploadingFileURL = urlossPutObj.uploadProgress = { (bytesSent, totalBytesSent, totalBytesExpectedToSend) -> Void inprint(String(bytesSent) + "/" + String(totalBytesSent) + "/" + String(totalBytesExpectedToSend))}let uploadTask = ossClient?.putObject(ossPutObj)uploadTask?.continue({ (uploadTask) -> Any? inif let _err = uploadTask.error {print(_err)} else {if (uploadTask.result as? OSSPutObjectResult) != nil {//上传成功后预览地址自行拼接}}return uploadTask})}
"https://oss-cn-"
, UINavigationControllerDelegate