2016-05-17 2 views
3

Я пытаюсь написать сценарий лямбды, который может вытащить изображение с сайта и сохранить его на S3. Проблема, с которой я сталкиваюсь, - это какой объект передать в качестве атрибута Body в метод S3.putObject. В документации here говорится, что она должна быть либо new Buffer('...') || 'STRING_VALUE' || streamObject, но я не уверен, как преобразовать ответ https в один из них. Вот то, что я пробовал:aws lambda Как сохранить изображение, полученное через https в S3

var AWS = require('aws-sdk'); 
var https = require('https'); 
var Readable = require('stream').Readable; 
var s3 = new AWS.S3(); 
var fs = require('fs'); 

var url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/AmazonWebservices_Logo.svg/500px-AmazonWebservices_Logo.svg.png'; 

exports.handler = function(event, context) { 
    https.get(url, function(response) { 
    var params = { 
    Bucket: 'example', 
    Key: 'aws-logo.png', 
    Body: response // fs.createReadStream(response); doesn't work, arg should be a path to a file... 
        // just putting response errors out with "Cannot determine length of [object Object]" 
    }; 

    s3.putObject(params, function(err, data) { 
     if (err) { 
     console.error(err, err.stack); 
     } else { 
     console.log(data); 
     } 
    }); 
    }); 
}; 
+0

Пожалуйста, обратитесь к http://stackoverflow.com/questions/19016130/pushing-binary-data-to -amazon-s3-using-node-js – Shibashis

+0

Если я не ошибаюсь, похоже, что в этом примере скрипт запускается на локальной машине, они используют curl для сохранения файла на диск, а затем создают поток с указанием пути к этому сохраненному файлу. Поскольку я на лямбде, я не могу сохранить файл на диск – kleaver

+0

«Так как я на лямбде, я не могу сохранить файл на диск». Это неправильно. У вас есть свободное место на Lambda для временного хранения файлов. –

ответ

3

Как указано в комментариях, Lambda позволяет сохранять файлы в /tmp. Но вам это действительно не нужно ...

response не содержит содержимого файла, а HTTP-ответ (с его кодом состояния и заголовками).

Вы могли бы попробовать что-то вроде этого:

var AWS = require('aws-sdk'); 
var https = require('https'); 
var s3 = new AWS.S3(); 

var url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/AmazonWebservices_Logo.svg/500px-AmazonWebservices_Logo.svg.png'; 

exports.handler = function(event, context) { 
    https.get(url, function(res) { 
    var body = ''; 
    res.on('data', function(chunk) { 
     // Agregates chunks 
     body += chunk; 
    }); 
    res.on('end', function() { 
     // Once you received all chunks, send to S3 
     var params = { 
     Bucket: 'example', 
     Key: 'aws-logo.png', 
     Body: body 
     }; 
     s3.putObject(params, function(err, data) { 
     if (err) { 
      console.error(err, err.stack); 
     } else { 
      console.log(data); 
     } 
     }); 
    }); 
    }); 
}; 
+0

только для записи «s3» здесь не определено, мне пришлось добавить:'' 'var s3 = new AWS.S3();' '' –

+0

@EliAlbert Ответ обновлен :) –

3

попробовать этот пакет https://www.npmjs.com/package/request

var request = require('request'); 

exports.handler = function (event, context) { 
    s3.putObject({ 
     Bucket: 'example', 
     Key: 'aws-logo.png', 
     Body: request.get(url, {followRedirect: false}) 
    }, function (err, data) { 
     if (err) console.error(err, err.stack); 
     else console.log(data); 
    }) 
} 
+0

Это будет работать нормально, но ' request' не находится в основном узле, поэтому я выбрал @ alexis-no answer, потому что не требовал загрузки этого дополнительного модуля – kleaver

Смежные вопросы