Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
galaxy-iOS
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
mobile-group
galaxy-iOS
Commits
7dad47ca
Commit
7dad47ca
authored
May 19, 2024
by
pete谢兆麟
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
OSS 封装及实现文件图片上传
parent
181cc9c6
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
126 additions
and
452 deletions
+126
-452
YHBaseViewModel.swift
galaxy/galaxy/Classes/Base/C/YHBaseViewModel.swift
+62
-30
YHHomePageViewController.swift
...Classes/Modules/Home(首页)/C/YHHomePageViewController.swift
+2
-1
YHAllApiName.swift
galaxy/galaxy/Classes/Tools/NetWork/YHAllApiName.swift
+1
-0
YHNetRequest.swift
galaxy/galaxy/Classes/Tools/NetWork/YHNetRequest.swift
+2
-0
YHOSSManager.swift
galaxy/galaxy/Classes/Tools/Upload/YHOSSManager.swift
+59
-421
No files found.
galaxy/galaxy/Classes/Base/C/YHBaseViewModel.swift
View file @
7dad47ca
...
...
@@ -18,22 +18,38 @@ class YHBaseViewModel {
YHHUD
.
flash
(
message
:
"
\(
Float
(
size
/
1024
/
1024
)
)
M"
)
#endif
let
strUrl
=
YHBaseUrlManager
.
shared
.
curOssURL
()
+
YHAllApiName
.
OSS
.
uploadApi
let
boundary
=
UUID
()
.
uuidString
let
headers
:
HTTPHeaders
=
[
"Content-type"
:
"multipart/form-data; boundary=
\(
boundary
)
"
,
"businessCode"
:
"4001001"
]
let
_
=
YHNetRequest
.
uplaodRequest
(
url
:
strUrl
,
headers
:
headers
,
image
:
image
)
{
[
weak
self
]
json
,
code
in
// let strUrl = YHBaseUrlManager.shared.curOssURL() + YHAllApiName.OSS.uploadApi
// let boundary = UUID().uuidString
// let headers: HTTPHeaders = [
// "Content-type": "multipart/form-data; boundary=\(boundary)",
// "businessCode": "4001001"
// ]
// let _ = YHNetRequest.uplaodRequest(url: strUrl, headers: headers, image: image) { [weak self] json, code in
// guard let _ = self else { return }
// if json.code == 200 {
// callBackBlock(json.data as? String, nil)
// } else {
// let error : YHErrorModel = YHErrorModel(errorCode:Int32(json.code), errorMsg: json.msg)
// callBackBlock(nil, error)
// }
// } failBlock: { err in
// callBackBlock(nil, err)
// }
if
YHNetworkStatusManager
.
shared
.
isNetWorkOK
==
false
{
DispatchQueue
.
main
.
async
{
YHHUD
.
flash
(
message
:
"网络异常"
)
let
errorModel
=
YHErrorModel
(
errorCode
:
0
,
errorMsg
:
"网络异常"
)
callBackBlock
(
nil
,
errorModel
)
return
}
return
}
YHOSSManager
.
share
.
putObject
(
image
:
image
)
{[
weak
self
]
success
,
error
in
guard
let
_
=
self
else
{
return
}
if
json
.
code
==
200
{
callBackBlock
(
json
.
data
as?
String
,
nil
)
}
else
{
let
error
:
YHErrorModel
=
YHErrorModel
(
errorCode
:
Int32
(
json
.
code
),
errorMsg
:
json
.
msg
)
callBackBlock
(
nil
,
error
)
DispatchQueue
.
main
.
async
{
// 在这里执行需要在主线程上完成的任务
callBackBlock
(
success
,
error
)
}
}
failBlock
:
{
err
in
callBackBlock
(
nil
,
err
)
}
}
...
...
@@ -75,23 +91,39 @@ class YHBaseViewModel {
// 上传方法
func
uploadFile
(
_
url
:
String
,
callBackBlock
:
@escaping
(
_
success
:
String
?,
_
error
:
YHErrorModel
?)
->
())
{
let
strUrl
=
YHBaseUrlManager
.
shared
.
curOssURL
()
+
YHAllApiName
.
OSS
.
uploadApi
printLog
(
"
\(
url
)
"
)
let
boundary
=
UUID
()
.
uuidString
let
headers
:
HTTPHeaders
=
[
"Content-type"
:
"multipart/form-data; boundary=
\(
boundary
)
"
,
"businessCode"
:
"4001001"
]
let
_
=
YHNetRequest
.
uplaodFileRequest
(
url
:
strUrl
,
headers
:
headers
,
fileUrl
:
url
)
{
[
weak
self
]
json
,
code
in
guard
let
self
=
self
else
{
return
}
if
json
.
code
==
200
{
callBackBlock
(
json
.
data
as?
String
,
nil
)
}
else
{
let
error
:
YHErrorModel
=
YHErrorModel
(
errorCode
:
Int32
(
json
.
code
),
errorMsg
:
json
.
msg
)
callBackBlock
(
nil
,
error
)
// let strUrl = YHBaseUrlManager.shared.curOssURL() + YHAllApiName.OSS.uploadApi
// printLog("\(url)")
// let boundary = UUID().uuidString
// let headers: HTTPHeaders = [
// "Content-type": "multipart/form-data; boundary=\(boundary)",
// "businessCode": "4001001"
// ]
// let _ = YHNetRequest.uplaodFileRequest(url: strUrl, headers: headers, fileUrl: url) { [weak self] json, code in
// guard let self = self else { return }
// if json.code == 200 {
// callBackBlock(json.data as? String, nil)
// } else {
// let error : YHErrorModel = YHErrorModel(errorCode:Int32(json.code), errorMsg: json.msg)
// callBackBlock(nil, error)
// }
// } failBlock: { err in
// callBackBlock(nil, err)
// }
if
YHNetworkStatusManager
.
shared
.
isNetWorkOK
==
false
{
DispatchQueue
.
main
.
async
{
YHHUD
.
flash
(
message
:
"网络异常"
)
let
errorModel
=
YHErrorModel
(
errorCode
:
0
,
errorMsg
:
"网络异常"
)
callBackBlock
(
nil
,
errorModel
)
return
}
}
failBlock
:
{
err
in
callBackBlock
(
nil
,
err
)
return
}
YHOSSManager
.
share
.
putFile
(
file
:
url
,
callBackBlock
:
{[
weak
self
]
success
,
error
in
guard
let
_
=
self
else
{
return
}
DispatchQueue
.
main
.
async
{
// 在这里执行需要在主线程上完成的任务
callBackBlock
(
success
,
error
)
}
})
}
}
galaxy/galaxy/Classes/Modules/Home(首页)/C/YHHomePageViewController.swift
View file @
7dad47ca
...
...
@@ -44,6 +44,8 @@ class YHHomePageViewController: YHBaseViewController {
override
func
viewWillAppear
(
_
animated
:
Bool
)
{
super
.
viewWillAppear
(
animated
)
requestAppNewVersion
()
//获取OSS密钥
YHOSSManager
.
share
.
getOSSID
()
}
lazy
var
searchView
:
YHHomeSearchView
=
{
...
...
@@ -72,7 +74,6 @@ private extension YHHomePageViewController {
homeHeaderView
.
homeBannerView
.
dataArr
=
[
YHBannerModel
.
localDefaultItem
()]
loadFirstData
()
getHomeBannerData
()
}
func
getHomeBannerData
()
{
...
...
galaxy/galaxy/Classes/Tools/NetWork/YHAllApiName.swift
View file @
7dad47ca
...
...
@@ -190,6 +190,7 @@ class YHAllApiName {
static
let
uploadApi
=
"oss/upload/storage"
static
let
getPublicApi
=
"oss/storage/convertToPublicURL"
static
let
getPublicUrlsApi
=
"oss/storage/batchConvertToPublicURL"
static
let
getID
=
"ossv2/sts/auth"
}
//我的签字
...
...
galaxy/galaxy/Classes/Tools/NetWork/YHNetRequest.swift
View file @
7dad47ca
...
...
@@ -92,6 +92,8 @@ class YHNetRequest: NSObject {
requestHeader
.
add
(
name
:
"app_version"
,
value
:
version
)
requestHeader
.
add
(
name
:
"pass"
,
value
:
""
)
requestHeader
.
add
(
name
:
"businessCode"
,
value
:
"4001001"
)
let
appkey
=
"958364f87222c200a72414f492bf0e26"
let
signOrgiString
=
"appid="
+
"1"
+
"&"
+
"timestamp="
+
dateStr
+
"&"
+
"appkey="
+
appkey
let
sign
=
signOrgiString
.
md5
()
...
...
galaxy/galaxy/Classes/Tools/Upload/YHOSSManager.swift
View file @
7dad47ca
...
...
@@ -26,454 +26,92 @@ extension NSError : YHError {
public
var
_userInfo
:
AnyObject
?
{
return
userInfo
as
NSDictionary
}
}
class
YHOSSDefine
{
static
let
OSS_ACCESSKEY_ID
:
String
=
"access_key_id"
static
let
OSS_SECRETKEY_ID
:
String
=
"access_key_secret"
static
let
OSS_BUCKET_PUBLIC
:
String
=
"public-bucket"
static
let
OSS_BUCKET_PRIVATE
:
String
=
"private-bucket"
static
let
OSS_ENDPOINT
:
String
=
"http://oss-cn-region.aliyuncs.com"
static
let
OSS_MULTIPART_UPLOADKEY
:
String
=
"multipart"
static
let
OSS_RESUMABLE_UPLOADKEY
:
String
=
"resumable"
static
let
OSS_CALLBACK_URL
:
String
=
"http://oss-demo.aliyuncs.com:23450"
static
let
OSS_CNAME_URL
:
String
=
"http://www.cnametest.com/"
static
let
OSS_STSTOKEN_URL
:
String
=
"http://*.*.*.*.****/sts/getsts"
static
let
OSS_IMAGE_KEY
:
String
=
"testImage.png"
static
let
OSS_CRC64_ENABLE
:
Bool
=
true
static
let
OSS_CONTENT_TYPE
:
String
=
"Content-Type"
static
let
OSS_CONTENT_LENGTH
:
String
=
"Content-Length"
static
let
OSS_TEST_CONTENT_TYPE
:
String
=
"application/special"
static
let
OSS_APPEND_OBJECT_KEY
:
String
=
"appendObject"
static
let
SCHEME
=
"https://"
static
let
ENDPOINT
=
"oss-cn-hangzhou.aliyuncs.com"
static
let
CNAME_ENDPOINT
=
"oss.custom.com"
static
let
IP_ENDPOINT
=
"192.168.1.1:8080"
static
let
BUCKET_NAME
=
"BucketName"
static
let
OBJECT_KEY
=
"ObjectKey"
class
YHOSSModel
:
YHBaseModel
{
var
bucket
:
String
=
""
var
Expiration
:
String
=
""
var
bucketPath
:
String
=
""
var
accessKeyId
:
String
=
""
var
accessKeySecret
:
String
=
""
var
endpoint
:
String
=
""
var
securityToken
:
String
=
""
}
class
YHOSSManager
:
NSObject
,
URLSessionDelegate
{
static
let
share
=
YHOSSManager
()
var
mProvider
:
OSSAuthCredentialProvider
!
var
model
:
YHOSSModel
=
YHOSSModel
()
var
mProvider
:
OSSStsTokenCredentialProvider
!
var
mClient
:
OSSClient
!
var
fileName
:
String
=
""
override
init
()
{
mProvider
=
OSSAuthCredentialProvider
(
authServerUrl
:
YHOSSDefine
.
OSS_STSTOKEN_URL
)
mClient
=
OSSClient
(
endpoint
:
YHOSSDefine
.
OSS_ENDPOINT
,
credentialProvider
:
mProvider
)
}
func
getObject
()
{
let
getObjectReq
:
OSSGetObjectRequest
=
OSSGetObjectRequest
()
getObjectReq
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
getObjectReq
.
objectKey
=
YHOSSDefine
.
OSS_IMAGE_KEY
getObjectReq
.
downloadProgress
=
{
(
bytesWritten
:
Int64
,
totalBytesWritten
:
Int64
,
totalBytesExpectedToWrite
:
Int64
)
->
Void
in
printLog
(
"bytesWritten:
\(
bytesWritten
)
,totalBytesWritten:
\(
totalBytesWritten
)
,totalBytesExpectedToWrite:
\(
totalBytesExpectedToWrite
)
"
)
};
let
task
:
OSSTask
=
mClient
.
getObject
(
getObjectReq
);
task
.
continue
({(
t
)
->
OSSTask
<
AnyObject
>
?
in
self
.
showResult
(
task
:
t
)
return
nil
})
task
.
waitUntilFinished
()
printLog
(
"Error:
\(
String
(
describing
:
task
.
error
)
)
"
)
}
func
getImage
()
{
let
getObjectReq
:
OSSGetObjectRequest
=
OSSGetObjectRequest
()
getObjectReq
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
getObjectReq
.
objectKey
=
"ImageKey"
getObjectReq
.
xOssProcess
=
"image/resize,m_lfit,w_100,h_100"
getObjectReq
.
downloadProgress
=
{
(
bytesWritten
:
Int64
,
totalBytesWritten
:
Int64
,
totalBytesExpectedToWrite
:
Int64
)
->
Void
in
printLog
(
"bytesWritten:
\(
bytesWritten
)
,totalBytesWritten:
\(
totalBytesWritten
)
,totalBytesExpectedToWrite:
\(
totalBytesExpectedToWrite
)
"
)
};
let
task
:
OSSTask
=
mClient
.
getObject
(
getObjectReq
);
task
.
continue
({(
t
)
->
OSSTask
<
AnyObject
>
?
in
self
.
showResult
(
task
:
t
)
return
nil
})
task
.
waitUntilFinished
()
printLog
(
"Error:
\(
String
(
describing
:
task
.
error
)
)
"
)
}
func
getStsToken
()
{
let
tcs
=
OSSTaskCompletionSource
<
AnyObject
>
()
let
federationProvider
:
OSSFederationCredentialProvider
=
OSSFederationCredentialProvider
(
federationTokenGetter
:
{()
->
OSSFederationToken
?
in
let
url
:
URL
=
URL
(
string
:
YHOSSDefine
.
OSS_STSTOKEN_URL
)
!
let
config
:
URLSessionConfiguration
=
URLSessionConfiguration
.
default
let
session
:
URLSession
=
URLSession
(
configuration
:
config
,
delegate
:
self
as
URLSessionDelegate
,
delegateQueue
:
nil
)
let
task
=
session
.
dataTask
(
with
:
url
,
completionHandler
:
{
(
data
,
response
,
error
)
->
Void
in
//Convert Data to Jsons
tcs
.
setResult
(
data
as
AnyObject
)
})
task
.
resume
()
tcs
.
task
.
waitUntilFinished
()
let
json
=
try
?
JSONSerialization
.
jsonObject
(
with
:
tcs
.
task
.
result
as!
Data
,
options
:
.
allowFragments
)
as?
[
String
:
Any
]
print
(
"Json Object:"
,
json
as
Any
)
//verify json
let
accessKeyId
=
json
?[
"AccessKeyId"
]
let
accessKeySecret
=
json
?[
"AccessKeySecret"
]
self
.
ossAlert
(
title
:
"notice"
,
message
:
json
?
.
description
)
let
token
=
OSSFederationToken
()
token
.
tAccessKey
=
accessKeyId
as!
String
token
.
tSecretKey
=
accessKeySecret
as!
String
return
token
})
do
{
try
federationProvider
.
getToken
()
}
catch
{
print
(
"get Error"
)
}
}
func
headObject
()
{
let
objectKey
=
"key"
if
objectKey
.
isEmpty
{
ossAlert
(
title
:
nil
,
message
:
"objectKey can not be empty!"
)
}
let
request
=
OSSHeadObjectRequest
()
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
request
.
objectKey
=
objectKey
let
task
:
OSSTask
=
mClient
.
headObject
(
request
)
task
.
continue
({(
task
)
->
OSSTask
<
AnyObject
>
?
in
self
.
showResult
(
task
:
task
)
return
nil
})
task
.
waitUntilFinished
()
}
func
getBucket
()
{
let
request
=
OSSGetBucketRequest
()
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
let
task
=
mClient
.
getBucket
(
request
)
task
.
continue
(
{
(
t
)
->
Any
?
in
if
let
result
=
t
.
result
as?
OSSGetBucketResult
{
self
.
showResult
(
task
:
OSSTask
(
result
:
result
.
contents
as
AnyObject
))
}
else
{
self
.
showResult
(
task
:
t
)
}
return
nil
})
}
func
getBucketACL
()
->
Void
{
let
request
=
OSSGetBucketACLRequest
()
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
let
task
=
mClient
.
getBucketACL
(
request
)
task
.
continue
(
{
(
t
)
->
Any
?
in
if
let
result
=
t
.
result
as?
OSSGetBucketACLResult
{
self
.
showResult
(
task
:
OSSTask
(
result
:
result
.
aclGranted
as
AnyObject
))
}
else
{
self
.
showResult
(
task
:
t
)
func
getOSSID
()
{
let
strUrl
=
YHBaseUrlManager
.
shared
.
curOssURL
()
+
YHAllApiName
.
OSS
.
getID
let
_
=
YHNetRequest
.
getRequest
(
url
:
strUrl
)
{
[
weak
self
]
json
,
code
in
//1. json字符串 转 对象
guard
let
self
=
self
else
{
return
}
let
dic
=
json
.
data
guard
let
resultModel
=
YHOSSModel
.
deserialize
(
from
:
dic
as?
Dictionary
)
else
{
return
}
return
nil
})
self
.
model
=
resultModel
self
.
mProvider
=
OSSStsTokenCredentialProvider
(
accessKeyId
:
self
.
model
.
accessKeyId
,
secretKeyId
:
self
.
model
.
accessKeySecret
,
securityToken
:
self
.
model
.
securityToken
)
self
.
mClient
=
OSSClient
(
endpoint
:
self
.
model
.
endpoint
,
credentialProvider
:
self
.
mProvider
)
}
failBlock
:
{
err
in
}
func
createBucket
()
->
Void
{
let
request
=
OSSCreateBucketRequest
()
request
.
bucketName
=
"com-dhc-test"
let
task
=
mClient
.
createBucket
(
request
)
task
.
continue
(
{
(
t
)
->
Any
?
in
self
.
showResult
(
task
:
t
)
return
nil
})
}
func
deleteBucket
()
->
Void
{
let
request
=
OSSDeleteBucketRequest
()
request
.
bucketName
=
"com-dhc-test"
let
task
=
mClient
.
deleteBucket
(
request
)
task
.
continue
(
{
(
t
)
->
Any
?
in
self
.
showResult
(
task
:
t
)
return
nil
})
}
func
putObject
(
image
:
UIImage
)
{
func
putObject
(
image
:
UIImage
,
callBackBlock
:
@escaping
(
_
success
:
String
?,
_
error
:
YHErrorModel
?)
->
())
{
let
request
=
OSSPutObjectRequest
()
request
.
uploadingData
=
image
.
pngData
()
!
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
request
.
objectKey
=
"landscape-painting.jpeg"
request
.
uploadProgress
=
{
(
bytesSent
:
Int64
,
totalBytesSent
:
Int64
,
totalBytesExpectedToSend
:
Int64
)
->
Void
in
printLog
(
"bytesSent:
\(
bytesSent
)
,totalBytesSent:
\(
totalBytesSent
)
,totalBytesExpectedToSend:
\(
totalBytesExpectedToSend
)
"
)
};
let
provider
=
OSSFederationTokenCredentialProvider
{
let
tcs
=
TaskCompletionSource
()
DispatchQueue
(
label
:
"test"
)
.
async
{
Thread
.
sleep
(
forTimeInterval
:
10
)
let
token
=
OSSFederationToken
()
token
.
tAccessKey
=
"STS.tAccessKey"
token
.
tSecretKey
=
"tSecretKey"
token
.
tToken
=
"tToken"
token
.
expirationTimeInGMTFormat
=
"2023-05-23T07:34:27Z"
// or tcs.trySetError(<#T##error: Error##Error#>)
tcs
.
trySetResult
(
token
)
}
tcs
.
wait
(
timeout
:
5
)
if
let
error
=
tcs
.
task
.
error
{
let
nsError
=
error
as
NSError
if
nsError
.
code
==
OSSClientErrorCODE
.
codeNotKnown
.
rawValue
,
let
errorMessage
=
nsError
.
userInfo
[
OSSErrorMessageTOKEN
]
as?
String
,
errorMessage
==
"TaskCompletionSource wait timeout."
{
// 超时错误
}
throw
error
}
else
if
let
result
=
tcs
.
task
.
result
as?
OSSFederationToken
{
return
result
}
throw
NSError
(
domain
:
OSSClientErrorDomain
,
code
:
OSSClientErrorCODE
.
codeSignFailed
.
rawValue
,
userInfo
:
[
OSSErrorMessageTOKEN
:
"Can not get FederationToken."
])
}
let
client
=
OSSClient
(
endpoint
:
YHOSSDefine
.
OSS_ENDPOINT
,
credentialProvider
:
provider
)
let
task
=
client
.
putObject
(
request
)
task
.
continue
({
(
t
)
->
Any
?
in
self
.
showResult
(
task
:
t
)
})
.
waitUntilFinished
()
}
func
multipartUpload
()
{
let
request
=
OSSMultipartUploadRequest
()
request
.
uploadingFileURL
=
Bundle
.
main
.
url
(
forResource
:
"wangwang"
,
withExtension
:
"zip"
)
!
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
request
.
objectKey
=
"wangwang(swift).zip"
request
.
partSize
=
102400
;
let
size
=
Int
(
5
*
1024
*
1024
)
guard
let
imageData
=
image
.
compressOriginalImage
(
size
)
else
{
return
}
request
.
uploadingData
=
imageData
request
.
bucketName
=
self
.
model
.
bucket
let
timestamp
=
Date
()
.
timeIntervalSince1970
self
.
fileName
=
"
\(
UInt64
(
timestamp
)
)
"
+
".jpg"
request
.
objectKey
=
self
.
model
.
bucketPath
+
"/"
+
"
\(
self
.
fileName
)
"
request
.
uploadProgress
=
{
(
bytesSent
:
Int64
,
totalBytesSent
:
Int64
,
totalBytesExpectedToSend
:
Int64
)
->
Void
in
printLog
(
"bytesSent:
\(
bytesSent
)
,totalBytesSent:
\(
totalBytesSent
)
,totalBytesExpectedToSend:
\(
totalBytesExpectedToSend
)
"
)
};
let
provider
=
OSSAuthCredentialProvider
(
authServerUrl
:
YHOSSDefine
.
OSS_STSTOKEN_URL
)
let
client
=
OSSClient
(
endpoint
:
YHOSSDefine
.
OSS_ENDPOINT
,
credentialProvider
:
provider
)
let
task
=
client
.
multipartUpload
(
request
)
task
.
continue
({
(
t
)
->
Any
?
in
self
.
showResult
(
task
:
t
)
})
.
waitUntilFinished
()
}
func
sequentialMultipartUpload
()
{
let
request
=
OSSResumableUploadRequest
()
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
;
request
.
objectKey
=
"sequential-swift-multipart"
request
.
uploadingFileURL
=
Bundle
.
main
.
url
(
forResource
:
"wangwang"
,
withExtension
:
"zip"
)
!
request
.
deleteUploadIdOnCancelling
=
false
request
.
crcFlag
=
OSSRequestCRCFlag
.
open
let
filePath
=
Bundle
.
main
.
path
(
forResource
:
"wangwang"
,
ofType
:
"zip"
)
request
.
contentSHA1
=
OSSUtil
.
sha1
(
withFilePath
:
filePath
)
let
task
=
mClient
.
sequentialMultipartUpload
(
request
)
task
.
continue
({
(
t
)
->
Any
?
in
self
.
showResult
(
task
:
t
)
return
nil
})
.
waitUntilFinished
()
}
func
resumableUpload
()
{
var
request
=
OSSResumableUploadRequest
()
request
.
uploadingFileURL
=
Bundle
.
main
.
url
(
forResource
:
"wangwang"
,
withExtension
:
"zip"
)
!
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
request
.
deleteUploadIdOnCancelling
=
false
request
.
objectKey
=
"wangwang(swift).zip"
let
cacheDir
=
NSSearchPathForDirectoriesInDomains
(
FileManager
.
SearchPathDirectory
.
cachesDirectory
,
FileManager
.
SearchPathDomainMask
.
userDomainMask
,
true
)
.
first
request
.
recordDirectoryPath
=
cacheDir
!
request
.
partSize
=
102400
request
.
uploadProgress
=
{
(
bytesSent
:
Int64
,
totalBytesSent
:
Int64
,
totalBytesExpectedToSend
:
Int64
)
->
Void
in
printLog
(
"bytesSent:
\(
bytesSent
)
,totalBytesSent:
\(
totalBytesSent
)
,totalBytesExpectedToSend:
\(
totalBytesExpectedToSend
)
"
)
if
totalBytesSent
>
(
totalBytesExpectedToSend
/
2
)
{
request
.
cancel
()
}
}
var
task
=
mClient
.
resumableUpload
(
request
)
let
task
=
self
.
mClient
.
putObject
(
request
)
task
.
continue
({
(
t
)
->
Any
?
in
print
(
"Error:
\(
String
(
describing
:
t
.
error
)
)
"
)
return
nil
})
.
waitUntilFinished
()
request
=
OSSResumableUploadRequest
()
request
.
uploadingFileURL
=
Bundle
.
main
.
url
(
forResource
:
"wangwang"
,
withExtension
:
"zip"
)
!
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
request
.
objectKey
=
"wangwang(swift).zip"
request
.
partSize
=
102400
;
request
.
deleteUploadIdOnCancelling
=
false
request
.
recordDirectoryPath
=
cacheDir
!
request
.
uploadProgress
=
{
(
bytesSent
:
Int64
,
totalBytesSent
:
Int64
,
totalBytesExpectedToSend
:
Int64
)
->
Void
in
printLog
(
"bytesSent:
\(
bytesSent
)
,totalBytesSent:
\(
totalBytesSent
)
,totalBytesExpectedToSend:
\(
totalBytesExpectedToSend
)
"
)
let
result
=
t
if
(
result
.
error
!=
nil
)
{
callBackBlock
(
nil
,
YHErrorModel
())
}
else
{
let
string
=
"https://"
+
self
.
model
.
bucket
+
"."
+
"oss-cn-shenzhen.aliyuncs.com/"
+
self
.
model
.
bucketPath
+
"/"
+
self
.
fileName
callBackBlock
(
string
,
YHErrorModel
())
}
task
=
mClient
.
resumableUpload
(
request
)
task
.
continue
({
(
t
)
->
Any
?
in
self
.
showResult
(
task
:
t
)
return
nil
return
})
.
waitUntilFinished
()
}
func
put
ObjectWithXML
(
)
{
func
put
File
(
file
:
String
,
callBackBlock
:
@escaping
(
_
success
:
String
?,
_
error
:
YHErrorModel
?)
->
()
)
{
let
request
=
OSSPutObjectRequest
()
request
.
uploadingFileURL
=
Bundle
.
main
.
url
(
forResource
:
"test"
,
withExtension
:
"xml"
)
!
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
request
.
objectKey
=
"test.xml"
request
.
contentSHA1
=
OSSUtil
.
sha1
(
withFilePath
:
Bundle
.
main
.
path
(
forResource
:
"test"
,
ofType
:
"xml"
))
guard
let
fileData
=
try
?
Data
(
contentsOf
:
URL
(
string
:
file
)
??
URL
(
fileURLWithPath
:
""
))
else
{
return
}
let
fileExtension
=
URL
(
fileURLWithPath
:
file
)
.
pathExtension
.
lowercased
()
request
.
uploadingData
=
fileData
request
.
bucketName
=
self
.
model
.
bucket
let
timestamp
=
Date
()
.
timeIntervalSince1970
self
.
fileName
=
"
\(
UInt64
(
timestamp
)
)
"
+
".
\(
fileExtension
)
"
request
.
objectKey
=
self
.
model
.
bucketPath
+
"/"
+
"
\(
self
.
fileName
)
"
request
.
uploadProgress
=
{
(
bytesSent
:
Int64
,
totalBytesSent
:
Int64
,
totalBytesExpectedToSend
:
Int64
)
->
Void
in
print
(
"bytesSent:
\(
bytesSent
)
,totalBytesSent:
\(
totalBytesSent
)
,totalBytesExpectedToSend:
\(
totalBytesExpectedToSend
)
"
);
print
Log
(
"bytesSent:
\(
bytesSent
)
,totalBytesSent:
\(
totalBytesSent
)
,totalBytesExpectedToSend:
\(
totalBytesExpectedToSend
)
"
)
};
let
task
=
mClient
.
putObject
(
request
)
task
.
continue
({
(
t
)
->
Any
?
in
self
.
showResult
(
task
:
t
)
})
.
waitUntilFinished
()
}
func
getObjectACL
()
{
let
request
=
OSSGetObjectACLRequest
()
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
request
.
objectName
=
YHOSSDefine
.
OSS_IMAGE_KEY
let
task
=
mClient
.
getObjectACL
(
request
)
task
.
continue
({
(
t
)
->
Any
?
in
self
.
showResult
(
task
:
t
)
return
nil
})
.
waitUntilFinished
()
}
func
deleteMultipleObjects
()
{
let
request
=
OSSDeleteMultipleObjectsRequest
()
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
request
.
keys
=
[
"testFor5m"
]
request
.
quiet
=
false
request
.
encodingType
=
"url"
let
task
=
mClient
.
deleteMultipleObjects
(
request
)
task
.
continue
({
(
t
)
->
Any
?
in
self
.
showResult
(
task
:
t
)
return
nil
})
.
waitUntilFinished
()
}
func
triggerCallBack
()
{
let
provider
=
OSSPlainTextAKSKPairCredentialProvider
.
init
(
plainTextAccessKey
:
"AK"
,
secretKey
:
"SK"
)
let
pClient
=
OSSClient
.
init
(
endpoint
:
YHOSSDefine
.
OSS_ENDPOINT
,
credentialProvider
:
provider
)
let
request
=
OSSCallBackRequest
()
request
.
bucketName
=
YHOSSDefine
.
OSS_BUCKET_PRIVATE
request
.
objectName
=
"file1m"
request
.
callbackVar
=
[
"key1"
:
"value1"
,
"key2"
:
"value2"
]
request
.
callbackParam
=
[
"callbackUrl"
:
YHOSSDefine
.
OSS_CALLBACK_URL
,
"callbackBody"
:
"test"
]
let
task
=
pClient
.
triggerCallBack
(
request
)
let
task
=
self
.
mClient
.
putObject
(
request
)
task
.
continue
({
(
t
)
->
Any
?
in
if
(
t
.
result
!=
nil
)
{
let
result
=
t
.
result
as!
OSSCallBackResult
;
self
.
ossAlert
(
title
:
"提示"
,
message
:
result
.
serverReturnJsonString
);
}
return
nil
})
.
waitUntilFinished
()
}
//验证结果
func
showResult
(
task
:
OSSTask
<
AnyObject
>
?)
{
if
(
task
?
.
error
!=
nil
)
{
let
error
:
NSError
=
(
task
?
.
error
)
!
as
NSError
self
.
ossAlert
(
title
:
"error"
,
message
:
error
.
description
)
}
else
{
let
result
=
task
?
.
result
self
.
ossAlert
(
title
:
"notice"
,
message
:
result
?
.
description
)
}
}
func
ossAlert
(
title
:
String
?,
message
:
String
?)
{
DispatchQueue
.
main
.
async
{
let
alertCtrl
=
UIAlertController
(
title
:
title
,
message
:
message
,
preferredStyle
:
UIAlertController
.
Style
.
alert
)
alertCtrl
.
addAction
(
UIAlertAction
(
title
:
"confirm"
,
style
:
UIAlertAction
.
Style
.
default
,
handler
:
{
(
action
)
in
print
(
"
\(
action
.
title
!
)
has been clicked"
);
alertCtrl
.
dismiss
(
animated
:
true
,
completion
:
nil
)
}))
UIViewController
.
current
?
.
present
(
alertCtrl
,
animated
:
true
,
completion
:
nil
)
}
}
}
public
class
OSSFederationTokenCredentialProvider
:
OSSFederationCredentialProvider
{
var
token
:
OSSFederationToken
?
private
var
tokenGetter
:
()
throws
->
OSSFederationToken
public
init
(
tokenGetter
:
@escaping
()
throws
->
OSSFederationToken
)
{
self
.
tokenGetter
=
tokenGetter
super
.
init
()
}
public
override
func
getToken
()
throws
->
OSSFederationToken
{
do
{
if
var
token
=
token
{
if
let
expirationTimeInGMTFormat
=
token
.
expirationTimeInGMTFormat
{
let
dateFormatter
=
DateFormatter
()
dateFormatter
.
timeZone
=
TimeZone
(
identifier
:
"GMT"
)
dateFormatter
.
locale
=
Locale
(
identifier
:
"en_US_POSIX"
)
dateFormatter
.
dateFormat
=
"yyyy-MM-dd'T'HH:mm:ssZ"
if
let
data
=
dateFormatter
.
date
(
from
:
expirationTimeInGMTFormat
)
{
token
.
expirationTimeInMilliSecond
=
Int64
(
data
.
timeIntervalSince1970
*
1000
)
}
}
let
expirationDate
=
Date
(
timeIntervalSince1970
:
TimeInterval
(
token
.
expirationTimeInMilliSecond
/
1000
))
let
interval
=
expirationDate
.
timeIntervalSince
(
NSDate
.
oss_clockSkewFixed
())
if
interval
<
5
*
60
{
token
=
try
self
.
tokenGetter
()
self
.
token
=
token
}
return
token
let
result
=
t
if
(
result
.
error
!=
nil
)
{
let
error
:
NSError
=
(
task
.
error
)
!
as
NSError
let
result
=
error
.
description
callBackBlock
(
nil
,
YHErrorModel
())
}
else
{
let
token
=
try
self
.
tokenGetter
()
self
.
token
=
token
return
token
}
}
catch
{
throw
NSError
(
domain
:
OSSClientErrorDomain
,
code
:
OSSClientErrorCODE
.
codeSignFailed
.
rawValue
,
userInfo
:
[
OSSErrorMessageTOKEN
:
error
])
let
string
=
"https://"
+
self
.
model
.
bucket
+
"."
+
"oss-cn-shenzhen.aliyuncs.com/"
+
self
.
model
.
bucketPath
+
"/"
+
self
.
fileName
callBackBlock
(
string
,
YHErrorModel
())
}
}
}
public
class
TaskCompletionSource
:
OSSTaskCompletionSource
<
AnyObject
>
{
public
func
wait
(
timeout
:
TimeInterval
)
{
let
timer
=
DispatchSource
.
makeTimerSource
()
timer
.
schedule
(
deadline
:
.
now
()
+
timeout
)
timer
.
setEventHandler
{
if
!
self
.
task
.
isCompleted
{
let
error
=
NSError
(
domain
:
OSSClientErrorDomain
,
code
:
OSSClientErrorCODE
.
codeNotKnown
.
rawValue
,
userInfo
:
[
OSSErrorMessageTOKEN
:
"TaskCompletionSource wait timeout."
])
self
.
trySetError
(
error
)
}
}
timer
.
resume
()
task
.
waitUntilFinished
()
timer
.
cancel
()
return
})
.
waitUntilFinished
()
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment