最简单的实现方式上传图片
//在调用相机中获取图片
[manager POST:naurl parameters:requestParms constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// 设置时间格式(给个时间便于区分)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@%d",str,i];
//要上传的文件(用个循环传多张)
/**
* data 将图片转换成data NSData *data=UIImagePNGRepresentation(image);
* name 服务器接受的name 两种格式1.数组,直接file可以穿多个进去 2.服务器端是键值 只能写file1 file2(看服务器的接受)
* filename 随意写
* mimeType 百度mime 看图片格式对应的mime
*/
[formData appendPartWithFileData:data name:[NSString stringWithFormat:@"file%d",i+1] fileName:fileName mimeType:@"image/png"];
}
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
淘宝,天猫,酒店等App,都牵涉到对其中提供的服务评分的功能。今天先从上传图片开始说起,一般创业型的公司,自己公司的服务器实现存储和处 理主业务逻辑。其他服务包括云推送和云存储数据都是存放在第三方提供的服务器中。当我们上传图片等信息的时候,存放在第三方平台中,在上传的时候获取 hash或者key作为该用户上传的唯一标示符。然后当App需要展示数据的时候就需要让自己公司的服务器根据唯一标示,去请求第三方平台,将请求的数据 拉取到公司服务器中。然后公司服务器将数据发送给客户端。这就是大体的图片上传和图片获取。
公司采用的是第三方云储存。本来是又拍云,后来经过讨论决定使用七牛。本人以前没有做过这方面的研究。所以你懂得,到处都是坑。也是遇见问题解决问题,总算一个一个给解决了。
其实最坑的还是七牛的官方文档,有兴趣可以去看看,自己集成一下。现编展示一下写到现在,能够实现的效果吧。
这里贴出一部分代码:仅供参考:
#pragma mark -上传图片到七牛服务器
- (void)uploadImage{
//give token
//请求服务器的临时uPtoken
NSString *str=[NSString stringWithFormat:@"http://weixin2.imike.cn/qiniu/uptoken"];
NSURL *url = [NSURL URLWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURLRequest *requests = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operations = [[AFHTTPRequestOperationalloc]initWithRequest:requests];
[operations setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, idresponseObject){
id dict=[NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil];
// NSLog(@"获取到的数据为:%@",dict);
NSLog(@"%@",dict[@"uptoken"]);
// _token = dict[@"uptoken"];
_token = [NSString stringWithFormat:@"%@",dict[@"uptoken"]];
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"发生错误!%@",error);
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operations];
_dataArray = [[NSMutableArray alloc]init];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
_dataSource = appDelegate.sourceArray;
for (UIImage *imageView in _dataSource) {
#pragma mark -此时如果重新选择,那么需要将会上传两次选择的图片
// NSLog(@"%@",_dataSource);
if (UIImagePNGRepresentation(imageView)) {
//返回为png图像。
_data = UIImagePNGRepresentation(imageView);
}else {
//返回为JPEG图像。
_data = UIImageJPEGRepresentation(imageView, 1.0);
}
[_dataArray addObject:_data];
}
//这里考虑使用异步线程上传图片的方法
[self initConcurrent];
}
-(long long)getRandomNumber:(long long )from to:(long long )to
{
return (long long)(from + (arc4random() % (to-from + 1)));
}
//并行队列
- (void)initConcurrent{
//创建出队列
GCDGroup *group = [[GCDGroup alloc]init];
GCDQueue *queue = [[GCDQueue alloc]initConcurrent];
for (int i = 0; i < _dataArray.count; i++) {
[queue execute:^{
QNUploadManager *upManager = [[QNUploadManager alloc] init];
[upManager putData:[_dataArray objectAtIndex:i] key:[NSStringstringWithFormat:@"iOS上传图片组%1lld",[self getRandomNumber:1 to:11111111111111111]]token:_token
complete: ^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
NSLog(@"%@", info);
NSLog(@"%@", resp);
} option:nil];
} inGroup:group];
}
}
一个成功的App,需要考虑的因素有太多。