阿里云圖片上傳的基本思路:
1抵怎、選擇圖片
2翩活、將圖片保存在本地,同時返回圖片路徑便贵、并生成縮略圖用于 UI 顯示菠镇。
3、上傳圖片承璃,成功后將步驟 2 中的圖片名傳給服務器利耍。
單張圖片上傳的例子官方的 demo 中已經(jīng)有了,這里直接上多圖上傳盔粹。
具體實現(xiàn)是結合 NSOperationQueue隘梨,設置 operation 間的依賴來實現(xiàn)多圖上傳。
這里省略步驟 1舷嗡、2 轴猎,直接上傳圖片:
+ (void)uploadImages:(NSArray<UIImage *> *)images isAsync:(BOOL)isAsync complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete
{
id<OSSCredentialProvider> credential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:AccessKey secretKey:SecretKey];
OSSClient *client = [[OSSClient alloc] initWithEndpoint:AliYunHost credentialProvider:credential];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = images.count;
NSMutableArray *callBackNames = [NSMutableArray array];
int i = 0;
for (UIImage *image in images) {
if (image) {
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
//任務執(zhí)行
OSSPutObjectRequest * put = [OSSPutObjectRequest new];
put.bucketName = BucketName;
NSString *imageName = [kTempFolder stringByAppendingPathComponent:[[NSUUID UUID].UUIDString stringByAppendingString:@".jpg"]];
put.objectKey = imageName;
[callBackNames addObject:imageName];
NSData *data = UIImageJPEGRepresentation(image, 0.3);
put.uploadingData = data;
OSSTask * putTask = [client putObject:put];
[putTask waitUntilFinished]; // 阻塞直到上傳完成
if (!putTask.error) {
NSLog(@"upload object success!");
} else {
NSLog(@"upload object failed, error: %@" , putTask.error);
}
if (isAsync) {
if (image == images.lastObject) {
NSLog(@"upload object finished!");
if (complete) {
complete([NSArray arrayWithArray:callBackNames] ,UploadImageSuccess);
}
}
}
}];
if (queue.operations.count != 0) {
[operation addDependency:queue.operations.lastObject];
}
[queue addOperation:operation];
}
i++;
}
if (!isAsync) {
[queue waitUntilAllOperationsAreFinished];
NSLog(@"haha");
if (complete) {
if (complete) {
complete([NSArray arrayWithArray:callBackNames], UploadImageSuccess);
}
}
}
}
Screen Shot 2016-05-31 at 10.09.02 PM.png
根據(jù)返回的地址可以 bucketName + aliYunHost + 地址 在瀏覽器中直接訪問了。
例如 bucketName = "my-bucket"; aliYunHost = "http://oss-cn-shenzhen.aliyuncs.com/"; 返回圖片地址 = "temp/69058506-679B-432C-AD11-61A34C067235.jpg";
那么可以通過 “my-bucket.oss-cn-shenzhen.aliyuncs.com/temp/69058506-679B-432C-AD11-61A34C067235.jpg” 直接在瀏覽器中進行訪問