Como fazer upload de uma imagem para o S3 usando Node.js

Primeiro, instale a biblioteca aws-sdk:

npm install aws-sdk

Importe-o em seu código na parte superior do arquivo que você adicionará este upload de arquivo à funcionalidade do S3:

import AWS from 'aws-sdk'

Em seguida, use o SDK para criar uma instância do objeto S3. Eu o atribuo a uma s3variável:

const s3 = new AWS.S3({
  accessKeyId: process.env.AWS_S3_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_S3_SECRET_ACCESS_KEY,
})

Observe que eu uso duas variáveis ​​de ambiente aqui: AWS_S3_ACCESS_KEY_IDe AWS_S3_SECRET_ACCESS_KEY.

Agora vem algum “trabalho administrativo”. Você precisa criar um perfil do IAM na AWS (as credenciais) com acesso programático com as permissões para AWSCloudFormationFullAccessee AmazonS3FullAccessum bucket do S3 ao qual esse usuário tem acesso.

Não abordarei esse aspecto aqui, pois você pode encontrar vários artigos e documentação sobre isso. Vou falar apenas sobre o código JavaScript que você precisa.

Agora, você precisa de um blob de imagem para fazer upload.

Você pode usar um URL como este:

const imageURL = 'https://url-to-image.jpg'
const res = await fetch(imageURL)
const blob = await res.buffer()

ou você pode obter uma imagem enviada de um upload de campo de imagem de formulário em um formulário de várias partes ou uma imagem salva no disco:

const imagePath = req.files[0].path
const blob = fs.readFileSync(imagePath)

Finalmente, faça uma chamada s3.upload()e chame seu .promise()método para que você possa usar await para esperar até que ele termine de obter o objeto de arquivo carregado:

const uploadedImage = await s3.upload({
  Bucket: process.env.AWS_S3_BUCKET_NAME,
  Key: req.files[0].originalFilename,
  Body: blob,
}).promise()
AWS_S3_BUCKET_NAMEé o nome do bucket do S3, outra variável de ambiente

Por fim, você pode obter o URL da imagem carregada no S3 referenciando a Locationpropriedade:

uploadedImage.Location

Você precisa definir o bucket do S3 como público para poder acessar o URL da imagem.