# Upload e download de objetos no Object Storage

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

O **Object Storage** da Azion permite que você crie buckets, armazene e gerencie dados no Edge e integre seu armazenamento de objetos à sua infraestrutura de edge de forma simples — o jeito mais rápido de começar é usando o **Azion Console**, mas você também pode automatizar processos via API ou Azion Runtime; este guia abrange como fazer upload e download de objetos de um bucket usando o Console, a [API da Azion](https://api.azion.com) e o [Azion Runtime](/pt-br/documentacao/runtime/api-reference/storage/).

<DocButton href="/pt-br/documentacao/produtos/store/object-storage/" label="saiba mais sobre Object Storage" kind="secondary" size="medium" />

Consulte o guia [Como criar e modificar um bucket de Object Storage da Azion](/pt-br/documentacao/produtos/guias/criar-e-modificar-um-bucket/) para operações em buckets.

---

## Get started em 30 segundos (via Console)

A interface gráfica é ideal para uploads rápidos e configurações iniciais.

1. **Acesse o Console:** Navegue até o menu [Object Storage](https://console.azion.com/object-storage).
2. **Crie seu Bucket:** Clique em **+ Bucket**.
* **Name:** Escolha um nome exclusivo.
* **Workloads Access:** Selecione como a rede da Azion acessará os dados. Recomendamos **Read Only** para servir conteúdo estático.


3. **Faça o Upload:** Entre no bucket criado e arraste seus arquivos diretamente para a interface ou use o botão de upload.

Pronto! Seus arquivos agora estão na infraestrutura global da Azion.


---

## Via API

O Object Storage da Azion é totalmente exposto via [API v4 da Azion](https://api.azion.com). O Azion Console consome essas APIs, portanto todas as ações disponíveis no Console podem ser executadas diretamente via API, permitindo automação completa.

Isso permite integrar o Object Storage a pipelines de CI/CD, rotinas automatizadas e aplicações, sem dependência da interface gráfica.

1. Crie um token para acesso no menu **Personal token** no Azion Console: https://console.azion.com/personal-tokens.

2. **Criar um bucket** chamado `statics_test`.

```bash
   curl --request POST \
     --url https://api.azion.com/v4/workspace/storage/buckets \
     --header 'Accept: application/json' \
     --header 'Authorization: Token AZION_PERSONAL_TOKEN' \
     --header 'Content-Type: application/json' \
     --data '{
     "name": "statics_test",
     "workloads_access": "read_only"
   }'
```

3. **Upload de objetos.**

```bash
   curl --request POST \
     --url https://api.azion.com/v4/workspace/storage/buckets/statics_test/objects/logo.svg \
     --header 'Accept: application/json' \
     --header 'Authorization: Token AZION_PERSONAL_TOKEN' \
     --header 'Content-Type: application/octet-stream' \
     --data @logo.svg
```

4. **Listar objetos.**

```bash
   curl --request GET \
     --url https://api.azion.com/v4/workspace/storage/buckets/statics_test/objects \
     --header 'Accept: application/json' \
     --header 'Authorization: Token AZION_PERSONAL_TOKEN'
```


## Faça download de objeto de um bucket

Para fazer o download de um objeto, execute a seguinte requisição `GET` em seu terminal, substituindo `[TOKEN VALUE]` por seu [personal token](/pt-br/documentacao/produtos/guias/personal-tokens/), `<bucket_name>` pelo nome do seu bucket, e `<object_key>` pela chave criada para o objeto:

```bash
curl --location 'https://api.azion.com/v4/storage/buckets/<bucket_name>/objects/<object_key>' \
--header 'Accept: application/json; version=3' \
--header 'Authorization: Token [TOKEN VALUE]'
```

Você agora deve ver o conteúdo do objeto em seu terminal.

:::note
Para fazer o download do objeto para o seu dispositivo localmente, adicione as opções cURL `-O` para usar o nome do objeto fornecido no cabeçalho e `-J` para escrever o output em um arquivo.

```bash
curl --location 'https://api.azion.com/v4/storage/buckets/<bucket_name>/objects/<object_key> -O -J' \
--header 'Accept: application/json; version=3' \
--header 'Authorization: Token [TOKEN VALUE]'
```

Ao trabalhar com arquivos que têm um prefixo na object key, como `pasta/arquivo.csv`, usar essas opções não criará um novo diretório. Em vez disso, o arquivo será baixado diretamente para a pasta raiz onde o comando foi iniciado.
:::

---

## Via Azion Runtime

Você pode criar uma function para fazer upload de arquivos para seu bucket usando um comando de console `POST` e verificar se um arquivo está disponível usando um comando de console `GET`. Para fazer isso:

1. Accesse o [Azion Console](/pt-br/documentacao/produtos/guias/como-acessar-o-azion-console/) > **Functions**.
2. Clique no botão **Add Function**.
3. Dê um nome a sua função. Exemplo: `my-bucket POST+GET`.
4. Na aba **Code**, adicione o seguinte código JavaScript:

```js
import Storage from "azion:storage";
async function doGet(path, bucket_name) {
    console.log(`Path: ${path}`);
    const storage = new Storage(bucket_name);
    // content is an StorageObject
    const asset = await storage.get(path);
    return new Response(await asset.arrayBuffer(), {
        headers: {
            "Content-Type": asset.contentType
        },
    });
}

async function doPost(path, content_type, value, bucket_name) {
    console.log(`Path: ${path}`);
    let options = {
        "Content-Type": content_type
    }
    console.log(`Options: ${options}`);
    const storage = new Storage(bucket_name);
    await storage.put(path, value, options);
    return new Response("Object added.");
}

async function router(event) {
    const request = event.request;
    const method = request.method;
    const path = decodeURI(new URL(request.url).pathname);
    const bucket_name = event.args.bucket;
    if (method === "POST") {
        let content_type = request.headers.get("Content-Type");
        let content = await request.arrayBuffer();
        return doPost(path, content_type, content, bucket_name);
    } else if (method === "GET") {
        return doGet(path, bucket_name);
    } else {
        throw new Error(`Invalid method: ${method}. Expected POST or GET.`);
    }
}
addEventListener("fetch", (event) => {
    event.respondWith(
        router(event)
    );
});
```

| Variável | Descrição |
| --- | --- |
| `path` | Caminho do objeto. Exemplo: `./path/file.csv` |
| `bucket_name` | Nome do bucket. Exemplo: `my-bucket` |
| `content_type` | MIME type do objeto. Exemplo: `text/csv` |
| `value` | Conteúdo do objeto em data binary |

5. Na aba **Arguments**, adicione o objeto com a propriedade `bucket` e, como valor, o nome do bucket em string.

```json
{
  "bucket": "my-bucket"
}
```

6. Clique no botão **Save**.

:::note
Consulte a referência [Object Storage API](/pt-br/documentacao/runtime/api-reference/storage/) para mais detalhes sobre as funções disponíveis para outros tipos de requisições.
:::

Após criar a function, você precisa criar uma application que vai intermediar o processo de upload para o bucket.

1. Acesse o [Azion Console](https://console.azion.com).
2. Selecione a opção **Start with a template** na página inicial.
3. Selecione a opção **Build from scratch**.
4. Dê um nome fácil de lembrar para a sua aplicação. Exemplo: `my-bucket Proxy`.
5. Selecione a opção **Run a Function**.
6. Em **Choose Function**, selecione a function que você criou nos passos anteriores.
7. Clique no botão **Next**.
8. Copie o link da application. Ele deve estar no formato `http://xxxxxxxxxx.map.azionedge.net`.
9. Execute o seguinte comando em seu terminal para fazer o upload de um objeto:

```
curl -v http://xxxxxxxxxx.map.azionedge.net ./path/file.csv txt/csv --data-binary @./path/file.csv my-bucket
```

10. Execute o seguinte comando em seu terminal para fazer o download de um objeto:

```
curl -v http://xxxxxxxxxx.map.azionedge.net ./path/file.csv my-bucket
```

O download do objeto deve ocorrer na pasta onde as requisições estão sendo executadas.

---