Asked Sep 28th, 7:32 a.m. 97 1 1
  • 97 1 1
+1

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

Share
  • 97 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 ANSWERS


Answered Sep 28th, 7:38 a.m.
+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);
    }
});
Share
Avatar Phạm Duy Vũ @binchanhkun99
Sep 28th, 7:46 a.m.

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

0
| Reply
Share
Sep 28th, 7:59 a.m.

@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:" +....
0
| Reply
Share
Avatar Phạm Duy Vũ @binchanhkun99
Sep 28th, 8:18 a.m.

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

0
| Reply
Share
Avatar QuocHuy @b1809128
Sep 28th, 8:22 a.m.

@binchanhkun99 Cài buffer nhé bác

0
| Reply
Share
Avatar MR LUFFY @kuanglee97
Sep 28th, 8:25 a.m.
0
| Reply
Share
Avatar QuocHuy @b1809128
Sep 28th, 8:25 a.m.

buffer.png

0
| Reply
Share
Sep 28th, 8:28 a.m.

@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é.

0
| Reply
Share
Avatar Phạm Duy Vũ @binchanhkun99
Sep 28th, 9:38 a.m.

@huukimit Vâng thanks bác

0
| Reply
Share
Avatar Phạm Duy Vũ @binchanhkun99
Sep 28th, 9:54 a.m.

@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

0
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.