Pular para o conteúdo principal

Como Fazer Upload e Download de Arquivos no Azure Blob Storage, AWS S3 e YouTube Usando Node.js

No cenário atual de desenvolvimento, muitas aplicações web e móveis precisam de funcionalidades para o upload e download de arquivos, seja para armazenar documentos, fotos ou até vídeos. Entre os serviços de nuvem mais populares, temos o AWS S3, Azure Blob Storage e o YouTube (para upload de vídeos). Este artigo vai te guiar pela implementação de uma solução em Node.js que permite realizar o upload e download de arquivos nesses serviços, com a escolha do serviço sendo um parâmetro da requisição.

Pré-requisitos

Antes de começarmos, certifique-se de ter o seguinte:

  • Conta na AWS com acesso ao S3.
  • Conta na Azure com o serviço de Blob Storage configurado.
  • Conta no Google Developer Console com as credenciais da API do YouTube configuradas.

O que Vamos Usar

Para realizar o upload e download de arquivos, utilizaremos as bibliotecas oficiais dos respectivos serviços:

  • AWS S3: Utilizaremos o SDK da AWS (aws-sdk).
  • Azure Blob Storage: Utilizaremos o pacote @azure/storage-blob.
  • YouTube API: Usaremos a biblioteca googleapis para upload de vídeos no YouTube.
  • Multer: Um middleware para lidar com uploads de arquivos no Node.js.

Passo 1: Instalação das Dependências

Vamos começar instalando as bibliotecas que serão utilizadas no projeto:

npm install @azure/storage-blob aws-sdk googleapis multer

Essas bibliotecas permitirão que a aplicação interaja com os serviços de nuvem e gerencie o upload de arquivos de maneira eficiente.

Passo 2: Configurando o Código Node.js

Aqui está o código que faz o upload e download dos arquivos para os três serviços, com a escolha sendo feita com base no parâmetro enviado na requisição.

const express = require('express');
const multer = require('multer');
const { BlobServiceClient } = require('@azure/storage-blob');
const AWS = require('aws-sdk');
const { google } = require('googleapis');
const fs = require('fs');
const path = require('path');

// Configurações do AWS S3

const s3 = new AWS.S3({
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
    region: process.env.AWS_REGION
});

// Configurações do Azure Blob Storage

const azureBlobServiceClient = BlobServiceClient.fromConnectionString(process.env.AZURE_STORAGE_CONNECTION_STRING);
const containerName = process.env.AZURE_CONTAINER_NAME;

// Configurações da API do YouTube

const oauth2Client = new google.auth.OAuth2(
    process.env.YOUTUBE_CLIENT_ID,
    process.env.YOUTUBE_CLIENT_SECRET,
    'https://developers.google.com/oauthplayground' // Redirect URL
);

oauth2Client.setCredentials({
    access_token: process.env.YOUTUBE_ACCESS_TOKEN,
    refresh_token: process.env.YOUTUBE_REFRESH_TOKEN,
});

// Middleware Multer para upload de arquivos
const upload = multer({ dest: 'uploads/' });
const app = express();

// Rota de upload de arquivos
app.post('/upload', upload.single('file'), async (req, res) => {
    const { service } = req.body;  // Parâmetro para escolher o serviço: 'azure', 's3', ou 'youtube'
    const file = req.file;
    try {
        if (service === 'azure') {
            // Upload no Azure Blob Storage
            const blobClient = azureBlobServiceClient.getContainerClient(containerName).getBlockBlobClient(file.originalname);
            await blobClient.uploadFile(file.path);
            res.json({ message: 'Arquivo enviado para o Azure Blob Storage!' });
        } else if (service === 's3') {
            // Upload no AWS S3
            const fileContent = fs.readFileSync(file.path);
            const params = {
                Bucket: process.env.AWS_S3_BUCKET,
                Key: file.originalname,
                Body: fileContent
            };
            await s3.upload(params).promise();
            res.json({ message: 'Arquivo enviado para o AWS S3!' });
        } else if (service === 'youtube') {
            // Upload de vídeo no YouTube
            const youtube = google.youtube({ version: 'v3', auth: oauth2Client });
            const videoFilePath = path.join(__dirname, file.path);
            const videoStream = fs.createReadStream(videoFilePath);
            const response = await youtube.videos.insert({
                part: 'snippet,status',
                requestBody: {
                    snippet: {
                        title: file.originalname,
                        description: 'Upload via Node.js',
                        tags: ['nodejs', 'upload']
                    },
                    status: {
                        privacyStatus: 'private'
                    }
                },
                media: {
                    body: videoStream
                }
            });
            res.json({ message: 'Vídeo enviado para o YouTube!', videoId: response.data.id });
        } else {
            res.status(400).json({ error: 'Serviço inválido' });
        }
    } catch (err) {
        console.error('Erro ao fazer upload:', err);
        res.status(500).json({ error: 'Erro ao fazer upload' });
    } finally {
        // Remove o arquivo local temporário
        fs.unlinkSync(file.path);
    }
});

