////
|
//// ImageUploader.swift
|
//// waijiao
|
////
|
//// Created by Chen, Harry (CHE-MLP) on 2018/4/17.
|
//// Copyright © 2018年 Chen, Harry (CHE-MLP). All rights reserved.
|
////
|
|
import Foundation
|
import AliyunOSSiOS
|
import RxCocoa
|
import RxSwift
|
import MBProgressHUD
|
import Photos
|
|
let Oss_Domain = "https://jiayixing-bucket.oss-cn-beijing.aliyuncs.com/"
|
let Oss_Endpoint = "http://oss-cn-beijing.aliyuncs.com"
|
let Oss_AccessKey = "LTAI5tE2Z7nA1rbtzZYMSPqR"
|
let Oss_Access_Secret = "HOGUqx1t4UWh8KepXJf69dlKj4tTBs"
|
let Oss_Bucket_Name = "jiayixing-bucket"
|
|
class YYAliyunOSSManager: NSObject {
|
|
static let shared = YYAliyunOSSManager()
|
|
lazy var credential: OSSCustomSignerCredentialProvider = OSSCustomSignerCredentialProvider(implementedSigner: { sign, error in
|
var sign = OSSUtil.calBase64Sha1(withData: sign, withSecret: Oss_Access_Secret)
|
|
if sign == nil {
|
fatalError()
|
}
|
|
return "OSS \(Oss_AccessKey):\(sign!)"
|
})!
|
|
lazy var ossClient: OSSClient = OSSClient(endpoint: Oss_Endpoint, credentialProvider: credential)
|
|
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 uploadImage(key: String, image: UIImage) -> Observable<String> {
|
if key.isEmpty {
|
return Observable.just("")
|
} else {
|
var hud: MBProgressHUD?
|
hud = MBProgressHUD.showAdded(to: app.window!, animated: true)
|
hud?.mode = .indeterminate
|
hud?.bezelView.style = .solidColor
|
hud?.bezelView.color = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.7)
|
hud?.bezelView.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.7)
|
hud?.customView?.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
|
hud?.show(animated: true)
|
let client = ossClient
|
return Observable<String>.create{ ob in
|
let put = OSSPutObjectRequest()
|
put.bucketName = Oss_Bucket_Name
|
put.objectKey = "\(key).png"
|
put.uploadingData = resizeImage(originalImg: image, maxWidth: 1280, maxHeight: 720).pngData()!
|
let task = client.putObject(put)
|
task.continue({ r in
|
DispatchQueue.main.async {
|
hud?.hide(animated: true)
|
}
|
if r.error == nil {
|
ob.onNext("\(Oss_Domain)\(key).png")
|
} else {
|
ob.onError(ImageUploadError.Failed)
|
}
|
return nil
|
})
|
|
return Disposables.create{
|
|
}
|
}.observeOn(MainScheduler.instance)
|
}
|
}
|
|
func uploadVideo(key: String, video: PHAsset,showHUD:Bool = false) -> Observable<String> {
|
if key.isEmpty {
|
return Observable.just("")
|
} else {
|
var hud: MBProgressHUD?
|
if showHUD{
|
hud = MBProgressHUD.showAdded(to: app.window!, animated: true)
|
hud?.mode = .indeterminate
|
hud?.bezelView.style = .solidColor
|
hud?.bezelView.color = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.7)
|
hud?.bezelView.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.7)
|
hud?.customView?.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
|
hud?.show(animated: true)
|
}
|
|
let client = ossClient
|
return Observable<String>.create{ ob in
|
let put = OSSPutObjectRequest()
|
put.bucketName = Oss_Bucket_Name
|
put.objectKey = "\(key).mov"
|
|
let urlStr = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, .userDomainMask, true).last!.appendingPathComponent("temp_video_\(Date().timeStamp()).mov")
|
|
var fileUrl:URL? = URL(fileURLWithPath:urlStr)
|
var data:Data?
|
|
PHImageManager.default().requestAVAsset(forVideo: video, options: nil) { avasset, _, info in
|
guard avasset != nil else {
|
ob.onError(ImageUploadError.Failed);return
|
}
|
|
let exportSession = AVAssetExportSession(asset: avasset!, presetName:AVAssetExportPresetHighestQuality)
|
exportSession!.outputFileType = .mov
|
exportSession!.outputURL = fileUrl
|
exportSession!.exportAsynchronously {
|
|
guard fileUrl != nil else {
|
ob.onError(ImageUploadError.Failed);return
|
}
|
|
do{
|
data = try Data(contentsOf: fileUrl!)
|
}catch(_){
|
ob.onError(ImageUploadError.Failed)
|
}
|
|
|
put.uploadingData = data!
|
let task = client.putObject(put)
|
task.continue({ r in
|
DispatchQueue.main.async {
|
hud?.hide(animated: true)
|
}
|
if r.error == nil {
|
ob.onNext("\(Oss_Domain)\(key).mov")
|
} else {
|
ob.onError(ImageUploadError.Failed)
|
}
|
return nil
|
})
|
}
|
}
|
return Disposables.create{}
|
}.observeOn(MainScheduler.instance)
|
}
|
}
|
|
func createTask(key: String, image: UIImage) -> Observable<String> {
|
let client = ossClient
|
return Observable<String>.create{ ob in
|
let put = OSSPutObjectRequest()
|
put.bucketName = Oss_Bucket_Name
|
put.objectKey = "\(key).png"
|
put.uploadingData = resizeImage(originalImg: image, maxWidth: 1280, maxHeight: 720).pngData()!
|
let task = client.putObject(put)
|
task.continue({ r in
|
if r.error == nil {
|
ob.onNext("\(Oss_Domain)\(key).png")
|
} else {
|
ob.onError(ImageUploadError.Failed)
|
}
|
return nil
|
})
|
|
return Disposables.create{
|
|
}
|
}.observeOn(MainScheduler.instance)
|
}
|
|
}
|
|
enum ImageUploadError: Error {
|
case Failed
|
}
|