I have been trying for the past few days to upload a locally stored sound recording to the server (which transfers it using a php file and stores it on the server). The problem is that I cannot find a way to do this.
During sound recording (AVAudioRecorder), it saves in "NSTemporaryDirectory ()":
NSURL *temporaryRecFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"VoiceFile"]]];
Now, everywhere I checked the answer to use ASIHTTPRequest . but the problem is that it is not supported in ios6.
There are several other libraries for it, but nothing works no matter what and how I try. I would love it if someone helped me ...
Here is my code:
ViewController.h
ViewController.m
#import "ViewController.h" #import <AVFoundation/AVFoundation.h> #import "STHTTPRequest.h" @interface ViewController () @end @implementation ViewController @synthesize recordButton,playButton,uploadFile,recStateLabel; -(IBAction)recording { if(isNotRecording) { isNotRecording = NO; [recordButton setTitle:@"Stop" forState:UIControlStateNormal]; playButton.hidden = YES; recStateLabel.text = @"Recording"; temporaryRecFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"VoiceFile"]]]; NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:AVAudioQualityMin], AVEncoderAudioQualityKey, [NSNumber numberWithInt:16], AVEncoderBitRateKey, [NSNumber numberWithInt: 2], AVNumberOfChannelsKey, [NSNumber numberWithFloat:44100.0], AVSampleRateKey, nil]; recorder = [[AVAudioRecorder alloc]initWithURL:temporaryRecFile settings:recordSettings error:nil]; [recorder setDelegate:self]; [recorder prepareToRecord]; [recorder record]; } else { isNotRecording = YES; [recordButton setTitle:@"Rec" forState:UIControlStateNormal]; playButton.hidden = NO; recStateLabel.text = @"Not Recording"; [recorder stop]; } } -(IBAction)playback { player = [[AVAudioPlayer alloc]initWithContentsOfURL:temporaryRecFile error:nil]; //player.volume = 1; [player setVolume: 1.0]; [player play]; } -(IBAction)upload { NSLog(@"upload"); recStateLabel.text = @"Uploading"; NSData *data = [NSData dataWithContentsOfFile:NSTemporaryDirectory()]; NSMutableString *urlString = [[NSMutableString alloc] initWithFormat:@""]; [urlString appendFormat:@"%@", data]; NSData *postData = [urlString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; NSString *baseurl = @"http://efron.org.il/dev/singsong/upload.php"; NSURL *url = [NSURL URLWithString:baseurl]; NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; [urlRequest setHTTPMethod: @"POST"]; [urlRequest setValue:postLength forHTTPHeaderField:@"Content-Length"]; [urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [urlRequest setHTTPBody:postData]; NSURLConnection *connection = [NSURLConnection connectionWithRequest:urlRequest delegate:self]; [connection start]; NSLog(@"Started!"); /* STHTTPRequest *r = [STHTTPRequest requestWithURLString:@"http://efron.org.il/dev/singsong/upload.php"]; r.completionBlock = ^(NSDictionary *headers, NSString *body) { // ... }; r.errorBlock = ^(NSError *error) { NSLog(@"error"); }; [r setFileToUpload:NSTemporaryDirectory() parameterName:@"sound"]; [r startAsynchronous]; ///................../// NSString *boundary = @"---------------------------14737809831466499882746641449"; NSMutableData *postData = [NSMutableData data]; NSString *header = [NSString stringWithFormat:@"--%@\r\n", boundary]; [postData appendData:[header dataUsingEncoding:NSUTF8StringEncoding]]; //add your filename entry NSString *contentDisposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", @"filename", @"iosaudio"]; [postData appendData:[contentDisposition dataUsingEncoding:NSUTF8StringEncoding]]; [postData appendData:[NSData dataWithContentsOfFile:NSTemporaryDirectory()]]; NSString *endItemBoundary = [NSString stringWithFormat:@"\r\n--%@\r\n",boundary]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setHTTPMethod:@"POST"]; [request setURL:[NSURL URLWithString:@"http://efron.org.il/dev/singsong/upload.php"]]; [postData appendData:[endItemBoundary dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:postData]; ///.........../// NSURL *url = [NSURL URLWithString:@"http://efron.org.il/"]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; NSData *songData = [NSData dataWithContentsOfURL:temporaryRecFile]; NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"dev/singsong/upload.php" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { [formData appendPartWithFormData:songData name:@"file"]; }]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { recStateLabel.text = [NSString stringWithFormat:@"Sent %lld/%lld", totalBytesWritten, totalBytesExpectedToWrite]; }]; [httpClient enqueueHTTPRequestOperation:operation]; */ } - (void)viewDidLoad { isNotRecording = YES; playButton.hidden = YES; recStateLabel.text = @"Not Recording"; AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [audioSession setActive:YES error:nil]; [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
ViewController.m includes some tests that I have done with libraries like STHTTPRequest and AFNetworking