iOS YouTube视频上传错误

时间:2012-03-09 09:52:58

标签: objective-c ios youtube

我正在尝试使用Objective-C和YouTube API上传视频,但它无法正常工作并在最后一步返回错误。该错误显示“需要用户身份验证”。

我正在关注这个API document,特别是没有元数据的那个。我获得了ClientLogin API

的身份验证令牌

我用NSLog检查了身份验证令牌,它就在那里。我看到上传API也会返回上传网址,但是当我向检索到的上传网址发送HTTP PUT请求时,它会返回上面提到的错误。

这是上传代码

- (bool) upload:(NSString *)file {
    NSData *fileData = [NSData dataWithContentsOfFile:file];

    NSURL *url = [NSURL URLWithString:self.UploadURL];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setHTTPMethod:@"PUT"];
    [request setValue:@"Content-Type" forHTTPHeaderField:@"application/octet-stream"];
    [request setValue:@"Content-Length" forHTTPHeaderField:[NSString stringWithFormat:@"%ud", [fileData length]]];
    [request setHTTPBody:fileData];

    NSError *requestError;
    NSURLResponse *urlResponse = nil;

    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError];

    NSLog(@"%@", [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]);

    if (response == nil) {
        return NO;
    } else {
        return YES;
    }
}

我也尝试过直接上传方法,但这总是给我无效请求错误。以下是代码。

- (bool) directUpload:(NSString *)file {
    NSString *title = [file lastPathComponent];
    NSString *desc = @"This is test video.";
    NSString *category = @"People";
    NSString *keywords = @"video";

    NSString *boundary = @"--qwerty";

    NSString *xml = [NSString stringWithFormat:
                     @"<?xml version=\"1.0\"?>"
                     @"<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:media=\"http://search.yahoo.com/mrss/\" xmlns:yt=\"http://gdata.youtube.com/schemas/2007\">"
                     @"<media:group>"
                     @"<media:title type=\"plain\">%@</media:title>"
                     @"<media:description type=\"plain\">%@</media:description>"
                     @"<media:category scheme=\"http://gdata.youtube.com/schemas/2007/categories.cat\">%@</media:category>"
                     @"<media:keywords>%@</media:keywords>"
                     @"</media:group>"
                     @"</entry>", title, desc, category, keywords];

    NSData *fileData = [NSData dataWithContentsOfFile:file];

    NSMutableData *postBody = [NSMutableData data];
    [postBody appendData:[[NSString stringWithFormat:@"%@\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"Content-Type: application/atom+xml; charset=UTF-8\n\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[xml dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"%@\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"Content-Type: video/mp4\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"Content-Transfer-Encoding: binary\n\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:fileData];
    [postBody appendData:[[NSString stringWithFormat:@"%@", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    NSURL *url = [NSURL URLWithString:@"http://uploads.gdata.youtube.com/feeds/api/users/default/uploads"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setHTTPMethod:@"POST"];
    [request setValue:[NSString stringWithFormat:@"GoogleLogin auth=\"%@\"", self.AuthToken] forHTTPHeaderField:@"Authorization"];
    [request setValue:@"2" forHTTPHeaderField:@"GData-Version"];
    [request setValue:[NSString stringWithFormat:@"key=%@", self.DeveloperKey] forHTTPHeaderField:@"X-GData-Key"];
    [request setValue:[file lastPathComponent] forHTTPHeaderField:@"Slug"];
    [request setValue:[NSString stringWithFormat:@"multipart/related; boundary=\"%@\"", boundary] forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%ud", [postBody length]] forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"close" forHTTPHeaderField:@"Connection"];
    [request setHTTPBody:postBody];

    NSError *requestError;
    NSURLResponse *urlResponse = nil;

    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError];

    NSLog(@"%@", [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]);

    if (response == nil) {
        return NO;
    } else {
        return YES;
    }
}