import UIKit
|
import RxSwift
|
import RxCocoa
|
import SVProgressHUD
|
import OBS
|
import JQTools
|
import RxRelay
|
|
let endPoint = "obs.cn-south-1.myhuaweicloud.com";
|
let accessKeyId = "HNZKSJL5LKM2NZVJPE8O";
|
let accessKeySecret = "VjKImAoCB8Q2lEcwGO9xIemirpOVZuij9DVRSXcr";
|
let bucketName = "xqgwzh";
|
let oss_domain = "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com";
|
let OBS_URL = "https://\(endPoint)"
|
class OBSUploader: NSObject {
|
static let shared = OBSUploader()
|
|
private let disposeBag = DisposeBag()
|
var configuration: OBSServiceConfiguration {
|
let credentailProvider = OBSStaticCredentialProvider(accessKey: accessKeyId, secretKey: accessKeySecret)
|
return OBSServiceConfiguration(url: URL(string: OBS_URL),credentialProvider: credentailProvider)
|
}
|
|
lazy var obsClient: OBSClient = OBSClient.init(configuration: configuration)
|
func uploadImage(keys: [String], image: [UIImage]) -> 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]))
|
}
|
return Observable.zip(ob)
|
}
|
|
func uploadDatas(keys: [String], image: [Data],type:[String],showHUD:Bool = true) -> Observable<[String]> {
|
if keys.count == 0 {
|
return Observable.just([])
|
}
|
var ob: [Observable<String>] = []
|
let count = keys.count
|
for i in 0..<count {
|
var t = type[i]
|
if t.int == 1 {
|
t = ".png"
|
}else{
|
t = ".mp4"
|
}
|
ob.append(uploadFilePath(key: keys[i], filePath: image[i], type: t))
|
}
|
return Observable.zip(ob)
|
}
|
|
func uploadImage(key: String, image: UIImage,showHUD:Bool = true,resize:Bool = true,needCheck:Bool = true) -> Observable<String> {
|
if key.isEmpty {
|
return Observable.just("")
|
} else {
|
if showHUD{
|
DispatchQueue.main.async {
|
SVProgressHUD.show(withStatus: "上传中")
|
}
|
}
|
var uploadImage:Data?
|
if resize{
|
uploadImage = image.pngData()
|
}else{
|
uploadImage = image.pngData()
|
}
|
let client = obsClient
|
return Observable<String>.create{ ob in
|
let put = OBSPutObjectWithDataRequest.init(bucketName: bucketName, objectKey: "\(key).png", uploadData: uploadImage)
|
let task = client.putObject(put, completionHandler: { (response, error) in
|
})
|
task?.continueWith(block: { (r) -> Any? in
|
DispatchQueue.main.async {
|
SVProgressHUD.dismiss()
|
}
|
if r.error == nil {
|
let url = "\(oss_domain)/\(key).png"
|
ob.onNext(url)
|
} else {
|
ob.onError(OBSUploaderError.Failed)
|
DispatchQueue.main.async {
|
SVProgressHUD.dismiss()
|
alertError(msg: r.error?.localizedDescription ?? "")
|
}
|
}
|
return nil
|
})
|
return Disposables.create{
|
}
|
}.observe(on: MainScheduler.instance)
|
}
|
}
|
|
func uploadFilePath(key: String, filePath: Data,type:String) -> Observable<String> {
|
if key.isEmpty {
|
return Observable.just("")
|
} else {
|
DispatchQueue.main.async {
|
SVProgressHUD.show()
|
}
|
let client = obsClient
|
return Observable<String>.create{ ob in
|
let put = OBSPutObjectWithDataRequest.init(bucketName: bucketName, objectKey: "\(key)\(type)", uploadData:filePath)
|
let task = client.putObject(put, completionHandler: { (response, error) in
|
})
|
task?.continueWith(block: { (r) -> Any? in
|
DispatchQueue.main.async {
|
// SVProgressHUD.dismiss()
|
}
|
if r.error == nil {
|
let url = "\(oss_domain)/\(key)\(type)"
|
ob.onNext(url)
|
} else {
|
ob.onError(OBSUploaderError.Failed)
|
DispatchQueue.main.async {
|
alertError(msg: r.error?.localizedDescription ?? "")
|
}
|
}
|
return nil
|
})
|
return Disposables.create{
|
}
|
}.observe(on: MainScheduler.instance)
|
}
|
}
|
|
func createTask(key: String, image: UIImage) -> Observable<String> {
|
let client = obsClient
|
return Observable<String>.create{ ob in
|
let imageData = image.pngData()
|
let put = OBSPutObjectWithDataRequest.init(bucketName: bucketName, objectKey: "\(key).png", uploadData: imageData)
|
let task = client.putObject(put, completionHandler: { (response, error) in
|
})
|
task?.continueWith(block: { (r) -> Any? in
|
if r.error == nil {
|
let url = "\(oss_domain)/\(key).png"
|
ob.onNext(url)
|
} else {
|
ob.onError(OBSUploaderError.Failed)
|
}
|
return nil
|
})
|
return Disposables.create{
|
}
|
}.observe(on: MainScheduler.instance)
|
}
|
}
|
|
|
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)
|
}
|
}
|
|
public extension UIImage{
|
func uploadImg()->Observable<String>{
|
return OBSUploader.shared.uploadImage(key: String.jq_randomStr(len: 10), image: self, showHUD: true, resize: true, needCheck: false)
|
}
|
}
|
|
enum OBSUploaderError: Error {
|
case Failed
|
}
|