swift3.0 从相册选取或者拍照上传图片至阿里云OSS
导入相应的库
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
我想留下来陪你生活,故事不要多,精彩就足够

浙公网安备 33010602011771号