S3 上传 Excel 文件并通过 SignedURL 下载

Chr*_*Ngo 1 javascript amazon-s3 amazon-web-services aws-lambda

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

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

上传:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

获取签名网址:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

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

var*_*ons 6

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

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