代码之家  ›  专栏  ›  技术社区  ›  johnny

使用Lambda(节点)将图像从SFTP复制到S3

  •  1
  • johnny  · 技术社区  · 7 年前

    我正在使用“ssh2 sftp客户端”来完成这项工作。所以基本上,如果我先将文件复制到Lambda的/tmp/folder,然后将其上载到s3,它就可以正常工作了。我想将读取流指向s3,而不保存在lambda/tmp/文件夹中。

    所以基本上:

    let sftp = new Client();
    sftp.connect({
        host: Config.host,
        port: Config.port,
        username: Config.user,
        password: Config.password
    }).then(() => {
        return sftp.list('/photos');
    }).then((files) => {
        return get(files)
    }).then((streams) => {
         return streamToString(streams)
    }).then((dataArray) => {
        return uploadToS3.putBatch(Config,dataArray)
    }).then(() => {
        return cleanSFTP();
    }).then(() => {
        context.done();
    }).catch((err) => {
        console.log('Catch Error: ', err);
        context.fail();
    });
    

    从sftp获取readstream:

      function get(files) {
            return Promise.all(files.slice(0, 2).map((file) => {
                fileList.push(file.name);
                return sftp.get(BASIC_URL + '/' + file.name);
            }));
        }
    

    流到字符串:

     var streamToArray = require('stream-to-array')
    module.exports = function (fileStreams) {
      return Promise.all(fileStreams.map((file) => {
        return fileToArray(file)
      }))
    }
    
    
    function fileToArray(fileStream) {
      return streamToArray(fileStream)
        .then((fileArray) => {
          return {data: fileArray, key: fileStream.path}
        })
        .catch((err) => {
          return err
        })
    }
    

    上传到s3:

    var AWS = require('aws-sdk')
    AWS.config.setPromisesDependency(require('bluebird'));
    
    function putBatch(config, files) {
    
      var s3 = new AWS.S3();
      // Make all the putObject calls immediately
      // Will return rejected promise if any requests fail
      return Promise.all(files.map((file) => {
        if (typeof file.key && file.data !== undefined) {
          var params = {
            Bucket: config.bucket,
            Key: "preix/" + file.key,
            Body: file.data
          };
          return s3.putObject(params).promise()
        }
      }));
    };
    

    使用此选项,图像将被复制到s3,但它们的大小与sftp中的不同,并且无法预览图像。

    知道吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Kannaiyan    7 年前

    我使用了s3 sftp桥,它可以无缝工作。

    https://github.com/gilt/s3-sftp-bridge

    只需要s3位置和sftp位置加上凭据,它就会自动同步。

    希望有帮助。