Implemente upload de arquivos com Functions
Construa um endpoint Hono que verifica o arquivo enviado e o grava em um bucket do Object Storage a partir de uma função.
Neste tutorial, você vai construir um endpoint de upload que armazena cada arquivo recebido em um bucket do Object Storage. Você vai criar um projeto Hono, escrever o handler de upload, criar um bucket com acesso de escrita, fazer o deploy do projeto e enviar um arquivo para ele.
O código completo deste exemplo está no pacote file-upload do repositório de exemplos de functions.
Pré-requisitos
- Uma conta Azion. Para criar uma, consulte Como criar uma conta na Azion.
- Azion CLI instalada. Consulte Azion CLI.
- Object Storage habilitado na sua conta. Consulte Object Storage.
- Node.js versão 18 ou superior.
- Um terminal e um editor de código.
1. Crie o projeto
Azion CLI cria um projeto a partir de um preset de framework. Para o passo a passo completo com Hono, consulte Deploy de aplicação Jamstack com Hono.
Para criar o projeto:
Execute o comando de login:
Sem as flags de credencial, a CLI abre um fluxo pelo navegador. Ela armazena as credenciais localmente, e todo comando seguinte é autorizado na sua conta.
Execute Azion CLI no diretório que guarda seus projetos:
Digite um nome ou pressione enter para aceitar a sugestão:
Azion CLI lista um preset por framework:
Os estágios seguintes fazem o deploy do projeto em vez de executá-lo localmente:
Azion CLI nomeia a pasta com o nome do projeto:
A pasta contém o código-fonte da aplicação Hono que o template fornece.
2. Escreva o handler de upload
O handler responde a uma requisição POST em /upload. Ele faz o parse do formulário multipart, verifica o arquivo e o grava em um bucket. A gravação passa pelo método createObject da Biblioteca Storage da Azion.
O campo entry do azion.config.js indica o arquivo de entrada do projeto. Abra esse arquivo e substitua o conteúdo dele por este código:
export default app é o padrão de handler ES Modules, que Azion recomenda em vez do padrão Service Worker. O código toma quatro decisões:
- Um campo
fileque não contém um arquivo retorna400com o corpo{"message":"Invalid file"}. - Um arquivo acima da constante
maxSizede 2 MB retorna413com o corpo{"message":"File size exceeds 2MB limit"}. createObjectgrava o arquivo no bucket nomeado pela variável de ambienteBUCKET_NAME. A chave do objeto é o nome do arquivo.- Uma falha dentro de
createObjectretorna500com o corpo{"message":"Error uploading file"}e a exceção chega aos logs da função.
3. Configure as permissões de armazenamento
O nível de acesso de um bucket decide o que Azion Runtime faz com ele. Uma função grava objetos apenas em um bucket cujo acesso é read_write. Um bucket definido como read_only responde a leituras e rejeita gravações. Azion Runtime não alcança nenhum conteúdo em um bucket definido como restricted.
O nome de um bucket é único entre todas as contas Azion. Ele tem de 6 a 63 caracteres, aceita letras, números e o hífen (-) e nunca começa com azion.
O handler lê o nome do bucket na variável de ambiente BUCKET_NAME. Para criar o bucket e armazenar seu nome:
O bucket existe na sua conta e Azion Runtime grava objetos nele.
Insira o mesmo nome que você deu ao bucket:
A variável fica armazenada na conta e a função a lê com Azion.env.get('BUCKET_NAME'). Uma variável cuja chave contém password, pwd, secret, key, hash, encrypted, passcode, auth ou token é enviada como secret por padrão. A chave BUCKET_NAME não contém nenhuma dessas substrings. A flag --secret tem true como valor padrão, então --secret false armazena o nome do bucket como um valor comum. Um novo valor alcança a função apenas depois de um novo deploy.
4. Faça o deploy do projeto
Para enviar o projeto para Azion:
Imprima a conta autenticada:
O terminal imprime o endereço de e-mail da conta em que os comandos são executados.
Na pasta do projeto, execute:
O deploy envia o código da função e configura a aplicação. Ele também cria as regras de roteamento, aplica as permissões de armazenamento e retorna um domínio. O domínio tem o formato https://xxxxxxx.map.azionedge.net. A propagação leva alguns minutos, então aguarde antes de fazer a requisição ao endpoint.
5. Verifique o upload
Para armazenar um arquivo pelo endpoint:
Escreva uma linha em um arquivo local:
O arquivo upload-test.txt existe no diretório atual.
Envie o arquivo em um formulário multipart, no campo file:
O corpo da resposta carrega o objeto armazenado:
Leia as chaves que o bucket contém:
A chave upload-test.txt aparece na lista.
O endpoint passa a armazenar todo arquivo que aceita. Uma requisição cujo campo file não contém um arquivo responde 400 e um arquivo acima de 2 MB responde 413. Quando uma requisição responde 500, leia os logs da função para encontrar a exceção.