Yêu cầu thg 9 28, 2022 7:32 SA 135 1 1
  • 135 1 1
+1

Cách để đưa một đường dẫn về dạng base64 trong nodejs?

Chia sẻ
  • 135 1 1

Em đang đính kèm tệp cho mail và provide yêu cầu phải chuyển qua dạng base64, trước kia thì em xài SMTP thì chỉ cần gán thẳng cái link đến là được... Đây là code của em

send: async (ctx) => {
    const body = ctx.request.body
    const sendTo = 'vupd@hihi.com'
    strapi.log.debug(`Trying to send an email to ${sendTo}`)
 
    let attachments ='https://xxx.xxx.xx/uploads/Cover_Go_Studio_204fca7084.png'
    try {
      const emailOptions = {
        to: sendTo,
        subject: 'Test',
        text:"Test",
        attachments:[{
          content: attachments,
          filename: 'doSomething',
          type: "application/png",
          disposition: "attachment",
        }
          
        ]
      }
      await strapi.plugins['email'].services.email.send(emailOptions)
      strapi.log.debug(`Email sent to  ${sendTo}`)
      ctx.send({ message: 'Email sent' })
    } catch (err) {
      strapi.log.error(`Error sending email to ${sendTo}`, err)
  
      ctx.send({ error: 'Error sending email' })
    }
  },

Và nó sẽ đưa ra lỗi: >The attachment content must be base64 encoded. Có cách nào để dùng nó như kiểu fs.readFileSync('link').toString("base64") của file local không ạ

1 CÂU TRẢ LỜI


Đã trả lời thg 9 28, 2022 7:38 SA
+2

Mình vừa search thấy issue tương tự trên Stackoverflow. Bạn thử dùng đoạn script này để download image + convert image thành base64.

var request = require('request').defaults({ encoding: null });

request.get('http://tinypng.org/images/example-shrunk-8cadd4c7.png', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        const data = "data:" + response.headers["content-type"] + ";base64," + Buffer.from(body).toString('base64');
        console.log(data);
    }
});
Chia sẻ
Avatar Phạm Duy Vũ @binchanhkun99
thg 9 28, 2022 7:46 SA

Không biết phải cài thêm thư viện gì không bác nhỉ? em chạy rồi gán attachments bằng data nó ra lỗi ntn:

image.png

thg 9 28, 2022 7:59 SA

@binchanhkun99 Nó báo lỗi chưa khai báo biến data thôi bạn. Bạn sửa lại cho đúng syntax xem sao.

const data = "data:" +....
Avatar Phạm Duy Vũ @binchanhkun99
thg 9 28, 2022 8:18 SA

@huukimit Vâng ạ nhưng em không thể lấy được thằng data trong đó ra để gán cho attachments ấy bác

Avatar QuocHuy @b1809128
thg 9 28, 2022 8:22 SA

@binchanhkun99 Cài buffer nhé bác

Avatar MR LUFFY @kuanglee97
thg 9 28, 2022 8:25 SA
Avatar QuocHuy @b1809128
thg 9 28, 2022 8:25 SA

buffer.png

thg 9 28, 2022 8:28 SA

@binchanhkun99 Ý tưởng người ta là vậy:

  • Tạo GET request tới URL của ảnh
  • Convert response thành string dạng base64.

Trong đó cái lệnh quan trọng nhất là convert thành base64 là:

const data = "data:" + response.headers["content-type"] + ";base64," + Buffer.from(body).toString('base64');

Phần request ảnh, do callback của module request nó không hỗ trợ return data nên bạn hãy chuyển qua cài package khác như axios hoặc fetch cũng được. Đại loại sửa code sang kiểu như này:

const getImageBase64 = async (url) => {
  const response = await axios.get(url);
  const data = "data:" + response.headers["content-type"] + ";base64," + Buffer.from(body).toString('base64');

  return data
}

const base64String = await getImageBase64('https://....')

Code này là giả mã, bạn đọc hiểu và cố gắng tự xử lý tiếp nhé.

Avatar Phạm Duy Vũ @binchanhkun99
thg 9 28, 2022 9:38 SA

@huukimit Vâng thanks bác

Avatar Phạm Duy Vũ @binchanhkun99
thg 9 28, 2022 9:54 SA

@b1809128 Thay vì gửi cho mình hình ảnh thì nó gửi về cho mình một têp trắng chỉ chứa đường dẫn ảnh

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí