2016-04-28 17 views
1

我从S3下载对象,并创建从中读取流对象来处理视频:获得S3对象元数据创建流

s3.getObject(params).createReadStream() 

不过,我需要从中获得的元数据是如果可能,我只是通过访问其“元数据”属性获取对象:

s3.getObject() 

我将如何之一:

  1. 通过s3.getObject()获取对象,从其元数据属性中获取元数据,然后将其转换为读取流?

    var stream = fs.createReadStream(response);不工作 - 输入必须是字符串

- 或 -

  • 获取经由s3.getObject().createReadStream()该流,并提取来自流的元数据?

    据我所知,元数据不在流内传递。


  • 告诉我,如果我的假设是错误的,但我目前坚持这两个需求:

    • 获取元数据
    • 使其成为一个流
    +0

    你找到解决办法的对象?如果是,请分享一下吗? – YakirNa

    回答

    0

    所以我找到了解决方案。这适用于大多数10 MB以下的文件。如果它们大于缓冲流在文件完成写入之前结束。我试图把bufferStream.end内完成对功能,但后来我回电话犯规经历....

    function download(s3Event, srcKey, cb){ 
    
        console.log('Starting download'); 
    
        s3.getObject({ 
         Bucket: s3Event.bucket.name, 
         Key: srcKey 
        }, cb); 
    } 
    
    
    
    function writeToFile(data, cb){ 
    
        var dlFile = path.join(tempDir, 'download'); 
    
        console.log('data = ', data); 
        console.log('data.Body = ', data.Body); 
        var stream = bufferStream.pipe(fs.createWriteStream(dlFile)).on('finish', function() { 
        console.log('finished writing stream'); 
        cb(null, data); 
        }); 
    
        bufferStream.end(data.Body); 
    } 
    
    
    exports.handler = function(event, context) { 
    
    // Read options from the event. 
    
    console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); 
    
    var s3Event = event.Records[0].s3; 
    var srcKey = decodeURIComponent(s3Event.object.key); 
    var keyPrefix = srcKey.replace(/\.[^/.]+$/, '');   
    var dstBucket = "jump-lambda"; 
    
    
    async.waterfall([ 
    
        function (cb){ 
         download(s3Event, srcKey, cb); 
        }, 
    
        function (data, cb){ 
         writeToFile(data, cb); 
        }, 
    
        function (data, cb){ 
         fluentffmpegProcess(data, cb); 
        }, 
    
        function (data, cb){ 
         transform(data, cb); 
        }, 
    
        function (data, buffer, cb){ 
         thumbnailUpload(data, buffer, dstBucket, keyPrefix, cb); 
        }, 
    
        function (data, cb){ 
         updateParse(data, srcKey, keyPrefix, cb); 
        }, 
    
    ], 
    
        function (err) { 
         if (err) { 
          console.error(
           'Unable to convert video to scene object, with error code: ' + err.description 
          ); 
         } else { 
          console.log(
           'Successfully created scene object, updated venue, and created thumbnail' 
          ); 
         } 
        } 
    ); 
    }; 
    
    0

    你可以通过请求的httpHeaders事件的元数据。

    let fs = require('fs') 
    let aws = require('aws-sdk') 
    let s3 = new aws.S3() 
    
    let request = s3.getObject({ 
        Bucket: 'my-bucket', 
        Key: 'my-key' 
    }) 
    
    let stream 
    
    request.on('httpHeaders', (statusCode, httpHeaders) => { 
        // object metadata is represented by any header in httpHeaders starting with 'x-amz-meta-' 
        // you can use the stream object that this point 
        stream.pipe(fs.createWriteStream('./somepath')) 
        stream.on('end',() => { 
         console.log('were done') 
        }) 
    }) 
    
    stream = request.createReadStream() 
    

    另外,您也可以拨打s3.headObject获得元数据,而无需下载对象,然后下载使用s3.getObject