使用 AWS Lambda 将 Excel 流式传输到 AWS S3

streaming excel to aws s3 using aws lambda

提问人:jos j 提问时间:10/26/2023 更新时间:10/26/2023 访问量:42

问:

我正在从数据库获取一些数据,创建一个 Excel 工作表流式传输并使用 AWS Lambda 上传到 AWS S3

const date = new Date().toISOString().split('T')[0];
        const fileName = `reports/${date}/applications.xlsx`;

        const passThrough = new stream.PassThrough();
        const workbook = new ExcelJS.stream.xlsx.WorkbookWriter({
            stream: passThrough,
            useStyles: true
        });

        const worksheet = workbook.addWorksheet('Applications');
        const headers = Object.keys(applications[0]);
        worksheet.addRow(headers);

        for (let application of applications) {
            const row = headers.map(header => {
                if (hyperlinkHeaders.includes(header)) {
                    return { text: application[header], hyperlink: application[header] };
                }
                return application[header];
            });
            worksheet.addRow(row);
        }
        await workbook.commit();

        const uploadCommand = new PutObjectCommand({
            Bucket: BUCKET_NAME,
            Key: fileName,
            Body: passThrough,
            ContentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        });
        await s3.send(uploadCommand);

但是我遇到了一些错误。无法弄清楚我在做什么 START 请求 Id:版本:$LATEST 2023-10-26T08:31:47.125Z 错误 NotImplemented:您提供的标题意味着未实现的功能 在 throwDefaultError (/var/runtime/node_modules/@aws-sdk/smithy-client/dist-cjs/default-error-handler.js:8:22) 在 /var/runtime/node_modules/@aws-sdk/smithy-client/dist-cjs/default-error-handler.js:18:39 在 de_PutObjectCommandError (/var/runtime/node_modules/@aws-sdk/client-s3/dist-cjs/protocols/Aws_restXml.js:5721:12) 在 process.processTicksAndRejections (node:internal/process/task_queues:95:5) 在异步 /var/runtime/node_modules/@aws-sdk/middleware-serde/dist-cjs/deserializerMiddleware.js:7:24 在 async /var/runtime/node_modules/@aws-sdk/middleware-signing/dist-cjs/awsAuthMiddleware.js:14:20 在异步 /var/runtime/node_modules/@aws-sdk/middleware-retry/dist-cjs/retryMiddleware.js:27:46 在异步 /var/runtime/node_modules/@aws-sdk/middleware-flexible-checksums/dist-cjs/flexibleChecksumsMiddleware.js:58:20 在异步 /var/runtime/node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js:7:26 在 async Runtime.handler (file:///var/task/index.mjs:104:13) { '$fault': '客户端', '$metadata':{ httpStatusCode:501, requestId: '', extendedRequestId: '', cfId:未定义, 尝试次数: 1, totalRetryDelay:0 }, 代码: 'NotImplemented', 标头: 'Transfer-Encoding',

javascript excel amazon-s3 aws-lambda

评论

0赞 jos j 10/26/2023
解决了 const uploadCommand = new PutObjectCommand({ Bucket: BUCKET_NAME, Key: fileName, Body: passThrough, ContentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ContentLength: passThrough.readableLength });需要添加内容长度

答:

0赞 jos j 10/26/2023 #1

const uploadCommand = new PutObjectCommand({ 铲斗:BUCKET_NAME, 键:fileName, 正文:直通, 内容类型: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 内容长度:passThrough.readableLength });

添加 ContentLength: passThrough.readableLength 解决了问题