SLACK_UPLOAD_FILE - Upload de Arquivo
O que é esta Tool?
A SLACK_UPLOAD_FILE é a tool responsável por fazer upload de arquivos para canais ou DMs do Slack usando a API oficial files.upload.
Por que esta Tool existe?
Upload de arquivos no Slack requer tratamento especial de multipart/form-data. A SLACK_UPLOAD_FILE existe para:
- Compartilhar documentos: PDF, DOCX, XLSX automaticamente
- Enviar relatórios: Gerar e enviar CSVs, planilhas, logs
- Anexar evidências: Screenshots, imagens, arquivos zip
- Backup automatizado: Enviar backups diários para canal
Como funciona internamente?
Quando a SLACK_UPLOAD_FILE é executada, o sistema:
- Prepara o arquivo (base64, buffer ou URL)
- Valida tamanho (limite: varia por tipo de workspace)
- Faz upload usando endpoint
files.uploadoufiles.uploadV2 - Compartilha no canal ou DM especificado
- Se erro: Retorna erro (arquivo muito grande, formato inválido)
- Se sucesso: Retorna file ID e URL pública/privada
Código interno (productivity-executors.service.ts - implementação futura):
async executeSlackUploadFile(data: any, variables: Record<string, any>): Promise<any> {
const { botToken, channel, file, filename, title, initialComment } = data;
const FormData = require('form-data');
const form = new FormData();
form.append('channels', channel);
form.append('file', file, filename);
if (title) form.append('title', title);
if (initialComment) form.append('initial_comment', initialComment);
const response = await axios.post(
'https://slack.com/api/files.upload',
form,
{
headers: {
...form.getHeaders(),
'Authorization': `Bearer ${botToken}`,
}
}
);
if (!response.data.ok) {
throw new Error(`Slack file upload error: ${response.data.error}`);
}
return {
success: true,
fileId: response.data.file.id,
url: response.data.file.url_private,
permalink: response.data.file.permalink,
filename: response.data.file.name,
};
}
Quando você DEVE usar esta Tool?
Use SLACK_UPLOAD_FILE sempre que precisar de enviar arquivos para o Slack:
Casos de uso
- Reports automatizados: Enviar CSV de vendas diárias
- Logs de sistema: Upload de arquivos de log para investigação
- Backups: Enviar dumps de banco de dados
- Evidências: Screenshots de erros, comprovantes
- Documentação: Compartilhar PDFs, manuais gerados
- Planilhas: Excel com dados processados
Quando NÃO usar SLACK_UPLOAD_FILE
- Mensagens de texto: Use SLACK_SEND_MESSAGE
- Links externos: Use SLACK_SEND_MESSAGE com URL
- Arquivos muito grandes: Use serviços de storage (S3, Drive) + link
Parâmetros Detalhados
botToken (string, obrigatório)
O que é: Token de autenticação do Slack Bot.
Permissões necessárias:
files:write- Fazer upload de arquivosfiles:read- Ler informações de arquivos
Flow completo para testar:
{
"name": "Teste Upload Arquivo Slack",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "slack_1",
"type": "slack_upload_file",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Upload CSV",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "C01234567",
"file": "data:text/csv;base64,bm9tZSxpZGFkZQpKb8OjbywzMA==",
"filename": "dados.csv",
"title": "Relatório de Vendas"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "slack_1" },
{ "source": "slack_1", "target": "end_1" }
]
}
channel (string, obrigatório)
O que é: ID do canal ou DM onde o arquivo será compartilhado.
Formatos aceitos:
- Channel ID:
C01234567(canal público/privado) - DM ID:
D01234567(mensagem direta) - User ID:
U01234567(abre DM e envia)
Múltiplos canais:
{
"channel": "C01234567,C98765432,D11111111"
}
file (string/buffer, obrigatório)
O que é: Conteúdo do arquivo a ser enviado.
Formatos aceitos:
1. Base64 Data URL:
data:text/csv;base64,bmFtZSxhZ2UKSm9obiwzMA==
2. Buffer (Node.js):
Buffer.from("Hello World", 'utf-8')
3. File path (local):
/tmp/report.pdf
4. URL externa:
https://exemplo.com/arquivo.pdf
filename (string, obrigatório)
O que é: Nome do arquivo que aparecerá no Slack.
Exemplos:
relatorio-vendas-2025-01.pdf
logs-server-01.txt
backup-database.sql.gz
screenshot-error.png
title (string, opcional)
O que é: Título do arquivo exibido no Slack.
Padrão: Nome do arquivo (filename)
Exemplo:
{
"filename": "report.pdf",
"title": "Relatório Mensal de Vendas - Janeiro 2025"
}
initialComment (string, opcional)
O que é: Mensagem que acompanha o arquivo.
Padrão: undefined (sem comentário)
Suporta Markdown:
*Relatório pronto!*
@channel Por favor, revisar até amanhã
Flow completo para testar:
{
"name": "Upload com Comentário",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "slack_1",
"type": "slack_upload_file",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Upload Report",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "reports",
"file": "data:text/csv;base64,..base64..",
"filename": "vendas-jan.csv",
"title": "Vendas Janeiro 2025",
"initialComment": "📊 *Relatório pronto!*\n\n@channel Por favor, revisar os números."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "slack_1" },
{ "source": "slack_1", "target": "end_1" }
]
}
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| botToken | string | Sim | Token do Bot (xoxb-...) com scope files:write |
| channel | string | Sim | ID do canal/DM (C01234567, D01234567, U01234567) |
| file | string/buffer | Sim | Conteúdo do arquivo (base64, buffer, path, URL) |
| filename | string | Sim | Nome do arquivo (report.pdf, data.csv) |
| title | string | Não | Título exibido no Slack (padrão: filename) |
| initialComment | string | Não | Mensagem que acompanha o arquivo |
Exemplo 1: Enviar CSV de Vendas
Objetivo: Gerar e enviar relatório CSV automaticamente
JSON para Importar
{
"name": "Upload CSV Vendas",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Gerar CSV",
"parameters": {
"variableName": "csvData",
"value": "nome,valor,data\nJoão Silva,1500,2025-01-15\nMaria Santos,2500,2025-01-15\nPedro Costa,1800,2025-01-15"
}
}
},
{
"id": "slack_1",
"type": "slack_upload_file",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Upload CSV",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "vendas",
"file": "data:text/csv;base64,{{csvData | base64}}",
"filename": "vendas-diarias-2025-01-15.csv",
"title": "Relatório de Vendas - 15/01/2025",
"initialComment": "📊 *Relatório diário pronto!*\n\nTotal de vendas: 3\nValor total: R$ 5.800\n\n@channel"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "slack_1" },
{ "source": "slack_1", "target": "end_1" }
]
}
Saída esperada no Slack:
📊 Relatório diário pronto!
Total de vendas: 3
Valor total: R$ 5.800
@channel
[📄 vendas-diarias-2025-01-15.csv]
Relatório de Vendas - 15/01/2025
Exemplo 2: Backup Automático
Objetivo: Enviar backup de banco de dados diariamente
JSON para Importar
{
"name": "Backup Diário Slack",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "slack_1",
"type": "slack_upload_file",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Upload Backup",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "devops-backups",
"file": "/backups/database-2025-01-15.sql.gz",
"filename": "backup-prod-2025-01-15.sql.gz",
"title": "Backup Produção - 15/01/2025",
"initialComment": "✅ Backup automático concluído\n\n📅 Data: 15/01/2025\n⏰ Hora: 03:00 AM\n💾 Tamanho: 2.3 GB\n🗄️ Banco: PostgreSQL Prod"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "slack_1" },
{ "source": "slack_1", "target": "end_1" }
]
}
Exemplo 3: Log de Erros
Objetivo: Enviar arquivo de log quando ocorrer erro
JSON para Importar
{
"name": "Enviar Log Erro",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Erro Detectado",
"parameters": {
"variableName": "error",
"value": {
"timestamp": "2025-01-15T10:30:00Z",
"service": "API Gateway",
"message": "Connection timeout",
"stack": "Error at line 456..."
}
}
}
},
{
"id": "slack_1",
"type": "slack_upload_file",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Upload Log",
"parameters": {
"botToken": "xoxb-seu-token-aqui",
"channel": "alerts",
"file": "/var/logs/api-errors.log",
"filename": "api-errors-2025-01-15.log",
"title": "Log de Erros - API Gateway",
"initialComment": "🚨 *Erro detectado no sistema*\n\n🖥️ Serviço: {{error.service}}\n⏰ Timestamp: {{error.timestamp}}\n❌ Erro: {{error.message}}\n\n@devops Por favor, investigar!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "slack_1" },
{ "source": "slack_1", "target": "end_1" }
]
}
Resposta da Tool
{
"success": true,
"fileId": "F01234567ABC",
"url": "https://files.slack.com/files-pri/T012-F012/report.pdf",
"permalink": "https://myworkspace.slack.com/files/U012/F012/report.pdf",
"filename": "report.pdf"
}
Limites de Upload
| Plano Slack | Tamanho Máximo por Arquivo |
|---|---|
| Free | 5 MB |
| Pro | 20 GB |
| Business+ | 20 GB |
| Enterprise Grid | 20 GB |
Nota: Para arquivos grandes, considere usar storage externo (S3, Drive) e enviar link.
Tipos de Arquivo Suportados
✅ Documentos:
- PDF, DOC, DOCX, TXT, RTF
- XLS, XLSX, CSV
- PPT, PPTX
✅ Imagens:
- PNG, JPG, JPEG, GIF, BMP
- SVG, WEBP
✅ Código:
- JS, TS, PY, JAVA, GO, PHP
- JSON, XML, YAML, HTML, CSS
✅ Arquivos:
- ZIP, TAR, GZ, 7Z
- SQL, LOG, MD
✅ Áudio/Vídeo:
- MP3, WAV, MP4, AVI, MOV
Boas Práticas
✅ SIM:
- Usar nomes de arquivo descritivos com data
- Incluir title diferente de filename quando relevante
- Adicionar initialComment explicando o conteúdo
- Comprimir arquivos grandes (.zip, .gz)
- Validar tamanho antes de upload
- Usar canais específicos para tipos de arquivo (backups, reports, logs)
❌ NÃO:
- Não faça upload de arquivos com dados sensíveis sem criptografia
- Não envie arquivos enormes (use storage externo)
- Não faça upload de vírus ou malware (óbvio, mas...)
- Não abuse fazendo uploads em massa
Dicas
💡 Base64: Para gerar base64 de string: Buffer.from("texto").toString('base64')
💡 CSV Dinâmico: Gere CSV em tempo real e faça upload imediato
💡 Compressão: Use .gz para arquivos de log grandes
💡 Múltiplos canais: Envie para vários canais separando IDs por vírgula
💡 Threads: Use thread_ts para anexar arquivo em thread existente
💡 Private URLs: URLs retornadas são privadas - apenas membros do workspace podem acessar
Erros Comuns
file_too_large
Causa: Arquivo excede limite do plano Solução: Comprima ou use storage externo + link
invalid_file_type
Causa: Tipo de arquivo não suportado Solução: Converta para formato aceito ou envie como .txt
missing_scope
Causa: Bot não tem scope files:write
Solução: Adicione scope e reinstale app
channel_not_found
Causa: Channel ID inválido Solução: Verifique o ID do canal
Files Upload V2 API
Slack tem nova API files.uploadV2 para arquivos grandes (>1 MB):
Vantagens:
- Suporta arquivos maiores
- Upload em chunks
- Melhor performance
Código exemplo:
// Upload em 2 etapas
// 1. Obter upload URL
const getUploadUrl = await slack.files.getUploadURLExternal({
filename: 'large-file.zip',
length: fileSize
});
// 2. Upload via HTTP
await axios.put(getUploadUrl.upload_url, fileBuffer);
// 3. Completar upload
await slack.files.completeUploadExternal({
files: [{ id: getUploadUrl.file_id }],
channel_id: 'C01234567'
});
Próxima Tool
→ SLACK_SEND_MESSAGE - Enviar mensagem → SLACK_CREATE_CHANNEL - Criar canal → SLACK_REACT_MESSAGE - Adicionar reação