【问题标题】:node.js / Youtube API / Uploadnode.js / Youtube API / 上传
【发布时间】:2011-11-14 03:46:31
【问题描述】:

我想使用以下代码通过direct upload 上传视频 youtube。我已经有了访问令牌(auth_key)。我很确定我发送的帖子数据不正确...

function upload(auth_key, devKey, callback){

    fs.readFile('test.mp4', function(err, movie){

        var boundary = randomString();

        var xml =
            '<?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">Bad Wedding Toast</media:title>' +
            '<media:description type="plain">I gave a bad toast at my friends wedding.</media:description>' +
            '<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>' +
            '<media:keywords>toast, wedding</media:keywords>' + 
            '</media:group>' + 
            '</entry>'
        ;

        var post_data = 
            '--' + boundary + '\n' +
            'Content-Type: application/atom+xml; charset=UTF-8' + '\n' +
            xml + '\n' +
            '--' + boundary + '\n' +
            'Content-Type: video/mp4' + '\n' +
            'Content-Transfer-Encoding: binary' + '\n' +
            movie + '\n' +
            '--' + boundary + '--' + '\n'
        ;   

        var options = {
          host: 'uploads.gdata.youtube.com',
          port: 443,
          path: '/feeds/api/users/default/uploads',
          method: 'POST',
            headers: {
                'Authorization:': 'GoogleLogin auth=' + auth_key,
                'GData-Version': '2',
                'X-GData-Key': 'key=' + devKey,
                'Slug': 'test.mp4',
                'Content-Type': 'multipart/related; boundary="' + boundary + '"',
                'Content-Length': post_data.length,
                'Connection': 'close'
            }
        }

        var req = https.request(options, function(res) {
            var response = '';
          res.on('data', function(chunk) {
                response += chunk;
          });
            res.on('end', function(){
                callback(response);
            });
        });

        if(post_data){
            req.write(post_data);
        }

        req.end();

        req.on('error', function(e) {
          console.error(e);
        });

    });

}

是否因“无效请求”而失败?

【问题讨论】:

    标签: node.js upload youtube-api


    【解决方案1】:

    您的代码中有一些错误,html 请求的语法缺少“\r\n”。您还应该使用 http 库和端口 80。您的 Authorization 标头无效,最后不应包含“:”。而且我认为您添加数据和计算内容长度的方式也会使事情变得混乱。

    我已使用以下代码成功将视频上传到 youtube:

    var file_reader = fs.createReadStream(file_path, {encoding: 'binary'});
    var file_contents = '';
    file_reader.on('data', function(data)
    {
        file_contents += data;
    });
    file_reader.on('end', function()
    {
        var xml =
            '<?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">' + title + '</media:title>' +
            '       <media:description type="plain">' + description + '</media:description>' +
            '       <media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">' + category + '</media:category>' +
            '       <media:keywords>' + keywords + '</media:keywords>' + 
            '   </media:group>' + 
            '</entry>';
    
        var boundary = Math.random();
        var post_data = [];
        var part = '';
    
        part = "--" + boundary + "\r\nContent-Type: application/atom+xml; charset=UTF-8\r\n\r\n" + xml + "\r\n";
        post_data.push(new Buffer(part, "utf8"));
    
        part = "--" + boundary + "\r\nContent-Type: video/mp4\r\nContent-Transfer-Encoding: binary\r\n\r\n";
        post_data.push(new Buffer(part, 'ascii'));
        post_data.push(new Buffer(file_contents, 'binary'));
        post_data.push(new Buffer("\r\n--" + boundary + "--"), 'ascii');
    
        var post_length = 0;
        for(var i = 0; i < post_data.length; i++)
        {
            post_length += post_data[i].length;
        }
    
        var options = {
          host: 'uploads.gdata.youtube.com',
          port: 80,
          path: '/feeds/api/users/default/uploads?alt=json',
          method: 'POST',
            headers: {
                'Authorization': 'GoogleLogin auth=' + auth_key,
                'GData-Version': '2',
                'X-GData-Key': 'key=' + exports.developer_key,
                'Slug': 'video.mp4',
                'Content-Type': 'multipart/related; boundary="' + boundary + '"',
                'Content-Length': post_length,
                'Connection': 'close'
            }
        }
    
        var req = http.request(options, function(res)
        {
            res.setEncoding('utf8');
    
            var response = '';
            res.on('data', function(chunk)
            {
                response += chunk;
            });
            res.on('end', function()
            {
                console.log(response);
                response = JSON.parse(response);
    
                callback(response);
            });
        });
    
        for (var i = 0; i < post_data.length; i++)
        {
            req.write(post_data[i]);
        }
    
        req.on('error', function(e) {
          console.error(e);
        });
    
        req.end();
    });
    

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 2017-03-19
      • 1970-01-01
      • 2016-06-22
      • 2012-10-12
      • 2017-04-02
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多