# Uploads grandes (gráfica)

Os limites efetivos vêm do **PHP** e do **servidor web**. O `upload.php` só valida `max_bytes` em [config.php](config.php) depois que o PHP já aceitou o arquivo.

## PHP (`php.ini` ou pool FPM)

- `upload_max_filesize` — tamanho máximo por arquivo (ex.: `512M`).
- `post_max_size` — deve ser **maior ou igual** a `upload_max_filesize` (ex.: `520M`).
- `max_execution_time` / `max_input_time` — aumentar para uploads lentos (ex.: `600`).

Reinicie PHP-FPM ou Apache após alterar.

## Apache

- [`.htaccess`](.htaccess) inclui exemplos com `php_value` e `LimitRequestBody`. Em muitos hosts compartilhados `php_value` em `.htaccess` está desativado; use `php.ini` ou painel do provedor.
- Se usar **proxy reverso** na frente do Apache, confira limites do proxy também.

## Nginx

No `server` ou `location` que encaminha para o PHP:

```nginx
client_max_body_size 520m;
```

No upstream PHP (timeouts):

```nginx
fastcgi_read_timeout 600s;
fastcgi_send_timeout 600s;
```

## Variáveis de ambiente (opcional)

| Variável | Descrição |
|----------|-----------|
| `UPLOAD_BASE_URL` | URL base pública (ex.: `https://forms.exemplo.com`). |
| `UPLOAD_API_KEY` | Se definida, exige header `X-Api-Key` ou POST `api_key`. |
| `UPLOAD_MAX_BYTES` | Teto extra em bytes (ex.: `536870912` = 512 MiB). `0` desliga. |
| `UPLOAD_DEFAULT_CLIENT` | Pasta usada quando nenhum campo `client` / aliases vier no POST (ex.: integração que não envia pasta). |
| `UPLOAD_CLIENT_SLUGIFY` | `1` (padrão) ou `0` — desliga a normalização slug (volta ao modo estrito). |

## Pasta do cliente (`client`) e integrações

O POST aceita o primeiro valor não vazio entre o campo principal (`client` por padrão) e os aliases em [config.php](config.php): `pasta`, `cliente`, `folder`, `slug`, `client_slug`.

Com **`client_slugify`** ligado (padrão), valores com espaços, acentos ou barras viram um nome de pasta seguro (ex.: `Receita RD Station` → `receita-rd-station`). Se a ferramenta **não enviar** nenhum desses campos, defina **`UPLOAD_DEFAULT_CLIENT`** no servidor (ex.: `receita-rdstation`) para gravar sempre nessa pasta.

## CORS (navegador / SPA em outro domínio)

O [upload.php](upload.php) envia `Access-Control-Allow-Methods: POST, OPTIONS`, `Access-Control-Allow-Headers` (inclui `X-Api-Key` para preflight quando o front envia esse header) e `Access-Control-Max-Age`. Requisições `OPTIONS` respondem **204** sem corpo.

Em produção, prefira origens explícitas em vez de `*`, por exemplo:

`UPLOAD_CORS_ORIGIN=https://meu-site.com,https://admin.meu-site.com`

## Teste com curl

```bash
curl -sS -X POST \
  -F "client=miligrama" \
  -F "file=@/caminho/arquivo.pdf" \
  "https://seu-dominio/upload.php"
```

Com API key:

```bash
curl -sS -X POST -H "X-Api-Key: sua-chave" \
  -F "client=miligrama" \
  -F "file=@/caminho/arquivo.pdf" \
  "https://seu-dominio/upload.php"
```
