2

Я пробовал дюжину вещей. Но я не получаю результатов. Я хочу преобразовать аудиофайл wav/mp3 в массив байтов или иначе и отправить его на php-сервер. Ниже приведены несколько вещей, которые я попробовал, которые уже перечислены в SO. пожалуйста помоги.Как загрузить аудиофайл через NSURLConnection iPhone?

NSURL *urlPath = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"r2d2" ofType:@"mp3"]]; 
NSString *wavbundlepath = [urlPath absoluteString]; 
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:wavbundlepath]]; 


NSUInteger len = data.length; 
int8_t *bytes = (int8_t *)[data bytes]; 
NSMutableString *result = [NSMutableString stringWithCapacity:len]; 
[result appendString:@"["]; 
for (NSUInteger i = 0; i < len; i++) { 
    if (i) { 
     [result appendString:@","]; 
    } 
    [result appendFormat:@"%d", bytes[i]]; 
} 
[result appendString:@"]"]; 

NSString *urlString = @"http://apps2.mobiiworld.com/staging/krafttesting/"; 

// setting up the request object now 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 
NSData* dataSend = [result dataUsingEncoding:NSUTF8StringEncoding]; 
[request setHTTPBody:dataSend]; 

NSURLResponse *response; 
NSError *err; 
NSData *responseData2 = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
NSLog(@"responseData: %@", responseData2); 

Следующая

NSURL *urlPath = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"r2d2" ofType:@"mp3"]]; 
NSString *wavbundlepath = [urlPath absoluteString]; 
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:wavbundlepath]];NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

/* 
add some header info now 
we always need a boundary when we post a file 
also we need to set the content type 

You might want to generate a random boundary.. this is just the same 
as my output from wireshark on a valid html post 
*/ 
NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

/* 
now lets create the body of the post 
*/ 

NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
NSString *filename = @"file"; 
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\";filename=\"%@\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]]; 
// NSLog([NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\";filename=\"%@\"\r\n", filename]); 
//[body appendData:[[NSString stringWithString:@"test"] dataUsingEncoding:NSUTF8StringEncoding]]; 
//[body appendData:[[NSString stringWithString:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[NSData dataWithData:data]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
// setting the body of the post to the reqeust 
[request setHTTPBody:body]; 

// now lets make the connection to the web 
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
NSLog(@"Return : %@", returnString); 

разработчик РНР говорит, что он не получает никаких данных вообще. И он повторил все, что получил, но я нахожу строку Null в ответ. Кто-нибудь может предложить, что делать?

+0

может быть, это поможет вам http://stackoverflow.com/questions/16195460/how-to-get-nsdata-of-mp3-using-mpmediapickercontroller – Rajneesh071

+1

Спасибо Rajneesh bu t Я получаю значение NSData. Я не могу загрузить его на сервер. – ScarletWitch

+0

вам нужно преобразовать NSData в base64 endoding и сказал, что ваш разработчик на стороне сервера использует декодирование base64 .. – Rajneesh071

ответ

-1

Это, как я это делаю

NSData *audioData = Here comes your NSData; 
NSString *urlString = @"The url of php file"; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

NSString *boundary = @"---------------------------14737809831466499882746641449"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
[request addValue:contentType forHTTPHeaderField:@"Content-Type"]; 

NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\".caf\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[NSData dataWithData:audioData]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setHTTPBody:body]; 

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSLog(@"Length : %d", returnData.length); 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
NSLog(@"Return String %@", returnString); 

Там другой путь через ASIHTTPRequest

NSURL *url = [NSURL URLWithString:@"the url comes here"]; 
ASIFormDataRequest *formRequest = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease]; 

NSData *imageData = UIImageJPEGRepresentation([self scaleAndRotateImage:self.m_ImageViewProfile.image], 90); 

NSLog(@"Size : %d", imageData.length); 

[formRequest setTimeOutSeconds:600]; 
[formRequest setPostValue:@"If there is any"] forKey:@"the key"]; 
[formRequest setData:imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"filename"]; 

//[formRequest setUploadProgressDelegate:progressView]; 

[formRequest setCompletionBlock:^{ 
    NSString *responseString = [formRequest responseString]; 
    NSLog(@"Response: %@", responseString); 
}]; 
[formRequest setFailedBlock:^{ 
    NSError *error = [formRequest error]; 
    NSLog(@"Error: %@", error.localizedDescription); 
}]; 

[formRequest startSynchronous]; 

Смотрите, если это то, что вы хотите

+0

Это полезно при публикации нескольких потоков данных. Когда вы просто отправляете один простой файл, вероятно, проще пропустить многостраничный заголовок (в зависимости от того, как он работает на стороне PHP, я не знаю, как я застрял в мире Python/Django :)) – Krumelur

+0

Спасибо @Krumelur за Информация – channi