> ## 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.

# Concluir um upload em partes

> Finalize um upload em partes com PATCH /v1/objects/chunked: o servidor junta as partes recebidas no arquivo final, que passa a contar na sua cota.

<ParamField header="Authorization" type="string" placeholder="Chave da API" required>
  A chave da API para sua conta. Você pode encontrá-la nas [configurações da conta](https://squarecloud.app/pt-br/account/security).
</ParamField>

O Concluir Upload junta as partes enviadas com o [Enviar Parte](/pt-br/blob-reference/endpoint/chunked-part) no arquivo final. A lista de partes é lida no servidor, então você só envia o token `upload`. Quando ele responde, o arquivo está armazenado e conta na sua cota. Exige o escopo `blob:write`, ou o token de upload que abriu o upload, e um plano ativo.

O que acontece em uma recusa depende da causa:

* **O upload continua aberto** quando a conta não tem plano ativo (`PERMISSION_DENIED`), passou da cota (`STORAGE_QUOTA_EXCEEDED`) ou o armazenamento está indisponível (503). Corrija a causa e chame o Concluir de novo, sem reenviar nenhuma parte.
* **O upload é cancelado** e as partes são descartadas quando o arquivo é menor que 512 bytes (`FILE_TOO_SMALL`) ou maior que o seu limite (`FILE_TOO_LARGE`).
* **Nada muda** quando nenhuma parte foi enviada ainda (`NO_CHUNKS_UPLOADED`) ou uma parte que não é a última tem menos de 5 MB (`CHUNK_TOO_SMALL`): reenvie essa parte e conclua de novo.

## Parâmetros

<ParamField body="upload" type="string" required>
  O token `upload` retornado pelo Início de Upload em Partes. Ele também pode ir no parâmetro de query `upload`.
</ParamField>

## Limites de taxa

<Note>5 requisições a cada 10 segundos, para que vários uploads em paralelo possam terminar juntos (`RATE_LIMITED`, 429).</Note>

## Resposta

<ResponseField name="status" type="string">
  "success" se bem-sucedida, "error" caso contrário.
</ResponseField>

<ResponseField name="response" type="object">
  <Expandable title="Alternar objeto">
    <ResponseField name="id" type="string">
      O id do arquivo armazenado.
    </ResponseField>

    <ResponseField name="private" type="boolean">
      Se o arquivo é privado.
    </ResponseField>

    <ResponseField name="url" type="string | null">
      A URL pública, ou `null` para arquivos privados.
    </ResponseField>

    <ResponseField name="expires_at" type="ISO 8601">
      Quando o arquivo será excluído. Presente apenas quando ele expira.
    </ResponseField>

    <ResponseField name="size" type="number">
      O tamanho do arquivo, em bytes.
    </ResponseField>

    <ResponseField name="parts" type="number">
      Quantas partes foram juntadas.
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={"system"}
  curl --request PATCH \
    --url 'https://blob.squarecloud.app/v1/objects/chunked' \
    --header 'Authorization: YOUR_API_KEY' \
    --header 'Content-Type: application/json' \
    --data '{ "upload": "UPLOAD_TOKEN" }'
  ```

  ```javascript JavaScript theme={"system"}
  const response = await fetch('https://blob.squarecloud.app/v1/objects/chunked', {
    method: 'PATCH',
    headers: {
      Authorization: 'YOUR_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ upload: uploadToken }),
  });
  ```
</RequestExample>

<ResponseExample>
  ```json theme={"system"}
  {
    "status": "success",
    "response": {
      "id": "prv/3155597145698959364/genomics/dataset_mugws5c0-3c59dc048e8850243be8079a5c74d079.fastq.gz",
      "private": true,
      "url": null,
      "size": 2147483648,
      "parts": 128
    }
  }
  ```
</ResponseExample>

## Erros

| Código | HTTP | Quando |
| - | - | - |
| `INVALID_UPLOAD_TOKEN` | 400 | O token `upload` está ausente, malformado ou não é seu. |
| `NO_CHUNKS_UPLOADED` | 400 | Nenhuma parte foi enviada ainda. |
| `CHUNK_TOO_SMALL` | 400 | Uma parte que não é a última tem menos de 5 MB. |
| `FILE_TOO_SMALL` | 400 | O arquivo tem menos de 512 bytes. O upload é cancelado. |
| `PERMISSION_DENIED` | 401 | A conta não tem um plano ativo. O upload continua aberto. |
| `STORAGE_QUOTA_EXCEEDED` | 403 | O arquivo ultrapassaria o armazenamento incluído. O upload continua aberto. |
| `UPLOAD_NOT_FOUND` | 404 | O upload foi concluído, cancelado ou expirou. |
| `FILE_TOO_LARGE` | 413 | O arquivo passa do seu limite de tamanho. O upload é cancelado. |
| `RATE_LIMITED` | 429 | Mais de 5 requisições em 10 segundos. |
| `UPLOAD_FAILED` | 500 | A junção falhou. Tente novamente. |
| `PRIVATE_STORAGE_UNAVAILABLE` / `PUBLIC_STORAGE_UNAVAILABLE` | 503 | O armazenamento está temporariamente indisponível. O upload continua aberto. |

## Relacionados

* SDK do Blob: [`blob.put()`](/pt-br/sdks/blob/uploads) executa todo o fluxo em partes para arquivos acima de 90 MiB


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