アプリで録音してサーバにアップロードする[Swift / XCode 6]
アプリで録音してサーバにアップロードする処理がどこを探してもないのでメモしておく。
録音するまでは調べれは出るので、録音した後の処理。
func myAudioUploadRequest(recorder : AVAudioRecorder) { var myUrl:NSURL = NSURL(string: "http://localhost/voice/upload.php")! var fileurldata:NSData = NSData(contentsOfURL:recorder.url, options:nil, error:nil)! var request = NSMutableURLRequest(URL: myUrl) request.HTTPMethod = "POST" request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") var base64String = fileurldata.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) var err: NSError? = nil var params = ["sound":[ "content_type": "audio/aac", "filename":"test.m4a", "file_data": base64String]] request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions(0), error: &err)! var session = NSURLSession.sharedSession() var task = session.dataTaskWithRequest(request, completionHandler: { data, response, error -> Void in var strData = NSString(data: data, encoding: NSUTF8StringEncoding) var err: NSError? // process the response }) task.resume() // this is needed to start the task }
録音が終わった時点でファイルが生成されているので、そのパスからデータをNSDataにして、base64encodeを行う。
あとはjson形式のパラメータにつっこんでポストする。
サーバ側の処理はjsonに対応して以下のように
$json_string = file_get_contents('php://input'); $obj = json_decode($json_string,true); $sound = $obj['sound']['file_data']; $fp = fopen("[file_path]/test.m4a",w); fwrite($fp,base64_decode($sound)); fclose($fp);
もろもろ処理は残るが、だいたいこんな感じ。