首页 > 解决方案 > 使用 lambda (node.js) + puppeteer 到 .fetch() Excel 文件并写入 S3,文件格式错误

问题描述

我正在点击 Excel 文件的 OneDrive/Sharepoint 共享链接,尝试将其下载并保存到 S3。

CSV确实有效;.xlsx 没有

我正在使用 Puppeteer,所以代码看起来像这样:

var downloadURL = "https://netorgft7979143-my.sharepoint.com/:x:/g/personal/gabe_scoop_report/ETCqa1EwxrVNiPYD0aLIq44BJUpEFLYIhcKOFWXuNnYPXQ?download=1"

const buffer = await page.evaluate(({downloadURL}) =>
    {
      return fetch(downloadURL, {
        method: 'GET'
      }).then(r => r.text());
    }, {downloadURL});

...

const s3result = await s3
    .upload({
      Bucket: S3BucketPath,
      Key: `${Date.now()}.csv`,
      Body: buffer,
      ContentType: 'text'})
    .promise()

同样,当端点是 CSV 时,这完全有效。当它是 Excel 文件时,这些位会写入 S3;但是,不是有效的 Excel文件。

上面的 URL 是真实的(示例数据,请随意点击),如果您运行此代码,您将看到写入 S3 的 11k 文件,但 Excel 会抱怨格式无效。

我 99%+ 确信它与二进制与文本有关,并且花了 2 天时间研究 SO,尝试从 base64 转换到 .blob() 或 .buffer()、S3 的不同内容类型……但没有任何作用。我也 99%+ 确定 Puppeteer 与问题无关,将 .fetch() 包装在 page.evaluate() 中确实使then(r => r.buffer())抱怨缓冲区不是函数之类的事情变得更加困难......

想法?谢谢!

标签: node.jsamazon-s3aws-lambdafetchpuppeteer

解决方案


推荐阅读