//
|
// OBSUploader.swift
|
// QuanKeTong
|
//
|
// Created by alvin_y on 2019/7/31.
|
// Copyright © 2019 yang-wang. All rights reserved.
|
//
|
|
import UIKit
|
import RxSwift
|
import RxCocoa
|
import AliyunOSSiOS
|
import JQTools
|
import SwifterSwift
|
|
public extension UIImage{
|
func uploadImgToService(name:String = String.jq_randomStr(len:10),scaleSize:CGSize? = nil)->Observable<String>{
|
return OBSUploader.shared.uploadImage(key: name, image: self, scaleSize: scaleSize)
|
}
|
}
|
|
public extension URL{
|
func uploadVideoURLToService(name:String = String.jq_randomStr(len: 10))->Observable<String>{
|
return OBSUploader.shared.uploadVideo(key: name, data: self)
|
}
|
}
|
|
public extension Sequence where Iterator.Element == UIImage{
|
func uploadImgToService(scaleSize:CGSize? = nil,needCompress:Bool? = nil)->Observable<[String]>{
|
var keys = [String]()
|
var imgs = [UIImage]()
|
for (_,item) in enumerated() {
|
keys.append(String.jq_randomStr(len: 10))
|
imgs.append(item)
|
}
|
return OBSUploader.shared.uploadImage(keys: keys, image: imgs,scaleSize: scaleSize,needCompress:needCompress)
|
}
|
}
|
|
public extension Sequence where Iterator.Element == URL{
|
func uploadVideoToService(progress:OSSNetworkingUploadProgressBlock? = nil)->Observable<[String]>{
|
var keys = [String]()
|
var datas = [URL]()
|
for (_,item) in enumerated() {
|
keys.append(String.jq_randomStr(len: 10))
|
datas.append(item)
|
}
|
return OBSUploader.shared.uploadVideo(keys: keys, video: datas,progress: progress)
|
}
|
}
|
|
/// OBS上传文件
|
class OBSUploader: NSObject {
|
|
struct Config {
|
static var oss_domain = "https://we-park-life.oss-cn-beijing.aliyuncs.com"
|
static var accessKeyId = "LTAI47eyqWWhBPXM"
|
static var accessKeySecret = "orsYX78NvgXS9KbN7wCwRja1wkUwPc"
|
static var bucketName = "we-park-life"
|
static var endpoint = "oss-cn-beijing.aliyuncs.com"
|
}
|
|
static let shared = OBSUploader()
|
|
lazy var credential: OSSCustomSignerCredentialProvider = OSSCustomSignerCredentialProvider(implementedSigner: { sign, error in
|
var sign = OSSUtil.calBase64Sha1(withData: sign, withSecret: Config.accessKeySecret)
|
|
if sign == nil {
|
fatalError()
|
}
|
|
return "OSS \(Config.accessKeyId):\(sign!)"
|
})!
|
|
lazy var ossClient: OSSClient = OSSClient(endpoint: Config.endpoint, credentialProvider: credential)
|
|
func uploadImage(keys: [String], image: [UIImage],scaleSize:CGSize? = nil,needCompress:Bool? = nil) -> Observable<[String]> {
|
if keys.count == 0 {
|
return Observable.just([])
|
}
|
var ob: [Observable<String>] = []
|
let count = keys.count
|
for i in 0..<count {
|
ob.append(createTask(key: keys[i], image: image[i],scaleSize: scaleSize,needCompress:needCompress))
|
}
|
return Observable.zip(ob)
|
}
|
|
func uploadVideo(keys: [String], video: [URL],progress:OSSNetworkingUploadProgressBlock? = nil) -> Observable<[String]> {
|
if keys.count == 0 {
|
return Observable.just([])
|
}
|
var ob: [Observable<String>] = []
|
let count = keys.count
|
for i in 0..<count {
|
ob.append(createTask(key: keys[i], url: video[i],progress: progress))
|
}
|
return Observable.zip(ob)
|
}
|
|
func uploadVideo(key:String,data:URL,progress:OSSNetworkingUploadProgressBlock? = nil) -> Observable<String>{
|
if key.isEmpty {return Observable.just("")}
|
|
var videoData:Data?
|
do {
|
videoData = try Data(contentsOf: data)
|
} catch {
|
return Observable.just("")
|
}
|
|
let client = ossClient
|
return Observable<String>.create { ob in
|
let put = OSSPutObjectRequest()
|
put.bucketName = Config.bucketName
|
put.objectKey = "\(key).mov"
|
put.uploadingData = videoData!
|
put.uploadProgress = { a,b,c in
|
progress?(a,b,c)
|
}
|
let task = client.putObject(put)
|
task.continue({ r in
|
if r.error == nil {
|
ob.onNext("\(Config.oss_domain)/\(key).mov")
|
} else {
|
ob.onError(VideoUploadError.Failed)
|
}
|
return nil
|
})
|
return Disposables.create{}
|
}.observe(on: MainScheduler.instance)
|
|
}
|
|
func uploadImage(key: String, image: UIImage,scaleSize:CGSize?) -> Observable<String> {
|
if key.isEmpty {
|
return Observable.just("")
|
} else {
|
let client = ossClient
|
return Observable<String>.create{ ob in
|
let put = OSSPutObjectRequest()
|
put.bucketName = Config.bucketName
|
put.objectKey = "img/\(key).png"
|
|
if scaleSize != nil{
|
put.uploadingData = image.jq_scaled(to: scaleSize!).pngData()!
|
}else{
|
put.uploadingData = image.pngData()!
|
}
|
let task = client.putObject(put)
|
task.continue({ r in
|
if r.error == nil {
|
ob.onNext("\(Config.oss_domain)/img/\(key).png")
|
} else {
|
ob.onError(ImageUploadError.Failed)
|
}
|
return nil
|
})
|
|
return Disposables.create{
|
|
}
|
}.observe(on: MainScheduler.instance)
|
}
|
}
|
|
/// 上传Data数据
|
/// - Parameters:
|
/// - key: XXXX.png/Gif等
|
/// - data: 数据
|
func uploadData(key:String,data:Data)->Observable<String>{
|
if key.isEmpty{
|
return Observable.just("")
|
}else{
|
let client = ossClient
|
return Observable<String>.create{ ob in
|
let put = OSSPutObjectRequest()
|
put.bucketName = Config.bucketName
|
put.objectKey = key
|
put.uploadingData = data
|
let task = client.putObject(put)
|
task.continue({ r in
|
if r.error == nil {
|
ob.onNext("\(Config.oss_domain)/\(key)")
|
} else {
|
ob.onError(ImageUploadError.Failed)
|
}
|
return nil
|
})
|
return Disposables.create{
|
|
}
|
}.observe(on: MainScheduler.instance)
|
}
|
}
|
|
func createTask(key: String, image: UIImage,scaleSize:CGSize? = nil,needCompress:Bool? = nil) -> Observable<String> {
|
let client = ossClient
|
return Observable<String>.create{ ob in
|
let put = OSSPutObjectRequest()
|
put.bucketName = Config.bucketName
|
put.objectKey = "img/\(key).png"
|
|
|
|
var img:UIImage?
|
if scaleSize != nil{
|
img = image.jq_scaled(to: scaleSize!)
|
}else if needCompress != nil && needCompress!{
|
img = image.jq_resizeImage()
|
}else{
|
img = image
|
}
|
|
put.uploadingData = img!.pngData()!
|
|
let task = client.putObject(put)
|
task.continue({ r in
|
if r.error == nil {
|
ob.onNext("\(Config.oss_domain)/img/\(key).png")
|
} else {
|
ob.onError(ImageUploadError.Failed)
|
}
|
return nil
|
})
|
|
return Disposables.create{
|
|
}
|
}.observe(on: MainScheduler.instance)
|
}
|
|
func createTask(key: String, url: URL,progress:OSSNetworkingUploadProgressBlock? = nil) -> Observable<String> {
|
|
if key.isEmpty{return Observable.just("")}
|
var videoData:Data?
|
do {
|
videoData = try Data(contentsOf: url)
|
} catch {
|
return Observable.just("")
|
}
|
|
let client = ossClient
|
return Observable<String>.create{ ob in
|
let put = OSSPutObjectRequest()
|
put.bucketName = Config.bucketName
|
put.objectKey = "\(key).mov"
|
put.uploadingData = videoData!
|
|
put.uploadProgress = { a,b,c in
|
progress?(a,b,c)
|
}
|
|
let task = client.putObject(put)
|
task.continue({ r in
|
if r.error == nil {
|
ob.onNext("\(Config.oss_domain)/\(key).mov")
|
} else {
|
ob.onError(ImageUploadError.Failed)
|
}
|
return nil
|
})
|
|
return Disposables.create{
|
|
}
|
}.observe(on: MainScheduler.instance)
|
}
|
|
}
|
|
enum ImageUploadError: Error {
|
case Failed
|
}
|
enum VideoUploadError:Error{
|
case Failed
|
}
|