七牛云只提供了单张图片上传的 API, 如果需要多张图片上传,那么就需要多次调用上传文件的 API, 这样在多图片上传时无法保证上传图片顺序,因为有的图片上传的快,有的图片上传的慢,类似朋友圈发表评论的功能,用户可以选择上传图片,那么你必须保证上传图片的顺序跟用户选择图片的顺序一致.本文提供了部分代码,教你如何使用七牛云多图片上传时图片顺序的问题.
将图片和对应的 key 放到一个字典里,可以同时上传包括avatar 和 showImage 等多个不同意义的图片,同时上传这些图片,然后对上传后数据进行分类和图片名称排序
将图片和对应的 key 放到一个字典里,可以同时上传包括avatar 和 showImage 等多个不同意义的图片,同时上传这些图片,然后对上传后数据进行分类和图片名称排序
/**
* 七牛上传多张图片的接口
*
* @param files 二进制文件集合 @{@"key1" : @[UIImage1,UIImage2],@"key2" :[NSData,NSData]};
* @param completionHandler 完成后的回调
*/
- (void) uploadFiles:(NSDictionary *)files
imageCount:(NSInteger)count
complete:(CYQNUpCompletionHandler)completionHandler;
/**
* 七牛上传多张图片的接口
*
* @param files 二进制文件集合 @{@"key1" : @[UIImage1,UIImage2],@"key2" :[NSData,NSData]};
* @param completionHandler 完成后的回调
*/
- (void) uploadFiles:(NSDictionary *)files
imageCount:(NSInteger)count
complete:(CYQNUpCompletionHandler)completionHandler {
__weak typeof(self)weakSelf = self;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
__block NSInteger uploadImageCount = 1;
NSMutableArray *keysArray = [NSMutableArray array];
__block NSString *qnToken = [weakSelf getQiniuToken];
[files enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
__weak NSArray *array = (NSArray*)obj;
for (int idx = 0 ; idx.count ; idx++) {
id file = [array objectAtIndex:idx];
[weakSelf asyncUploadFile:file uploadIndex:idx qnToken:qnToken fileKey:key complete:^(NSDictionary *dictionary, NSError *error) {
if (error) {
completionHandler(nil,[NSError errorWithDomain:@"图片上传错误,请重新上传" code:201 userInfo:nil]);
return;
}
[keysArray addObject:dictionary];
NSMutableDictionary *result = [NSMutableDictionary dictionary];
if (uploadImageCount == count) {
for (NSString *key in files.allKeys) {
//利用 KVC 高级用法 从key sArray 分离出所有 key相关值的字典 并把值放到一个子数组里
NSArray *subArray = [[keysArray valueForKey:key] mutableCopy];
///数组值去除NSNull类型的
subArray = [CYQNUploadManager yv_removeNullWithArray:subArray];
///对上传的图片进行排序 保证上传图片顺序
subArray = [subArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
NSString *image1 = obj1;
NSString *image2 = obj2;
return [image1 compare:image2];
}];
[result setObject:subArray forKey:key];
}
dispatch_async(dispatch_get_main_queue(), ^{
if (completionHandler) {
completionHandler(result,nil);
}
});
}
uploadImageCount+=1;
}];
}
}];
});
}
单张图片上传方法,可多次执行上传多张图片时
/**
异步上传图片的方法
@param file 二进制文件集合 @{@"key1" : @[UIImage1,UIImage2],@"key2" :[NSData,NSData]};
@param completionHandler 完成后的回调
*/
- (void) asyncUploadFile:(id)file
uploadIndex:(NSInteger)index
qnToken:(NSString *)token
fileKey:(NSString *)aKey
complete:(CYQNUpCompletionHandler)completionHandler {
__block NSDictionary *resultDict;
__weak typeof(self)weakSelf = self;
NSData *data;
if ([file isKindOfClass:[UIImage class]]) {
data = UIImageJPEGRepresentation(file, 0.10f);
} else if ([data isKindOfClass:[NSData class]]) {
data = (NSData*)file;
} else { // 其他类型
NSAssert(NO, @"file 类型不合法,必须是 UIImage/NSData 类型实例");
}
YVQNAssetFile *uploadFile = [[YVQNAssetFile alloc] init];
uploadFile.data = data;
QNUploadOption *option = [[QNUploadOption alloc] initWithMime:nil progressHandler:^(NSString *key, float percent) {
} params:@{@"x:foo" : aKey} checkCrc:NO cancellationSignal:nil];
[weakSelf.qnUploadManager putData:uploadFile.data key:[NSString stringWithFormat:@"/%@/%@-index_%zd.png",aKey,uploadFile.fileName,index] token:token complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
CYQNResponseResp *cyQnResp = [[CYQNResponseResp alloc] init];
cyQnResp.qnKey = [resp objectForKey:@"key"];
cyQnResp.qnHash = [resp objectForKey:@"hash"];
cyQnResp.type = [resp objectForKey:@"x:foo"];
if (!info.error) {
resultDict = @{cyQnResp.type:cyQnResp.qnKey};
completionHandler(resultDict,nil);
} else {
completionHandler(nil,info.error);
}
} option:option];
}
图片排序就是在上传时候 给图片名 key 里加入 index 这样的标识,将来上传成功后根据 index 将图片名称排序放到一个数组里
//核心部分代码
具体使用例子
本文只提供了七牛云多图上传过程中如何处理图片顺序的一个思路,如果正好有这方面需求的同行 可以加我 QQ 1060545231