在过去的几天里,我正在尝试将本地保存的声音记录上传到服务器(它使用 php 文件处理它并将其保存到服务器)。问题是我找不到这样做的方法。
在录制声音(AVAudioRecorder)时,它保存在“NSTemporaryDirectory()”中:
NSURL *temporaryRecFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"VoiceFile"]]];
现在,无论我在哪里检查答案都是使用ASIHTTPRequest。但问题是它在 ios6 中不受支持。
还有一些其他的库,但无论我如何尝试,都没有任何效果。如果有人可以帮助我,我会很高兴...
这是我的代码:
视图控制器.h
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>
@interface ViewController : UIViewController <AVAudioRecorderDelegate,AVAudioPlayerDelegate>
{
UIButton *recordButton;
UIButton *playButton;
UIButton *uploadFile;
UILabel *recStateLabel;
BOOL isNotRecording;
NSURL *temporaryRecFile;
AVAudioRecorder *recorder;
AVAudioPlayer *player;
}
@property (nonatomic,retain) IBOutlet UIButton *uploadFile;
@property (nonatomic,retain) IBOutlet UIButton *playButton;
@property (nonatomic,retain) IBOutlet UIButton *recordButton;
@property (nonatomic,retain) IBOutlet UILabel *recStateLabel;
-(IBAction)recording;
-(IBAction)playback;
-(IBAction)upload;
@end
视图控制器.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包含我使用STHTTPRequest和 AFNetworking等库进行的一些测试