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中传递这个。所以请有人指出我正确的方向。任何形式的帮助将不胜感激。
的问候,
尔斯兰
答案 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。
希望这有帮助