在Objective-C中使用HTTP POST上传音频文件

时间:2011-01-12 22:56:30

标签: iphone objective-c ios4

HI,

我一直在尝试使用HTTP POST方法将音频文件(sample.wav)上传到我的服务器,方法是实现以下代码。连接到服务器没有错误,但文件没有上传。我花了几个小时为此找到解决方案,但还没找到。这是我用来完成任务的代码。

     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"wav"];

    // NSLog(@"filePath : %@", filePath);



     NSData *postData = [[NSData alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath]];

     NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

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



     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

     [request setHTTPMethod:@"POST"];

     [request setURL:[NSURL URLWithString:@"http://exampleserver.com/upload.php"]];



     NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];

     NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];

     [request addValue:contentType forHTTPHeaderField: @"Content-Type"];



     [request setValue:postLength forHTTPHeaderField:@"Content-Length"];



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

     [request setHTTPBody:postData];

     [request setTimeoutInterval:30.0];



     NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];



     if (conn)

     {

        receivedData = [[NSMutableData data] retain];

     } else {

        NSLog(@"Connection Failed");

     }



     //[request release];

然后我使用NSURLConnection的委托方法从我的服务器获取响应。它确实尝试连接到服务器但没有响应。有人可以帮我解决这个问题。这里也是我用来通过简单的网络浏览器上传的简单HTML代码。

<form action="http://exampleserver.com/upload.php" method="post" name="adminForm" id="adminForm" enctype="multipart/form-data"  >



                        <input type="file"  name="filename" />

在这种情况下,最后我们必须传递输入字段的名称,即“filename”。我不知道如何在目标c中传递这个。所以请有人指出我正确的方向。任何形式的帮助将不胜感激。

的问候,

尔斯兰

1 个答案:

答案 0 :(得分:3)

您缺少HTTP编码中的一些位。您不能只追加文件数据。

您的HTTP正文应包含:

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", @"your file name"];

[postData appendData:[contentDisposition dataUsingEncoding:NSUTF8StringEncoding]];

[postData appendData:[NSData dataWithContentsOfFile:@"your file path"];
NSString *endItemBoundary = [NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary];

[postData appendData:[endItemBoundary dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postData];

使用该代码,您将更接近HTTP服务器所期望的内容。为了完成你的工作,你可以考虑使用Wireshark来区分哪些字节通过你的代码和你的字节传输。

HTTP编码很难在你自己的代码上实现。您可以删除此代码并使用更高级别的库,例如GTMHTTFetcher或ASIHTTPRequest。

希望这有帮助