我想使用PUT请求上传视频,这是我的经验。
我正在尝试使用AFNetworking 2.0进行PUT请求的许多可能性,但一切都失败了。
但是我解决了这个问题,而这个“问题”是所有正在寻求解决方案的人的信息。
这对我有用:
NSDictionary *headersDict = @{@"Content-Length": [NSString stringWithFormat:@"%@", mySize], @"Content-Type": @"video/mp4", @"Accept": @"application/json", @"Authorization": [NSString stringWithFormat:@"Basic %@", hash]};
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlToPut];
[request setHTTPMethod:@"PUT"];
[request setHTTPBody:videoData];
[request setAllHTTPHeaderFields:headersDict];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
// if everything run great, we have to invalidate timer to notify
[uploadTimer invalidate];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error: %@", error);
}];
// start timer where app will be checking upload progres on the server
uploadTimer = [NSTimer scheduledTimerWithTimeInterval:.1
target:self
selector:@selector(checkUploadProgressForRecord:)
userInfo:record
repeats:YES];
[operation start];
有人有另一个解决方案吗?
答案 0 :(得分:0)
您的方法有以下问题:
PUT方法不是上传文件的建议方法。 PUT 可以使用,但这要求服务器必须在指定的 URI上创建资源。但是,在大多数情况下,服务器将在服务器上本地保存上载的文件时创建新的URI(客户端不知道)。在这种情况下,必须使用POST方法。
您正在使用代表文件内容的NSData
对象,并使用setHTTPBody
为其分配请求。当文件 large 且NSData
对象使用堆分配的缓冲区来保存文件的内容时,这对系统内存有问题。您应该使用使用内存映射文件的NSData
对象或NSStream
来表示文件内容。
您对请求标头过于模糊:
`[request setAllHTTPHeaderFields:headersDict];`
请求标头很重要。您应该设置Content-Type和Content-Length标题。
对于“基于表单的文件上载”,另请参阅RFC 1867。