> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# SDK Python: upload e commit de arquivos

> Crie aplicações a partir de um zip com apps.create() e envie arquivos para uma aplicação existente com apps.commit(), de um caminho, bytes ou arquivo binário.

Os exemplos usam o `client` de [Criando o cliente](/pt-br/sdks/py/client#criando-o-cliente). `app_id` é o id de uma das suas aplicações: [`client.account.me()`](/pt-br/sdks/py/client#conta) lista todas.

## Entradas aceitas

`apps.create()` e `apps.commit()` aceitam:

| Entrada | Observações |
| - | - |
| Um caminho de arquivo (`str` ou `os.PathLike`) | Transmitido do disco, nunca lido para a memória. O nome do arquivo é usado como nome do arquivo enviado |
| `bytes` (ou `bytearray`, `memoryview`) | Enviado a partir da memória |
| Um objeto de arquivo binário (`open(path, "rb")`, `io.BytesIO`, ...) | Um arquivo com suporte a seek é transmitido a partir da sua posição atual; seu `name`, se houver, é usado como nome do arquivo. Um sem suporte a seek (um pipe) é lido para a memória primeiro |

Os uploads são **limitados a 100 MB**. Um arquivo maior falha localmente com `FILE_TOO_LARGE` (status `0`) antes que qualquer coisa seja enviada. Os uploads são transmitidos em stream e **não têm timeout** depois de conectados (veja [Timeouts](/pt-br/sdks/py/client#timeouts)).

## Criando uma aplicação

`apps.create(file)` faz o deploy de um `.zip` que contém um arquivo de configuração [`squarecloud.app`](/pt-br/getting-started/config-file) na raiz. `bytes` e objetos de arquivo sem nome são enviados como `app.zip`.

```python theme={"system"}
app = client.apps.create("./bot.zip")

print(app["id"], app["name"], app["ram"], app["cpu"], app["language"]["name"], app["language"]["version"])
print(app.get("domain"))  # "<subdomain>.squareweb.app" for web apps, absent otherwise
print(app.get("cluster"))  # the cluster the app was placed on
```

| Campo | Descrição |
| - | - |
| `id` | O id da nova aplicação |
| `name` | Nome vindo do arquivo de configuração |
| `description` | Presente apenas quando definido |
| `domain` | Host completo `<subdomain>.squareweb.app`; ausente para aplicações que não são web |
| `cluster` | Cluster em que a aplicação foi alocada |
| `ram` / `cpu` | Recursos alocados |
| `language` | `{ name, version }` |

## Fazendo commit em uma aplicação

`apps.commit(app_id, file, path=None, filename=None)` envia um arquivo para uma aplicação existente. `path` e `filename` são keyword-only.

* Um `.zip` é **descompactado** em `path` (a raiz da aplicação por padrão).
* Qualquer outro arquivo vai para `path/<filename>`.

O nome do arquivo é `filename`, senão o próprio nome do arquivo (caminho ou objeto de arquivo), senão `commit.zip`.

```python theme={"system"}
# Unpack a zip at the root
client.apps.commit(app_id, "./build.zip")

# Unpack a zip into /src
client.apps.commit(app_id, "./patch.zip", path="/src")

# A single file from memory: /src/index.js
client.apps.commit(app_id, code.encode(), path="/src", filename="index.js")
```

Um commit não reinicia a aplicação. Chame [`apps.restart()`](/pt-br/sdks/py/managing_application#iniciar-parar-e-reiniciar) para aplicá-lo.

## Cancelando um upload

Uploads em Python não podem ser cancelados depois de enviados: `apps.create()` e `apps.commit()` não têm argumento `signal` nem de cancelamento, e não têm timeout depois de conectados. A conexão em si é limitada por `timeout`.

Para manter o resto do seu programa responsivo durante um upload longo, execute-o com o `AsyncSquareCloud` (ele roda em uma thread de trabalho) ou em uma thread sua:

```python theme={"system"}
async with AsyncSquareCloud(os.environ["SQUARECLOUD_API_KEY"]) as client:
    app = await client.apps.create("./bot.zip")
```

## Erros

| Status | Código | Quando |
| - | - | - |
| 0 | `FILE_TOO_LARGE` | O arquivo tem mais de 100 MB (verificado localmente) |
| 400 | `INVALID_FILE`, `INVALID_FILENAME` | Nenhum arquivo, ou um nome de arquivo com separadores de caminho, `..` ou caracteres de controle |
| 400 | `INVALID_PATH` | `path` contém travessia de diretório ou metacaracteres de shell (commit) |
| 400 | `INSUFFICIENT_MEMORY` | Menos de 256 MB de memória disponível no plano (create) |
| 400 | `COMMIT_FAILED` | O commit não pôde ser aplicado (commit) |
| 400 | `UPLOAD_FAILED`, `STORAGE_UPLOAD_FAILED`, `CLUSTER_SELECTION_FAILED` | O upload não pôde ser processado (create) |
| 503 | `CLUSTER_MAINTENANCE_TRY_LATER` | O provisionamento está pausado para manutenção (create) |
| 503 | `UPLOAD_BUSY` | Uploads demais em andamento: tentado novamente de forma automática |

Um caminho local que não pode ser aberto (ou um arquivo que se torna ilegível no meio do upload) lança um `OSError`, não um `SquareCloudAPIError`. Um caminho inexistente falha antes que qualquer coisa seja enviada. Veja [Erros](/pt-br/sdks/py/errors) para a lista completa.

## Próximos passos

<CardGroup cols={3}>
  <Card title="Gerenciando arquivos" icon="folder-open" href="/pt-br/sdks/py/managing_files">
    Liste, leia, escreva, mova e exclua arquivos da aplicação.
  </Card>

  <Card title="Referência da API de upload" icon="code" href="/pt-br/api-reference/endpoint/apps/upload">
    Os endpoints REST por trás destes métodos.
  </Card>

  <Card title="Upload pela CLI" icon="terminal" href="/pt-br/cli-reference/deploy">
    As mesmas ações pelo terminal.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.