1

iOSアプリケーションを開発しています。プログラムでオーディオファイルをサーバーに送信する必要があります。次のコードを使用して、サンプルのwavオーディオファイルをサーバーに送信しています。私たちのサーバーは、受信用に署名されたバイト配列形式のオーディオファイルのみを受け入れます。

NSURL *urlPath = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"Crash" ofType:@"wav"]];
NSString *wavbundlepath = [urlPath absoluteString];
NSLog(@"wavbundlepath: %@",wavbundlepath);
NSData *bytes = [wavbundlepath dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"bytes: %@",bytes);

NSString *recordPostLength = [NSString stringWithFormat:@"%d", [bytes length]];

NSMutableString *urlstr = [NSMutableString stringWithFormat:@"%@", @"http://www.mywebserver/api/UploadFile?Name="];
[urlstr appendString:@"crash"];
[urlstr appendFormat:@"&MemberID=%d", 0];
[urlstr appendFormat:@"&Type=%@",@"Recording"];
[urlstr appendFormat:@"&client=%@",@"ios"];
NSLog(@"urlstr.......%@",urlstr);

NSMutableURLRequest *recordRequest = [[NSMutableURLRequest alloc] init] ;
[recordRequest setURL:[NSURL URLWithString:urlstr]];
[recordRequest setHTTPMethod:@"POST"];
[recordRequest setValue:recordPostLength forHTTPHeaderField:@"Content-Length"];
[recordRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[recordRequest setHTTPBody:bytes];

NSURLResponse *recordResponse;
NSError *recordError;
NSData *recordResponseData = [NSURLConnection sendSynchronousRequest:recordRequest returningResponse:&recordResponse error:&recordError];
NSString *recordResp = [[NSString alloc]initWithData:recordResponseData encoding:NSUTF8StringEncoding];

NSLog(@"recordResp:%@", recordResp);

しかし、問題は、常に「入力文字列が正しくない」ということです。応答エラー。

サーバーにオーディオバイトをアップロードすることについてはあまり気づいていません。誰かがこのコードをチェックして、これがwavオーディオバイト配列をサーバーにアップロードするための有効なコードであるかどうかを教えてもらえますか?

ありがとうございました。


更新されたコード

サーバーサイドエンジニアが本文に他のものはないように言ったので、以下のコードを試しましたが、正常に動作し、肯定的な応答が得られました。しかし、サーバー側はバイトの配列または署名されたバイトのデータ形式のみを受信するように実装されているため、サーバーは私が送信している形式のNSDataバイト(32ビット要素)を処理できません。

NSURL *urlPath = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"Temp" ofType:@"wav"]];

NSString *wavbundlepath = [urlPath absoluteString];
NSLog(@"wavbundlepath: %@",wavbundlepath);

NSData *bytes=[NSData dataWithContentsOfURL:urlPath];
NSLog(@"bytes: %@",bytes);

NSString *recordPostLength = [NSString stringWithFormat:@"%d", [bytes length]];

NSMutableString *urlstr = [NSMutableString stringWithFormat:@"%@", @"http://www.myserver.com/api/UploadFile?Name="];
[urlstr appendString:@"Temp"];
[urlstr appendFormat:@"&MemberID=%d", 0];
[urlstr appendFormat:@"&Type=%@",@"Recording"];
[urlstr appendFormat:@"&client=%@",@"ios"];
NSLog(@"urlstr.......%@",urlstr);

NSMutableURLRequest *recordRequest = [[NSMutableURLRequest alloc] init] ;
[recordRequest setURL:[NSURL URLWithString:urlstr]];

NSInputStream *dataStream = [NSInputStream inputStreamWithData:bytes];
[recordRequest setHTTPBodyStream:dataStream];

[recordRequest setHTTPMethod:@"POST"];

NSURLResponse *recordResponse;
NSError *recordError;
NSData *recordResponseData = [NSURLConnection sendSynchronousRequest:recordRequest returningResponse:&recordResponse error:&recordError];

NSString *recordResp = [[NSString alloc]initWithData:recordResponseData encoding:NSUTF8StringEncoding];
NSLog(@"recordResp:%@", recordResp);
recordResponceJson = [recordResp JSONValue]; 
NSLog(@"recordResponceJson = %@",recordResponceJson);
recId = [recordResponceJson valueForKey:@"ID"];
NSLog(@"recId....%@", recId);

誰かが私を案内してくれませんか、このhttp投稿でバイトの配列を送信するにはどうすればよいですか?

4

1 に答える 1

0

いくつかの問題があります: まず、ファイルを読み取っている方法では、有効な WAV ファイルが返されません:

[NSData dataWithContentsOfURL:] を使用してバイトを読み取る必要があります。あなたがそれらを読んでいる方法では、バイトを文字に変換しようとします。これにより、wav ファイルが破損します。

次に、POST 本文の content-type が間違っている可能性があります。次の行を参照してください。

[recordRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

オーディオ バイトは、x-www-form-urlencoded 形式ではエンコードされません。サーバーが audio/wav または application/octet-stream コンテンツ タイプを受け入れる可能性が高くなります。サーバー開発者に確認して、サーバーが何を期待しているかを正確に確認してください。

また、setHTTPBodyStream: と呼ばれる NSMutableURLRequest メソッドを確認することもできます。これにより、ファイル全体をメモリにロードすることなくファイルを送信できます。

于 2012-06-02T13:04:37.087 に答える