首页 > 解决方案 > 如何在 lambda 中使用 S3 存储桶签名 URL 读取 excel 数据?

问题描述

我有一个文件存储在 s3 存储桶中并编写了 lambda 函数来给我们签名的 URL,然后尝试使用 xlsx 从签名的 URL 中读取数据。但是它不起作用,下面是代码:

exports.handler = (event, context, callback) => {
var params = {
  Bucket: "abc", 
  Key: "xyz.xls"
};
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
var url = s3.getSignedUrl('getObject', params, function(err,data){
  if(err){
    console.log(err, err.stack);
    callback(err,null);
  }else{
    var XLSX = require('xlsx')
    var workbook = XLSX.readFile(data);
    var sheet_name_list = workbook.SheetNames;
    var xlData = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[2]]);  
    var res = {
        statusCode:200,
        body:JSON.stringify(xlData)
    }
    callback(null,res);
  }
});
};

它无法读取文件。找不到文件错误它甚至会在浏览器中引发相同的 URL 炒锅。谢谢

标签: javascriptnode.jsamazon-web-servicesamazon-s3aws-lambda

解决方案


看起来你需要这样的东西:

var XLSX = require('xlsx'), request = require('request');
request(url, {encoding: null}, function(err, res, data) {
    if(err || res.statusCode !== 200) {
        callback(err,null);
        return;
    }

    /* data is a node Buffer that can be passed to XLSX.read */
    var workbook = XLSX.read(data, {type:'buffer'});
    var sheet_name_list = workbook.SheetNames;
    var xlData = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[2]]);  
    var res = {
        statusCode:200,
        body:JSON.stringify(xlData)
    }
    callback(null,res);
});

推荐阅读