0

In Node.js, I want to use a Base64Stream from one module and use it as a file in another.

I am getting email attachments from mail-listener2 which return like this:

{
  contentType: 'image/png',
  contentDisposition: 'attachment',
  transferEncoding: 'base64',
  generatedFileName: 'attachment.png',
  contentId: '4b07159b34f1287079d4bdf7e77bc295@mailparser',
  stream: Base64Stream {
    _events: [Object: null prototype] {},
    _eventsCount: 0,
    _maxListeners: undefined,
    writable: true,
    checksum: Hash {
      _options: undefined,
      [Symbol(kHandle)]: Hash {},
      [Symbol(kState)]: [Object]
    },
    length: 5245,
    current: '',
    [Symbol(kCapture)]: false
  },
  checksum: '8d8c71ac84d23f92e171922eb89e1271',
  length: 5245
}

I want to attach those to an email using gmail-send which expects filepath.

Do I have to save the attachment to disk? If so, how?

Or can I somehow convert it "in memory"?

I tried

base64Data = attachment.stream;
require("fs").writeFile("out.png", base64Data, 'base64', function(err) {
  console.log(err);
});

but got a 0-length file.

1 Answer 1

1

The method you are using to write the file is asynchronous so you need to resolve the promise to ensure the file write is successful. Alternatively you can do something synchronous like this

import * as fs from 'fs'
const base64Data = attachment.stream;
// Convert the base64 data to a buffer
const buffer = Buffer.from(base64Data, 'base64')
// Set a path for the temporary file
const tempFilePath = '~/some/place/somewhere/file.extension'
// Write the raw buffer to a file synchronously 
fs.writeFileSync(tempFilePath, buffer)
// TODO Do your stuff using the file, then delete the temporary file

fs.unlink(tempFilePath, (error) => {
  if (error) {
    console.error(error)
  }
})

Its hard to tell if it can be done in memory without looking at the specific module youre using, but this way would work with the file path.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.