使用NSURLRequest上传Youtube视频



我正在尝试使用NSURLRequest将视频上传到youtube。我能够进行身份验证,并且用户和视频也被上传,当检查时它说失败(无法转换视频文件)我没有得到该怎么做,请

构造请求

Authorization = "Bearer ya29.AHES6ZTQ3rJZaf2g3pIYa_7_myg1N_GvQ4VdmJIcapfoqKIfQf-Iow";
Connection = close;
"Content-Length" = 1848078;
"Content-Type" = "multipart/related; boundary=217NH17UDP";
"GData-Version" = 2;
Host = "uploads.gdata.youtube.com";
Slug = "videoFile.mp4";
"X-GData-Key" = "key=AI39si4b-ta8ku-hbsLt73O0rIlOBjpHbITt8WGrwL7OevwjNjl5EFcowlJlBM6kp3rrU1cw64Vobp1l1lJP31Rqavshl4962A";
--217NH17UDP
Content-Type: application/atom+xml; charset=UTF-8
<?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">Sample Video File</media:title>
    <media:description type="plain">
        Description of the sample video
    </media:description>
    <media:category
        scheme="http://gdata.youtube.com/schemas/2007/categories.cat">Music
    </media:category>
    <media:keywords>Keywords</media:keywords>
</media:group>
</entry>
--217NH17UDP
Content-Type: video/mp4
Content-Transfer-Encoding: binary
Video data (NSData)
--217NH17UDP--

如"https://developers.google.com/youtube/2.0/developers_guide_protocol_direct_uploading#Direct_uploading"中所述,

请建议...

您可能

希望将content_type设置为视频/*

只有当您完全按照指定的方式实现请求时,它才能正常工作(即使是单个空格也很重要)

终于可以上传视频了,这里是200%的工作代码。

NSString* const kMetaData = @"<?xml version="1.0"?>rn<entry xmlns="http://www.w3.org/2005/Atom"rnxmlns:media="http://search.yahoo.com/mrss/"rnxmlns:yt="http://gdata.youtube.com/schemas/2007">rn<media:group>rn<media:title type="plain">%@</media:title>rn<media:description type="plain">rn%@rn</media:description>rn<media:categoryrnscheme="http://gdata.youtube.com/schemas/2007/categories.cat">%@rn</media:category>rn<media:keywords>%@</media:keywords>rn</media:group>rn</entry>rn";

- (void)uploadVideo:(NSString *)videoFilePath videoInfo:(NSDictionary*)inVideoInfo
{
    NSData* videoData = [NSData dataWithContentsOfFile:videoFilePath];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:kVideoUploadURL]];
    request.HTTPMethod = @"POST";
    //header values
    [request setValue:kHostHeaderFiels_Upload_Value forHTTPHeaderField:kHostHeaderField_Key];
    [request setValue:[NSString stringWithFormat:@"%@ %@", self.tokenType, self.accessToken] forHTTPHeaderField:kAuthorizationHeaderField_Key];
    [request setValue:@"2" forHTTPHeaderField:kGdataVersionHeaderField_Key];
    [request setValue:videoFilePath.lastPathComponent forHTTPHeaderField:kSlugHeaderField_key];
    [request setValue:[NSString stringWithFormat:kContentTypeHeaderField_Upload_Value, kBoundary_Value] forHTTPHeaderField:kContentTypeHeaderField_Key];
    [request setValue:kConnectionHeaderField_Value forHTTPHeaderField:kConnectionHeaderField_Key];
    [request setValue:kGdataKeyHeaderField_Value forHTTPHeaderField:kGdataKeyHeaderField_Key];
    //Post Data
    NSMutableData* httpBodyData = [NSMutableData data];
    [httpBodyData appendData:[[NSString stringWithFormat:@"--%@rn", kBoundary_Value] dataUsingEncoding:NSUTF8StringEncoding]];
    [httpBodyData appendData:[@"Content-Type: application/atom+xml; charset=UTF-8rnrn" dataUsingEncoding:NSUTF8StringEncoding]];
    NSString *title, *descrition, *keywords, *category;
    title = [inVideoInfo objectForKey:kVideoTitle];
    descrition = [inVideoInfo objectForKey:kVideoDescription];
    keywords = [inVideoInfo objectForKey:kVideoKeywords];
    category = [inVideoInfo objectForKey:kVideoCategory];
    NSString* metaData = kMetaData;
    metaData = [NSString stringWithFormat:metaData, title, descrition, category, keywords];
    [httpBodyData appendData:[metaData dataUsingEncoding:NSUTF8StringEncoding]]; //Meta Data
    [httpBodyData appendData:[[NSString stringWithFormat:@"--%@rn", kBoundary_Value] dataUsingEncoding:NSUTF8StringEncoding]]; //boundary string
    [httpBodyData appendData:[[NSString stringWithFormat:@"Content-Type: video/%@rn", videoFilePath.pathExtension] dataUsingEncoding:NSUTF8StringEncoding]];
    [httpBodyData appendData:[@"Content-Transfer-Encoding: binaryrnrn" dataUsingEncoding:NSUTF8StringEncoding]];
    [httpBodyData appendData:videoData];
    [httpBodyData appendData:[[NSString stringWithFormat:@"rn--%@--rn", kBoundary_Value] dataUsingEncoding:NSUTF8StringEncoding]];
    [request setValue:[NSString stringWithFormat:@"%u", httpBodyData.length] forHTTPHeaderField:kContentLengthHeaderField_Key];
    request.HTTPBody = httpBodyData;
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue new]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                               if(connectionError || data == nil)
                               {
                                   self.uploadHandler(NO, nil);
                               }
                               else
                               {
                                   NSXMLParser *xmlparser = [[NSXMLParser alloc] initWithData:data];
                                   xmlparser.delegate = self;
                                   [xmlparser parse];
                               }
                           }];
}

相关内容

  • 没有找到相关文章

最新更新