在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")
但是它似乎不起作用,我正在努力定义编码器以实现此目的。
答案 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}]
}