// Rota de download de arquivos (apenas para Azure e S3)
app.get('/download/:service/:filename', async (req, res) => {
    const { service, filename } = req.params;
    try {
        if (service === 'azure') {
            const blobClient = azureBlobServiceClient.getContainerClient(containerName).getBlockBlobClient(filename);
            const downloadBlockBlobResponse = await blobClient.download(0);
            downloadBlockBlobResponse.readableStreamBody.pipe(res);
        } else if (service === 's3') {
            const params = {
                Bucket: process.env.AWS_S3_BUCKET,
                Key: filename
            };
            const s3Stream = s3.getObject(params).createReadStream();
            s3Stream.pipe(res);
        } else {
            res.status(400).json({ error: 'Download disponível apenas para Azure e S3' });
        }
    } catch (err) {
        console.error('Erro ao baixar arquivo:', err);
        res.status(500).json({ error: 'Erro ao baixar arquivo' });
    }
});

app.listen(3000, () => {
    console.log('Servidor rodando na porta 3000');
});

Passo 3: Configurando Variáveis de Ambiente

Para que o código funcione corretamente, você precisará configurar algumas variáveis de ambiente. Crie um arquivo .env ou defina-as diretamente no seu ambiente de execução com os seguintes valores:

# Credenciais AWS S3
AWS_ACCESS_KEY_ID=seu_access_key_id
AWS_SECRET_ACCESS_KEY=seu_secret_access_key
AWS_REGION=sua_regiao_aws
AWS_S3_BUCKET=nome_do_bucket
# Credenciais Azure Blob Storage
AZURE_STORAGE_CONNECTION_STRING=sua_connection_string_azure
AZURE_CONTAINER_NAME=nome_do_container_azure
# Credenciais YouTube API
YOUTUBE_CLIENT_ID=seu_client_id_youtube
YOUTUBE_CLIENT_SECRET=seu_client_secret_youtube
YOUTUBE_ACCESS_TOKEN=seu_access_token_youtube
YOUTUBE_REFRESH_TOKEN=seu_refresh_token_youtube

Como Funciona

  1. Upload de Arquivos: A rota /upload permite fazer upload de um arquivo, escolhendo o serviço de destino através de um parâmetro enviado junto na requisição (azure, s3, ou youtube). Dependendo do valor, o arquivo é enviado para o respectivo serviço.
  2. Download de Arquivos: A rota /download/:service/:filename permite baixar arquivos armazenados no Azure Blob Storage ou no AWS S3.

Conclusão

Com esse exemplo, agora você tem uma aplicação Node.js que consegue interagir com três dos serviços de armazenamento mais usados: AWS S3, Azure Blob Storage, e YouTube para vídeos. Isso oferece uma grande flexibilidade para gerenciar arquivos em diferentes plataformas, seja para upload ou download.

Se você gostou desse artigo, fique à vontade para deixar seus comentários ou dúvidas!

Comentários

Postagens mais visitadas deste blog

Implementado Comunicação entre Microserviços Apache Kafka em Nodejs

Implementando Comunicação entre Microserviços com Apache Kafka em Node.js Implementando Comunicação entre Microserviços com Apache Kafka em Node.js O Apache Kafka é uma plataforma distribuída de mensagens em tempo real, ideal para comunicação entre microserviços. Neste artigo, implementaremos um produtor e um consumidor Kafka usando Node.js . 1. Configuração do Ambiente Antes de começar, instale o Docker e configure um cluster Kafka com Zookeeper: docker-compose up -d Crie um arquivo docker-compose.yml para rodar o Kafka: version: '3.8' services: zookeeper: image: bitnami/zookeeper:latest container_name: zookeeper environment: - ALLOW_ANONYMOUS_LOGIN=yes ports: - "2181:2181" kafka: image: bitnami/kafka:latest container_name: kafka depends_on: - zookeeper environment: - KAFKA_BROKER_ID=1 - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:...

Como Resolver Problema de Teclado e Mouse Não Funcionando no Ubuntu

Como resolver problema com teclado e mouse no Ubuntu Como Resolver Problema de Teclado e Mouse Não Funcionando no Ubuntu Encontrar-se sem teclado e mouse funcionando no Ubuntu pode ser frustrante, especialmente quando precisamos realizar tarefas urgentes. Este artigo aborda uma solução simples e eficaz: reinstalar o pacote xserver-xorg-input-all , que é responsável pelo suporte aos dispositivos de entrada no sistema. Passos para resolver o problema Para resolver este problema, siga os passos abaixo. Será necessário acessar o sistema como usuário root através do modo de recuperação pelo GRUB. 1. Acesse o modo de recuperação pelo GRUB Caso o teclado e o mouse não estejam funcionando, siga os passos abaixo para acessar o terminal no modo de recuperação: Reinicie o computador e, durante a inicialização, pressione repetidamente a tecla Shift ...

Como Migrar Arquivos do AWS S3 para Azure Blob Storage

Como Migrar Arquivos do AWS S3 para Azure Blob Storage Como Migrar Arquivos do AWS S3 para Azure Blob Storage Este tutorial ensina como realizar a migração de todos os arquivos e pastas de um bucket S3 da AWS para o Azure Blob Storage de forma eficiente e segura. Pré-requisitos Uma conta AWS com acesso ao bucket S3. Uma conta Azure com um container configurado no Blob Storage. Instalação da AWS CLI e da Azure CLI . Configuração das credenciais de ambas as plataformas. Passo 1: Configurar as Ferramentas de Linha de Comando Configurar a AWS CLI Certifique-se de que a AWS CLI está instalada e configurada com as credenciais apropriadas: aws configure Insira o Access Key ID , Secret Access Key , região e formato de saída (por exemplo, JSON). Configurar a Azure CLI Faça login na sua conta Azure usando a Azure CLI: az login ...