将S3字节数组转换为base64

时间:2019-09-13 08:04:37

标签: javascript node.js

在NodeJS服务器上,我下载了需要嵌入到电子邮件中的图像。我的存储桶不是公开的,因此仅使用链接将不起作用,这也不是我想要解决此问题或项目要求的解决方案。

我正在为此使用HTML电子邮件,

<p>Embedded image: <img src="data:image/jpeg;charset=utf-8;base64,{{url}}" /></p>

所以我从S3下载

s3.getObject(
                          { Bucket: "mybucket", Key: "mykey" },
                          function (error, data) {
                            if (error != null) {
                              console.log("Errror" + error)
                            } else {
                              console.log("Loaded " + data.ContentLength + " bytes")

然后我正在尝试将data.body转换为UTF-8 base 64

我想过

"data:image/png;base64," + new String(encoder.encode(data.body), "UTF-8")

但是它似乎不起作用,我正在努力定义编码器以实现此目的。

2 个答案:

答案 0 :(得分:1)

确保在data.Body中获取图像数据。我认为data.Body已经是缓冲区了,您可以将src URL构造如下:

  // Convert Body from a Buffer to a String
    let base64String= data.Body.toString('base64');

    let src = "data:image/jpeg;base64,"+base64String;

答案 1 :(得分:0)

如果您以二进制格式存储 s3 存储桶对象,则可以接收它并将其转换为 base64:

const blobToBase64 = (blob) => {
  const reader = new FileReader()
  reader.readAsDataURL(blob)
  return new Promise((rs, rj) => {
    reader.onloadend = () => {
      rs(reader.result)
    }
    reader.onerror = rj
  })
}

function useImage({s3Link}) {
  const [src, setSrc] = React.useState(null)

  React.useEffect(() => {
    async function query({link}) {
      //link is link to s3 bucket URL link e.g
      // const link = s3.getSignedUrl('getObject', {
      //   Bucket: bucketnamw,
      //   Key: key,
      //   Expires: 30,
      // })

      const r = await fetch(link)
      const blob = await r.blob()
      const base64 = await blobToBase64(blob)
      console.log(`base64!`, base64)
      setSrc(base64)
    }

    if (s3Link) {
      query({link: s3Link})
    }
  }, [s3Link, setSrc])

  return [{src}]
}