# Implemente upload de arquivos com Functions

import DocButton from '~/components/webkit/DocButton.vue';

Este guia demonstra como implementar funcionalidade segura de upload de arquivos usando Azion Functions e Object Storage. Ao lidar com uploads de arquivos no edge, você pode fornecer velocidades de upload mais rápidas e melhor experiência do usuário mantendo segurança e escalabilidade.

:::tip
Esta demonstração mostra como aproveitar Functions para operações de upload de arquivos garantindo melhores práticas de segurança e performance otimizada no edge.
:::

## Requisitos

Antes de começar, certifique-se de ter:

- Uma [conta na Azion](https://console.azion.com/)
- [Azion CLI](/pt-br/documentacao/produtos/azion-cli/visao-geral/) instalada e configurada
- [Node.js](https://nodejs.org/) versão 18 ou superior
- **Object Storage** habilitado em sua conta Azion

## Código

Este é um exemplo de código de como usar Functions com Object Storage para implementar uma funcionalidade de upload de arquivos. O exemplo completo do código você pode encontrar no [repositório GitHub](https://github.com/egermano/edge-functions-examples/tree/main/packages/file-upload).

```typescript
import type { AzionBucketObject, AzionStorageResponse } from "azion/storage";
import { createObject } from "azion/storage";
import { Hono } from "hono";
import { fire } from "hono/service-worker";

const app = new Hono();

app.post("/upload", async (c) => {
  const body = await c.req.parseBody();
  const file = body["file"]; // File | string

  // First check if file is a valid File object
  if (
    !file ||
    typeof file !== "object" ||
    typeof file.arrayBuffer !== "function"
  ) {
    return c.json({ message: "Invalid file" }, 400);
  }

  // Check if file size exceeds 2MB limit
  const maxSize = 2 * 1024 * 1024; // 2MB
  if (file.size > maxSize) {
    return c.json({ message: "File size exceeds 2MB limit" }, 413);
  }

  try {
    const { data: newObject, error }: AzionStorageResponse<AzionBucketObject> =
      await createObject({
        bucket: process.env.BUCKET_NAME!,
        key: file.name,
        // @ts-expect-error content is wrongly typed
        content: await file.arrayBuffer(),
      });

    if (error) {
      throw new Error(error.message);
    }

    if (newObject) {
      console.log(`Object created with key: ${newObject.key}`);
    } else {
      console.error("Failed to create object", error);
    }

    // @ts-expect-error content is wrongly typed
    const content = new Uint8Array(newObject.content);

    return c.body(content, {
      status: 200,
      headers: {
        "Content-Type": file.type,
        "Content-Disposition": `attachment; filename="${newObject?.key}"`,
        "Content-Length": newObject?.size?.toString() ?? "0",
      },
    });
  } catch (error) {
    console.error("Error uploading file:", error);
    return c.json({ message: "Error uploading file" }, 500);
  }
});

fire(app);
```

## Deploy na Azion

### Passo 1: Autentique-se na Azion

1. Faça login na sua conta Azion via CLI:

```bash
azion login
```

2. Siga os prompts de autenticação para conectar sua CLI com sua conta Azion.

### Passo 2: Faça o deploy da Function

Faça o deploy de sua aplicação de upload de arquivos na edge network da Azion:

```bash
azion deploy
```

O processo de deploy irá:

- Fazer upload do código da sua Function
- Configurar a application
- Configurar as regras de roteamento necessárias
- Configurar permissões de armazenamento
- Fornecer um domínio único

### Passo 3: Configure permissões de armazenamento

1. Acesse **Console Azion** > **Object Storage**
2. Selecione seu bucket de armazenamento
3. Configure permissões apropriadas para sua Function ler/escrever arquivos

### Passo 4: Acesse sua aplicação

Após o deploy, você receberá um domínio como `https://xxxxxxx.map.azionedge.net`. Sua aplicação de upload de arquivos estará disponível nesta URL em alguns minutos após a propagação do DNS.

## Entendendo a implementação

### Processo de upload de arquivos

A Function de upload de arquivos tipicamente manipula:

1. **Validação de requisição**: Verificação de tipos de arquivo, tamanhos e segurança
2. **Parsing de formulário multipart**: Processamento de requisições multipart/form-data
3. **Processamento de arquivo**: Validação e preparação de arquivos para armazenamento
4. **Upload para armazenamento**: Armazenamento de arquivos no Object Storage
5. **Geração de resposta**: Retorno de status de upload e informações do arquivo

### Considerações de segurança

- **Validação de tipo de arquivo**: Permitir apenas tipos específicos de arquivo
- **Limites de tamanho**: Impor restrições de tamanho máximo de arquivo
- **Scanning de vírus**: Implementar detecção de malware quando possível
- **Controle de acesso**: Validar permissões do usuário antes dos uploads
- **Sanitização de entrada**: Limpar nomes de arquivos e metadados

### Principais benefícios

- **Performance**: Processamento de upload no edge reduz latência
- **Escalabilidade**: Escala automaticamente com a demanda
- **Alcance global**: Edge locations oferecem cobertura mundial
- **Eficiência de custo**: Transferência de dados e custos de armazenamento otimizados

## Testando sua aplicação de upload de arquivos

### Passo 1: Teste a funcionalidade de upload de arquivos

1. Navegue até sua aplicação implementada
2. Use o formulário de upload para testar vários tipos de arquivo
3. Verifique se os arquivos são armazenados com sucesso em seu bucket Object Storage
4. Teste limites de tamanho e restrições de tipo de arquivo

### Passo 2: Teste recursos de segurança

1. **Validação de tipo de arquivo**: Tente fazer upload de tipos de arquivo restritos
2. **Limites de tamanho**: Teste com arquivos que excedem seu limite de tamanho
3. **Arquivos maliciosos**: Teste com arquivos contendo conteúdo suspeito
4. **Path traversal**: Verifique sanitização de nomes de arquivos

### Passo 3: Testes de performance

1. **Velocidade de upload**: Teste com vários tamanhos de arquivo
2. **Uploads simultâneos**: Teste múltiplos uploads simultâneos
3. **Tratamento de erros**: Teste interrupções de rede e falhas

## Casos de uso comuns

- **Gerenciamento de documentos**: Upload e armazenamento de documentos comerciais
- **Galerias de imagens**: Lidar com uploads de fotos e imagens
- **Conteúdo de mídia**: Processar uploads de arquivos de vídeo e áudio
- **Anexos de formulários**: Lidar com anexos de arquivos em formulários web
- **Importação de dados**: Processar uploads de arquivos CSV e de dados

## Solução de problemas

### Problemas comuns e soluções

- **Falhas de upload**: Verifique limites de tamanho de arquivo e tipos permitidos
- **Erros de armazenamento**: Verifique permissões do bucket e configuração
- **Problemas de performance**: Otimize processamento de arquivos e operações de armazenamento
- **Questões de segurança**: Revise lógica de validação e sanitização de arquivos

### Melhores práticas de tratamento de erros

1. **Mensagens de erro claras**: Forneça feedback específico aos usuários
2. **Registros**: Implemente registros abrangentes de erros
3. **Mecanismos de retry**: Lide com falhas temporárias eficientemente
4. **Indicadores de progresso**: Mostre progresso de upload para arquivos grandes

## Recursos avançados

### Implementando processamento de arquivos

Você pode estender a funcionalidade básica de upload com:

- **Redimensionamento de imagens**: Redimensionar automaticamente imagens enviadas
- **Conversão de formato**: Converter arquivos para diferentes formatos
- **Extração de metadados**: Extrair e armazenar metadados de arquivos
- **Geração de thumbnails**: Criar imagens de pré-visualização

### Adicionando autenticação

Implemente autenticação de usuário para proteger uploads de arquivos:

```javascript
// Exemplo de verificação de autenticação
function authenticateUser(request) {
    const authHeader = request.headers.get('Authorization');
    // Implemente sua lógica de autenticação
    return validateToken(authHeader);
}
```

## Próximos passos

- Explore técnicas avançadas de processamento de arquivos
- Implemente recursos de exclusão e gerenciamento de arquivos
- Adicione autenticação e autorização de usuário
- Integre com outros produtos Azion como Cache
- Monitore performance de upload e otimize adequadamente

---

<DocButton href="/pt-br/documentacao/produtos/store/object-storage/" label="Saiba mais sobre Object Storage" size="medium" />
<DocButton href="/pt-br/documentacao/produtos/build/applications/functions/" label="Saiba mais sobre Functions" size="medium" />