【问题标题】:S3 Uploading Excel File and Downloading it via SignedURLS3 上传 Excel 文件并通过签名 URL 下载
【发布时间】:2020-02-07 03:26:57
【问题描述】:

我正在尝试将 excel 文件上传到 S3 并通过签名 URL 下载。我注意到该对象以不同的文件类型返回,而不是预期的 xlsx 类型,因此在本地不可读。

我有两个 lambda,一个用于上传对象,另一个用于检索签名 URL。

上传:

async function () => {
  const s3 = new aws.S3({ signatureVersion: 'v4' })
  const params = {
    Bucket: bucket,
    Key: key
  }

  try {
    const signedURL = await s3.getSignedUrl('getObject', params)
    return response(200, signedURL)
  } catch (err) {
    console.log(JSON.stringify(err))
    return response(400, err)
  }
}

GetSignedURL:

async function () => {
  const s3 = new aws.S3({ signatureVersion: 'v4' })
  const params = {
     Bucket: bucket,
     Key: key
  }

  try {
     const signedURL = await s3.getSignedUrl('putObject', params)
     return response(200, { signedURL, key })
  } catch (err) {
    return response(400, err)
  }
}

我猜该文件实际上并没有以其原始文件类型保存,而 S3 实际上只是将其转换为文本文件。也许我需要一个额外的参数或包来明确地将其保存为 Excel 文件。请让我知道你的想法!

【问题讨论】:

    标签: javascript amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    您在参数中缺少 ContentType。我不确定这是否适合 excel,但提供正确的内容类型应该可以解决问题。我在上传图片时遇到了类似的问题。我忘记将 ContentType 设置为 image/jpeg

    const params = {
        Bucket: bucket,
        Key: key,
        ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
      }
    
    Other possible options 
    "xls"       => "application/vnd.ms-excel",
    "xlsx"      => "vnd.ms-excel",
    

    【讨论】:

    • 试试这个! :D
    • 我们是否必须在上传和检索器中都指定 ContentType?
    • 我认为您可以根据需要覆盖响应标头。 docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/…
    • 太棒了。谢谢先生。
    • 再次感谢您的回答!我只是想知道您是否碰巧知道为什么似乎只接受 xls 文件。我为 xlsx 文件尝试了最后一个选项vnd.ms-excel,但该文件不想用 Microsoft Excel 打开。我添加了您在 Uploader lambda(上面列出的第一个)中建议的 Content-Type,并且 xls 文件有效。
    猜你喜欢
    • 2017-04-02
    • 2020-10-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2015-05-01
    • 2021-08-18
    相关资源
    最近更新 更多