最近公司要上传视频,选择七牛云服务器,但是令人不爽的是 七牛上没有任何demo
而且服务器在创建数据的时候 跟传文件是分开的 , 为了减轻服务器负担和缓存 , 就是我自己要往七牛上传文件 , 然后掉服务器接口创建数据, 经过了无限判断之后还是能做的 , 就是客户端做的太重了
简单说下七牛上传的流程
1. 一般是由服务器去七牛上获取七牛的上传文件token , 自己本地也能生成 , 但是有过期时间, 而且不安全
2. 获取到token以后就可以上传文件了, 注意: 七牛上传文件的api都是带key 的 这个key 就是七牛服务器上文件的名字, 所以这个key是要填的(如果你们服务器可以帮你们做的话也可以不传的)
3. 做完第二步之后就是调自己服务器的接口, 要创建自己服务器上的数据了(这时我就在想了, 如果这次调接口失败了 , 七牛上的文件我是不是要删了啊 , 然后就没说话 , 默默的没考虑删除这回事) , 如果你的七牛的储存空间是公开的 , 那么可以直接自己拼出来文件的下载地址 , 但是好像没公司的七牛储存空间是公开的 。所以这时就需要你在调自己服务器的接口的时候把刚才的文件名传给服务器 , 服务器会根据这个文件名生成对应的下载地址。
先上自己创建七牛token的代码
// 创建token
-(void)createQNToken{
// 将上传策略中的scrop和deadline序列化成json格式
NSMutableDictionary *authInfo = [NSMutableDictionary dictionary];
[authInfosetObject:self.scopeforKey:@"scope"];
[authInfo
setObject:[NSNumber numberWithLong:[[NSDate date] timeIntervalSince1970] + self.liveTime * 24 * 3600]
forKey:@"deadline"];
NSData*jsonData =
[NSJSONSerialization dataWithJSONObject:authInfo options:NSJSONWritingPrettyPrinted error:nil];
// 对json序列化后的上传策略进行URL安全的base64编码
NSString*encodedString = [selfurlSafeBase64Encode:jsonData];
// 用secretKey对编码后的上传策略进行HMAC-SHA1加密,并且做安全的base64编码,得到encoded_signed
NSString*encodedSignedString = [selfHMACSHA1:kSecretKeytext:encodedString];
// 将accessKey、encodedSignedString和encodedString拼接,中间用:分开,就是上传的token
NSString*token =
[NSStringstringWithFormat:@"%@:%@:%@",kAccessKey, encodedSignedString, encodedString];
NSLog(@"%@",token);
self.uploadToken= token;
}
- (NSString*)urlSafeBase64Encode:(NSData*)text {
NSString*base64 =
[[NSString alloc] initWithData:[QN_GTM_Base64 encodeData:text] encoding:NSUTF8StringEncoding];
base64 = [base64stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
base64 = [base64stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
returnbase64;
}
- (NSString*)HMACSHA1:(NSString*)key text:(NSString*)text {
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [text cStringUsingEncoding:NSUTF8StringEncoding];
char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey,strlen(cKey), cData,strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:CC_SHA1_DIGEST_LENGTH];
NSString*hash = [selfurlSafeBase64Encode:HMAC];
returnhash;
}
其中涉及到的几个变量 scope 就是七牛储存空间名 liveTime就是token有效时间 以天为单位
scope
kSecretKey / kAccessKey 就是下图中的 AK和SK
secretKey / accessKey
//用到加密的时候要导入两个系统头文件
#import
#import
如果服务器为你获取七牛的token的话 , 直接上传文件就行了
-(void)uploadImageToQNFilePath:(NSString*)filePath
key:(NSString*)key {
QNUploadManager *upManager = [[QNUploadManager alloc] init];
QNUploadOption *uploadOption = [[QNUploadOption alloc] initWithMime:nil progressHandler:^(NSString *key, float percent) {
NSLog(@"上传进度 %.2f", percent);
}
params:nil
checkCrc:NO
cancellationSignal:nil];
[upManagerputFile:filePathkey:keytoken:self.uploadTokencomplete:^(QNResponseInfo*info,NSString*key,NSDictionary*resp) {
NSLog(@"%@\n",info);
NSLog(@"%@\n",resp);
}
option:uploadOption];
}