> ## 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 Go: upload e commit de arquivos

> Crie aplicações a partir de um zip com c.Apps.Create e envie arquivos para uma aplicação existente com c.Apps.Commit, em stream de qualquer io.Reader.

Cada trecho abaixo roda sozinho dentro deste programa: cole um de cada vez em `main` e execute o `goimports` (veja [Executando os exemplos](/pt-br/sdks/go/client#executando-os-exemplos)).

```go theme={"system"}
package main

import (
	"context"
	"os"

	"github.com/squarecloudofc/sdk-api-go/v3"
)

var (
	ctx   = context.Background()
	c     = squarecloud.New(os.Getenv("SQUARECLOUD_API_KEY"))
	appID = "abc123def456abc123def456"
)

func main() {
	// Paste one snippet here, then run goimports.
}
```

## Entradas aceitas

`Apps.Create` e `Apps.Commit` aceitam qualquer `io.Reader` e o transmitem como `multipart/form-data`, sem nunca carregá-lo na memória:

| Entrada | Observações |
| - | - |
| `*os.File` | Transmitido do disco com um `Content-Length`. Seu nome base é usado como nome do arquivo. Pode ser tentado novamente em um 503 `UPLOAD_BUSY` |
| `*bytes.Reader`, `*strings.Reader` (qualquer `io.ReaderAt` que também seja um `io.Seeker`) | Enviado com um `Content-Length`. Pode ser tentado novamente em um 503 `UPLOAD_BUSY` |
| Qualquer outro `io.Reader` (um pipe, um corpo de resposta, ...) | Enviado em chunks, em uma única tentativa: não pode ser reenviado |

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 quando o tamanho é conhecido, ou assim que o stream passa de 100 MB, caso contrário. Os uploads **não têm prazo padrão**: cancele-os com o `ctx`.

## Criando uma aplicação

`Apps.Create(ctx, zip)` faz o deploy de um `.zip` que contém um arquivo de configuração [`squarecloud.app`](/pt-br/getting-started/config-file) na raiz.

```go theme={"system"}
f, err := os.Open("bot.zip")
if err != nil {
	log.Fatal(err)
}
defer f.Close()

app, err := c.Apps.Create(ctx, f)
if err != nil {
	log.Fatal(err)
}

fmt.Println(app.ID, app.Name, app.RAM, app.CPU, app.Language.Name, app.Language.Version)
fmt.Println(app.Domain)  // "<subdomain>.squareweb.app" for web apps, "" otherwise
fmt.Println(app.Cluster) // the cluster the app was placed on
```

| Campo | Descrição |
| - | - |
| `ID` (`id`) | O id da nova aplicação |
| `Name` (`name`) | Nome vindo do arquivo de configuração |
| `Description` (`description`) | `""` quando não definido |
| `Domain` (`domain`) | Host completo `<subdomain>.squareweb.app`; `""` para aplicações que não são web |
| `Cluster` (`cluster`) | Cluster em que a aplicação foi alocada |
| `RAM` / `CPU` (`ram` / `cpu`) | Recursos alocados (`CPU` é um `float64`) |
| `Language` (`language`) | `Name` e `Version` |

## Fazendo commit em uma aplicação

`Apps.Commit(ctx, appID, r, path, filename)` envia um arquivo para uma aplicação existente:

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

O nome do arquivo é `filename`, senão o próprio nome do reader (o nome base de um `*os.File`), senão `commit.zip`. Passe `""` para usar o padrão.

```go theme={"system"}
// Unpack a zip at the root
build, err := os.Open("build.zip")
if err != nil {
	log.Fatal(err)
}
defer build.Close()
if err := c.Apps.Commit(ctx, appID, build, "", ""); err != nil {
	log.Fatal(err)
}

// Unpack a zip into /src
patch, err := os.Open("patch.zip")
if err != nil {
	log.Fatal(err)
}
defer patch.Close()
if err := c.Apps.Commit(ctx, appID, patch, "/src", ""); err != nil {
	log.Fatal(err)
}

// A single file from memory: /src/index.js
code := strings.NewReader(`console.log("Hello from Square Cloud");`)
if err := c.Apps.Commit(ctx, appID, code, "/src", "index.js"); err != nil {
	log.Fatal(err)
}
```

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

## Cancelando um upload

```go theme={"system"}
ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
defer cancel()

f, err := os.Open("bot.zip")
if err != nil {
	log.Fatal(err)
}
defer f.Close()

_, err = c.Apps.Create(ctx, f)
if errors.Is(err, context.DeadlineExceeded) {
	fmt.Println("the upload took too long")
}
```

Um upload cancelado retorna um `*APIError` (`NETWORK_ERROR` quando o `ctx` foi cancelado, `TIMEOUT` quando seu prazo expirou) que faz unwrap para `context.Canceled` ou `context.DeadlineExceeded`.

## 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 quando o reader pode ser reenviado |

Abrir o arquivo fica a cargo do seu código, então um erro de `os.Open` nunca chega ao SDK. Um reader `nil` retorna um erro simples, não um `*APIError`. Veja [Erros](/pt-br/sdks/go/errors) para a lista completa.

## Próximos passos

<CardGroup cols={3}>
  <Card title="Gerenciando arquivos" icon="folder-open" href="/pt-br/sdks/go/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.