iOS中使用七牛云存储Django服务端实现简单的图片上传功能

来源:互联网 发布:程序员试用期总结 编辑:程序博客网 时间:2024/06/14 01:43

这篇文章主要以一个例子来讲解OC七牛云存储的图片上传实现,服务端为Django

一、服务端代码

#全局变量,AccessKey和SecretKey在七牛的官网注册之后可以分配到QINIU_ACCESS_KEY = '***********'QINIU_SECRET_KEY = '******'QINIU_BUCKET_NAME = '*****'#全局变量,只创建一个认证过的qiniu对象q = qiniu.Auth(QINIU_ACCESS_KEY, QINIU_SECRET_KEY)#以json格式返回upload token的视图def getToken(request):    #上传文件的名称key    fileKey  = ''    #随机生成一个16位的大写字母串作为名称    for i in range(0, 16):        fileKey += chr(randint(65, 90))    #获取当前时间    nowTime = datetime.datetime.now()        #根据时间和随机字符串构造key,根据时间分割出一个伪层级结构,可根据需求自行定义    fileKey = str(nowTime.year) + '/' + str(nowTime.month) + '/' + str(nowTime.day) \                + '/' + str(nowTime.hour) + '/' + str(nowTime.minute) + '/' + str(nowTime.second) + '/' + str(nowTime.microsecond) \                + '/' + fileKey    #上传文件成功后返回给客户端的信息,注意此处写法,要求是双引号否则会出错    returnBody = '{\"key\": $(key),' \                 '\"bucket\": $(bucket),' \                 '\"size\": $(fsize),' \                 '\"w\": $(imageInfo.width),' \                 '\"h\": $(imageInfo.height),' \                 '\"uuid\": $(uuid)}'    #构造一个put policy,具体用法详见官方文档    putPolicy = {        'returnBody': returnBody,    }    #获取一个上传凭证    global q    token = q.upload_token(QINIU_BUCKET_NAME, fileKey, policy=putPolicy)    #封装成json类型发送信息    tokenJson = {        'token': token,        'key': fileKey,    }    return HttpResponse(json.dumps(tokenJson), content_type='application/json')


服务端代码较为简单,主要是看用户自定义的程度如何,在此我只是简单的示范了一下用法,服务端应该将最后生成的key和七牛为你分配的域名组合起来并保存在数据库中,这样服务端下一次可直接返回url给客户端进行数据访问。


二、客户端(iOS端)

1、获取token:由于iOS进行异步加载,upload token可能还没获得的时候便执行了上传工作,此时必然会发生错误,因此在这里采用同步获取数据的方式,确保客户端先获取到服务端返回的upload token再进行上传工作。

- (NSDictionary*) getToken {        //封装一个获取upload token的url    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:8000/gettoken/"];    //创建一个url request    NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:url];    //设置http访问方式为GET方式    urlRequest.HTTPMethod = @"GET";    //使用AFNetworking进行同步操作    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest];    //开始执行同步访问方式    [operation start];    [operation waitUntilFinished];        //由于在服务端返回的json数据,因此需要先进行一次转换,使用Foundation框架即可    NSDictionary *result = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:operation.responseData options:0 error:nil];    //返回封装了upload token的字典    return result;}- (void)click:(UIButton*)sender {    //在这里我将qiniu的manager放在AppDelegate文件中以构造一个全局量,只生成一个即可    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];    QNUploadManager *qiniuManager = delegate.qiniuUploadManager;        //使用同步方式获取upload token    NSDictionary *tkDict = [self getToken];        //加载本地的一张图片并封装为NSData    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"under30" ofType:@"jpg"];    NSData *data = [NSData dataWithContentsOfFile:filePath];        //调用QNUploadManager进行上传操作,在服务端设置的returnBody既为这里的resp    //这里的key为文件名,token即为上传凭证    [qiniuManager putData:data key:[tkDict valueForKey:@"key"] token:[tkDict valueForKey:@"token"] complete:^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {        NSLog(@"-------------------------");                NSLog(@"TOKEN %@", [tkDict valueForKey:@"token"] );        NSLog(@"FILEKEY %@", [tkDict valueForKey:@"key"]);                        NSLog(@"QNRESPONSE INFO %@", info);        NSLog(@"STRINGKEY KEY %@", key);        NSLog(@"RESPDICT DICT %@", resp);        NSLog(@"-------------------------");    } option:nil];         /**    这个urlStr即为刚刚上传的图片的外网链接,com以后即为我们自己组装的文件名key,封装为一个NSURL以便读取数据    七牛提供了一些基本和扩展的图片处理方法,直接在url后添加数据即可,非常的便捷,在这里不做过多解释,可移步官方文档     **/    NSString *urlStr = @"http://7xku6x.com1.z0.glb.clouddn.com/2015/8/3/11/22/56/165133/ADGVHMOEYADDWAAQ";    NSURL *url = [NSURL URLWithString:urlStr];        //通过前述的NSURL来加载这张图片    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url options:1 error:nil]];}



0 0
原创粉丝点击