2012-03-09 12 views
4

Objective-CとYouTube APIを使用して動画をアップロードしようとしていますが、動作していないため、最後の手順でエラーが返されます。エラーは「ユーザー認証が必要です」と表示されます。iOS YouTube動画アップロードエラー

私はこれに続きますAPI document特にメタデータのないものです。 ClientLogin API

NSLogで認証トークンを確認しましたが、そこにあります。アップロードAPIもアップロードURLを返しますが、取得したアップロードURLに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; 
    } 
} 

答えて

関連する問題