iOS上傳語音到伺服器,這裡介紹用AFN上傳語音檔案到服務端。
語音轉NSData
如果不是NSData就要想辦法把語音檔案轉化為NSData,然後才能上傳伺服器。首先我們拿到語音檔案對應的NSData對象
NSData *voiceData = [message valueForKey:@"wavAudioData"];
上傳代碼
代碼如下 |
複製代碼 |
//kHostURL為開發人員公司的APP對應的主網域名稱,比如http://xxx.yyy.cn AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:kHostURL]]; manager.requestSerializer.timeoutInterval = 100; NSMutableDictionary *paras = [[NSMutableDictionary alloc]init]; [paras setValue:self.msgType forKey:@"msgType"]; //以file的形式上傳,這裡的key很重要"accessory",這個是和伺服器端對應的,千萬不能亂寫,一定要看介面文檔,不然會上傳失敗 [paras setValue:(__bridge id)((__bridge FILE *)(voiceData)) forKey:@"accessory"]; [paras setValue:[BLLUser getPushToken] forKey:@"senderPushToken"]; [paras setValue:self.receiverPushToken forKey:@"receiverPushToken"]; [paras setObject:[Base getKey] forKey:@"ukey"]; AFHTTPRequestOperation * operation = [manager POST:kBLLUrl_Chat_Chat parameters:paras constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyyMMddHHmmss"; NSString *str = [formatter stringFromDate:[NSDate date]]; //fileName這裡取目前時間戳 //accessory還是一樣和服務端對應,具體看你自己的介面文檔 //mimeType選擇@"amr/mp3/wmr",意思是告訴服務端,我上傳的檔案類型是支援三種格式amr、mp3和wmr,這裡需要注意 //這裡我是上傳了一個amr格式的語音檔案,那麼如果你的語音檔案為其它格式,一定要和服務端對應上,比如服務端讓你上傳wav格式的語音,那麼你拿到的是amr,怎麼辦?講個笑話,有人直接改尾碼,服務端不是讓我上傳wav的嘛,直接改.wav不就可以了嘛!真的有人這樣想這樣做了。那麼這裡告訴你,你是男的,穿了女人的衣服,你仍然是男的。即使割掉丁丁也不是女的,最多算是不男不女。解決方案就是找第三方庫,把你的amr語音轉換為wav,然後轉為NSData再上傳就可以了。 NSString *fileName = [NSString stringWithFormat:@"%@.amr", str]; [formData appendPartWithFileData:voiceData name:@"accessory" fileName:fileName mimeType:@"amr/mp3/wmr"]; } success:^(AFHTTPRequestOperation *operation, NSData * responseObject) { NSLog(@"回調成功!"); NSError * error; NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&error]; //json解析得到儲存伺服器返回的字典 NSLog(@"狀態==%@",dic[@"msg"]); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //串連伺服器失敗 NSLog(@"發送失敗"); }]; operation.responseSerializer = [AFHTTPResponseSerializer serializer]; [operation start]; |
代碼可以直接copy,改baseURL和路徑,已經上傳的關鍵參數。就可以上傳成功。