使用AFNetworking 2.0对数据进行PUT请求

时间:2013-11-27 07:20:05

标签: ios objective-c http put afnetworking-2

我想使用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];

有人有另一个解决方案吗?

1 个答案:

答案 0 :(得分:0)

您的方法有以下问题:

  1. PUT方法不是上传文件的建议方法。 PUT 可以使用,但这要求服务器必须在指定的 URI上创建资源。但是,在大多数情况下,服务器将在服务器上本地保存上载的文件时创建新的URI(客户端不知道)。在这种情况下,必须使用POST方法。

  2. 您正在使用代表文件内容的NSData对象,并使用setHTTPBody为其分配请求。当文件 large NSData对象使用堆分配的缓冲区来保存文件的内容时,这对系统内存有问题。您应该使用使用内存映射文件的NSData对象或NSStream来表示文件内容。

  3. 您对请求标头过于模糊:

    `[request setAllHTTPHeaderFields:headersDict];`
    

    请求标头很重要。您应该设置Content-Type和Content-Length标题。

  4. 对于“基于表单的文件上载”,另请参阅RFC 1867