PGメモ

非エンジニアの記録

アプリで録音してサーバにアップロードする[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);

もろもろ処理は残るが、だいたいこんな感じ。