'How to upload base64 encoded pdf directly to s3 with nodejs/aws-sdk?

I'm attempting to upload a base64 encoded pdf to S3 with the following code without having to write the file to the filesystem.

const AWS = require('aws-sdk');
exports.putBase64 = async (object_name, buffer, bucket) => {
const params = {
    Key: object_name,
    Body: buffer,
    Bucket: bucket,
    ContentEncoding: 'base64',
    ContentType: 'application/pdf'
};
const response = await S3.upload(params).promise();
return response;
};

Where buffer is a blank pdf encoded to base64. When attempting to open the file on s3, I get "We can't open this file Something went wrong." upon attempting to open it.

However, if I write the base64 encoding into a file and THEN upload it, it works.

await fs.writeFileSync(`./somepdf.pdf`, base_64, 'base64');
exports.put = async (object_name, file_location, bucket, content_type) => {
const file_content = fs.readFileSync(file_location);
const params = {
    Key: object_name,
    Body: './somepdf.pdf',
    Bucket: bucket,
    ContentType: 'application/pdf'
};
const response = await S3.upload(params).promise();
return response;
};

I notice that when uploading the file directly, the file encoding when viewing the file through a text editor it isn't base64 encoded, but viewing the file uploaded as strictly defined contentencoding base64 shows the base64. I attempted to convert the base64 to a blob using atob but that yielded the same results, so I assume there's a parameter I maybe missing or a header.



Solution 1:[1]

I had the same issue and managed to solve it by making this change:

const AWS = require('aws-sdk');
const S3 = new AWS.S3();

exports.putBase64 = async (object_name, buffer, bucket) => {

    const params = {
        Key: object_name,
        Body: Buffer.from(buffer, 'base64'), // <---------
        Bucket: bucket,
        ContentType: 'application/pdf'
    };

    return await S3.upload(params).promise();
};

Solution 2:[2]

Create a new buffer

const newBuffer = buffer.replace(/^data:.+;base64,/, "")

Now use this new buffer in params. This should work!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Par Bhatia