DEV Community

Diego Souza
Diego Souza

Posted on

Stream de Arquivo PDF ou Imagem S3 - AWS

Objetivo

Esse conteúdo tem como objetivo mostrar de forma simples uma das maneiras de fazermos streaming de arquivos PDF ou imagens direto de um Bucket S3, da AWS.

Como premissa, a aplicação deve ser em Node.JS.

Instalando SDK AWS

npm install @aws-sdk/client-s3
Enter fullscreen mode Exit fullscreen mode

Configurando Client

Basicamente, o objeto de configuração do cliente S3 precisa receber a região e as credenciais - que são adquiridas no IAM da AWS. Talvez, dependendo do contexto da sua aplicação é necessário usar um proxy. Sobre isso, no final desse artigo tem um exemplo de como configurar um proxy.

const awsConfig = {
   region: 'us-east-1',
   credentials: {
      accessKeyId: '',
      secretAccessKey: '',
   }
};

s3Client = new S3Client(awsConfig);
Enter fullscreen mode Exit fullscreen mode

Buscando Objeto no S3

Com o cliente configurado, agora é possível buscar um arquivo no S3. Para isso, é necessário um objeto informando o nome do Bucket e o ID do arquivo. Geralmente esse ID é o nome do arquivo. Então, cuidado com acentuações e caracteres especiais ao fazer o upload de arquivos.

Para buscar o arquivo, usamos o getObjectCommand, conforme abaixo.

const object = {
   Bucket: 'bucket-name',
   Key: 'file-id'
};

const getObjectCommand = new GetObjectCommand(object);

return s3Client.send(getObjectCommand);
Enter fullscreen mode Exit fullscreen mode

Retornando o Arquivo para o Frontend

Para retornar o arquivo para o navegador usando seu tipo correto, podemos fazer uso do Content-Type que é disponibilizado pelo response no caso de estar usando o Express.

streamFile = async (request, response, next) => {
   const fileStream = new GetStreamFileService();
   const responseStream = await fileStream.execute({ fileId, bucket });

   response.setHeader('Content-Type', responseStream.ContentType);

   return responseStream.Body.pipe(response);
}
Enter fullscreen mode Exit fullscreen mode

Note que no return é usada a função pipe, que é do próprio SDK da AWS, que existe dentro do Body. Essa função tem o recurso de stream dentro dela. Então, passamos apenas o response do Express como parâmetro.

Feito isso, provavelmente você terá uma rota configurada para acessar esse serviço. Geralmente, fazemos assim:

<img src="/routes/files/id-do-arquivo" alt="Stream de Imagem do S3" />

Se for um arquivo PDF, você pode abrir direto no browser, ou object usando o link.

<object data="/routes/files/id-do-arquivo" type="application/pdf">
   Não foi possível fazer o streaming desse arquivo.
</object>
Enter fullscreen mode Exit fullscreen mode

Proxy

Baseada na minha experiência, tive dificuldades em fazer streaming de arquivos certa vez. Estava configurado corretamente, mas sempre retornava algum erro. Buscando pela engenharia dos servidores, entendi que era necessário usar um proxy para acessar o S3.

Na própria documentação do SDK do S3 encontrei uma solução, usando as bibliotecas hpagent e @aws-sdk/node-http-handler. Depois, usamos o proxy dentro do objeto de configuração do S3.

const agent = new HttpsProxyAgent({ proxy: '' });
const requestHandler = new NodeHttpHandler({
   httpAgent: agent,
   httpsAgent: agent,
});

const awsConfig = {
   region: 'us-east-1',
   requestHandler,
   credentials: {
      accessKeyId: '',
      secretAccessKey: '',
   }
};
Enter fullscreen mode Exit fullscreen mode

Espero que esse artigo te ajude em algum momento de sua carreira.

Top comments (0)