Carregar uma imagem para um blob de Armazenamento do Azure com JavaScript

Use um aplicativo Web estático para carregar um arquivo em um blob de Armazenamento do Azure usando um pacote npm de @azure /blob de armazenamento do Azure com um token SAS de Armazenamento do Azure.

Pré-requisitos

  • Uma subscrição do Azure. Se ainda não tiver uma, pode inscrever-se numa conta gratuita do Azure.
  • Conta do GitHub para bifurcar e empurrar para um repo.

Arquitetura da aplicação

Esta arquitetura de aplicativo inclui dois recursos do Azure:

  • Aplicativos Web Estáticos do Azure para o aplicativo cliente gerado estaticamente. O recurso também fornece a API gerenciada do Azure Functions. Gerenciado significa que o recurso Static Web Apps gerencia o recurso de API para seu próprio uso.
  • Armazenamento do Azure para o armazenamento de blob.

Diagram showing how a customer interacts from their computer to use the website to upload a file to Azure Storage directly.

Passo Description
5 O cliente se conecta ao site gerado estaticamente. O site está hospedado em Aplicativos Web Estáticos do Azure.
2 O cliente usa esse site para selecionar um arquivo para carregar. Para este tutorial, a estrutura de front-end é Vite React e o arquivo carregado é um arquivo de imagem.
3 O site chama a API sas do Azure Functions para obter um token SAS com base no nome do arquivo exato a ser carregado. A API sem servidor usa o SDK de Armazenamento de Blob do Azure para criar o token SAS. A API retorna a URL completa a ser usada para carregar o arquivo, que inclui o token SAS como a cadeia de caracteres de consulta.
https://YOUR-STORAGE-NAME.blob.core.windows.net/YOUR-CONTAINER/YOUR-FILE-NAME?YOUR-SAS-TOKEN
4 O site front-end usa a URL do token SAS para carregar o arquivo diretamente no Armazenamento de Blobs do Azure.

Ambientes locais e de construção

Este tutorial usa os seguintes ambientes:

  • Desenvolvimento local com GitHub Codespaces ou Visual Studio Code.
  • Crie e implante com o GitHub Actions.

1. Repositório de aplicativos de exemplo fork com GitHub

Este tutorial usa ações do GitHub para implantar o aplicativo de exemplo no Azure. Você precisa de uma conta do GitHub e uma bifurcação do repositório de aplicativos de exemplo para concluir essa implantação.

  1. Em um navegador da Web, use o link a seguir para iniciar a bifurcação para sua própria conta do repositório de exemplo: Azure-Samples/azure-typescript-e2e-apps.
  2. Conclua as etapas para bifurcar a amostra apenas com o ramo principal .

2. Configurar o ambiente de desenvolvimento

Um ambiente de contêiner de desenvolvimento está disponível com todas as dependências necessárias para concluir cada exercício neste projeto. Você pode executar o contêiner de desenvolvimento no GitHub Codespaces ou localmente usando o Visual Studio Code.

O GitHub Codespaces executa um contêiner de desenvolvimento gerenciado pelo GitHub com o Visual Studio Code for the Web como interface do usuário. Para o ambiente de desenvolvimento mais simples, use o GitHub Codespaces para que você tenha as ferramentas e dependências de desenvolvedor corretas pré-instaladas para concluir este módulo de treinamento.

Importante

Todas as contas do GitHub podem usar o Codespaces por até 60 horas gratuitas por mês com 2 instâncias principais. Para obter mais informações, consulte GitHub Codespaces mensalmente incluído armazenamento e horas principais.

  1. Em um navegador da Web, na bifurcação do GitHub do repositório de exemplo, inicie o processo para criar um novo espaço de código GitHub na main ramificação da bifurcação selecionando o botão CÓDIGO .

    GitHub screenshot of Code Spaces buttons for a repository.

  2. Na guia Codespaces, selecione as reticências, ....

    GitHub screenshot of Code Spaces tab with ellipsis control highlighted.

  3. Selecione + Novo com opções para selecionar um contêiner de desenvolvimento Codespaces específico.

    GitHub screenshot of Codespaces New with options menu item highlighted.

  4. Selecione as seguintes opções e, em seguida, selecione Criar espaço de código.

    • Filial: main
    • Configuração do contêiner de desenvolvimento: Tutorial: Upload file to storage with SAS Token
    • Região: aceitar padrão
    • Tipo de máquina: aceitar padrão

    GitHub screenshot of Codespaces New with options menu with the following dev container highlighted, Tutorial: Upload file to storage with SAS Token.

  5. Aguarde até que o espaço de código inicie. Este processo de arranque pode demorar alguns minutos.

  6. Abra um novo terminal no codespace.

    Gorjeta

    Você pode usar o menu principal para navegar até a opção de menu Terminal e, em seguida, selecionar a opção Novo Terminal.

    Screenshot of the codespaces menu option to open a new terminal.

  7. Verifique as versões das ferramentas que você usa neste tutorial.

    node --version
    npm --version
    func --version
    

    Este tutorial requer as seguintes versões de cada ferramenta, que são pré-instaladas em seu ambiente:

    Ferramenta Versão
    Node.js ≥ 18
    npm ≥ 9.5
    Ferramentas principais do Azure Functions ≥ 4.5098
  8. Feche o terminal.

  9. As etapas restantes neste tutorial ocorrem no contexto desse contêiner de desenvolvimento.

3. Instalar dependências

O aplicativo de exemplo para este tutorial está na azure-upload-file-to-storage pasta. Você não precisará usar nenhuma outra pasta no projeto.

  1. No Visual Studio Code, abra um terminal e mova para a pasta do projeto.

    cd azure-upload-file-to-storage
    
  2. Divida o terminal para que você tenha dois terminais, um para o aplicativo cliente e outro para o aplicativo API.

  3. Em um dos terminais, execute o seguinte comando para instalar as dependências do aplicativo de API e executar o aplicativo.

    cd api && npm install
    
  4. No outro terminal, execute o comando para instalar o aplicativo cliente.

    cd app && npm install
    

4. Criar recurso de armazenamento com a extensão do Visual Studio

Crie o recurso de armazenamento para usar com o aplicativo de exemplo. O armazenamento é utilizado para:

  • Gatilhos no aplicativo Azure Functions
  • Armazenamento de Blob (arquivo)
  1. Navegue até a extensão de Armazenamento do Azure.

  2. Entre no Azure, se necessário.

  3. Clique com o botão direito do rato na subscrição e, em seguida, selecione Create Resource....

    Screenshot of Visual Studio Code in the Azure Explorer with the right-click menu showing the Create Resource item highlighted.

  4. Selecione Criar conta de armazenamento na lista.

  5. Siga as instruções usando a tabela a seguir para entender como criar seu recurso de armazenamento.

    Property valor
    Insira um nome globalmente exclusivo para o novo aplicativo Web. Insira um valor exclusivo, como fileuploadstor, para o nome do recurso de armazenamento.

    Esse nome exclusivo é o nome do recurso usado na próxima seção. Use apenas caracteres e números, até 24 de comprimento. Você precisa desse nome de conta para usar mais tarde.
    Selecione um local para novos recursos. Use o local recomendado.
  6. Quando o processo de criação do aplicativo estiver concluído, uma notificação será exibida com informações sobre o novo recurso.

    Screenshot of Visual Studio Code showing the Azure Activity Bar and the notification that the storage account was successfully created.

5. Configurar CORS de armazenamento

Como o navegador é usado para carregar o arquivo, a conta de Armazenamento do Azure precisa configurar o CORS para permitir solicitações entre origens.

  1. Navegue até a extensão de Armazenamento do Azure. Clique com o botão direito do mouse no recurso de armazenamento e selecione Abrir no Portal.

  2. Na seção Configurações da conta de armazenamento do portal do Azure, selecione Compartilhamento de recursos (CORS).

  3. Use as propriedades a seguir para definir CORS para este tutorial.

    • Origens permitidas: *
    • Métodos permitidos: Todos exceto patch
    • Cabeçalhos permitidos: *
    • Cabeçalhos expostos: *
    • Idade máxima: 86400

    Essas configurações são usadas para este tutorial para simplificar as etapas e não se destinam a indicar práticas recomendadas ou segurança. Saiba mais sobre o CORS para Armazenamento do Azure.

  4. Selecione Guardar.

6. Conceder acesso anônimo ao armazenamento

O carregamento do arquivo é protegido do cliente quando você cria um token SAS com tempo limitado e permissão limitada. No entanto, uma vez que o arquivo é carregado, neste cenário tutorial, você deseja que qualquer pessoa o veja. Para fazer isso, você precisa alterar a permissão de armazenamento para ser acessível publicamente.

Mesmo que a conta seja acessível publicamente, cada contêiner e cada blob pode ter acesso privado. Um método mais seguro, mas muito complicado para este tutorial, é carregar para uma conta de armazenamento com o token SAS e, em seguida, mover o blob para outra conta de armazenamento com acesso público.

  1. Para habilitar o acesso público no portal do Azure, selecione a página Visão geral da sua conta de armazenamento, na seção Propriedades, selecione Acesso anônimo de Blob e selecione Desabilitado.
  2. Na página Configuração, habilite Permitir acesso anônimo ao Blob.

7. Criar contêiner de upload

  1. Ainda na conta de armazenamento do portal do Azure, na seção Armazenamento de dados, selecione Contêineres.

  2. Selecione + Container para criar seu upload contêiner com as seguintes configurações:

    • Nome: upload
    • Nível de acesso público: Blob
  3. Selecione Criar.

8. Conceda a si mesmo acesso aos Dados de Blob

Ao criar o recurso, você não tem permissão para exibir o conteúdo do contêiner. Isso é reservado para funções específicas do IAM. Adicione sua conta para que você possa visualizar os blobs nos contêineres.

  1. Ainda na conta de armazenamento do portal do Azure, selecione Controle de Acesso (IAM).
  2. Selecione Adicionar atribuições de função.
  3. Pesquise e selecione Storage Blob Data Contributor. Selecione Seguinte.
  4. Selecione + Selecionar membros.
  5. Pesquise e selecione a sua conta.
  6. Selecione Rever + atribuir.
  7. Selecione Containers e, em seguida, o contêiner de upload . Você deve ser capaz de ver que não há blobs no contêiner sem erros de autorização.

9. Obtenha credenciais de recursos de armazenamento

As credenciais do recurso de Armazenamento são usadas no aplicativo da API do Azure Functions para se conectar ao recurso de Armazenamento.

  1. Ainda no portal do Azure, na seção Segurança + rede , selecione Chaves de acesso.

  2. Lembre-se de que os arquivos da API são encontrados em ./workspaces/azure-typescript-e2e-apps/azure-upload-file-to-storage/api.

  3. Na pasta API, renomeie o arquivo de local.settings.json.sample para local.settings.json. O arquivo é ignorado pelo Git para que não seja verificado no controle do código-fonte.

  4. Atualize as configurações para local.settings.json usar a tabela a seguir.

    Property valor Description
    Azure_Storage_AccountName Nome da conta do Armazenamento do Azure, por exemplo: fileuploadstor. Usado no código-fonte para se conectar ao recurso de armazenamento.
    Azure_Storage_AccountKey Chave da conta do Armazenamento do Azure Usado no código-fonte para se conectar ao recurso de armazenamento.
    AzureWebJobsStorage Cadeia de conexão da conta de Armazenamento do Azure Use pelo tempo de execução do Azure Functions para armazenar o estado e os logs.

Pode parecer que você inseriu as mesmas credenciais de conta duas vezes, uma como chave e outra como cadeia de conexão. Você fez, mas especificamente para este tutorial simples. De um modo geral, os aplicativos do Azure Functions devem ter um recurso de armazenamento separado que não seja reutilizado para outra finalidade. Ao criar o recurso Função do Azure posteriormente no tutorial, não será necessário definir o valor AzureWebJobsStorage para o recurso de nuvem. Você só precisará definir os valores de Azure_Storage_AccountName e Azure_Storage_AccountKey que são usados no código-fonte.

10. Execute o aplicativo de API

Execute o aplicativo Functions para garantir que ele funcione corretamente antes de implantá-lo no Azure.

  1. No terminal do aplicativo de API, execute o seguinte comando para iniciar o aplicativo de API.

    npm run start
    
  2. Aguarde até que o aplicativo Azure Functions seja iniciado. Você receberá um aviso de que a porta do aplicativo Azure Functions, 7071, já está disponível. Você também deve ver as APIs listadas no terminal do aplicativo de API.

    Functions:
    
            list: [POST,GET] http://localhost:7071/api/list
    
            sas: [POST,GET] http://localhost:7071/api/sas
    
            status: [GET] http://localhost:7071/api/status
    
  3. Selecione a guia Portas no painel inferior, clique com o botão direito do mouse na porta 7071 e selecione Visibilidade da porta e, em seguida, selecione Público.

    Se você não expor este aplicativo como público, receberá um erro ao usar a API do aplicativo cliente.

  4. Para testar se a API funciona e se conecta ao armazenamento, na guia Portas no painel inferior, selecione o ícone de globo na área Endereço Local da porta 7071. Isso abre um navegador da Web para o aplicativo de funções.

  5. Adicione a rota da API à barra de endereço URL: /api/sas?container=upload&file=test.png. Tudo bem que o arquivo ainda não está no contêiner. A API cria o token SAS com base em onde você deseja que ele seja carregado.

  6. A resposta JSON deve ter a seguinte aparência:

    {
        "url":"https://YOUR-STORAGE-RESOURCE.blob.core.windows.net/upload/test.png?sv=2023-01-03&spr=https&st=2023-07-26T22%3A15%3A59Z&se=2023-07-26T22%3A25%3A59Z&sr=b&sp=w&sig=j3Yc..."
    }
    
  7. Copie a base da URL da API na barra de endereço do navegador (não a URL do token SAS no objeto JSON) para usar na próxima etapa. O URL base é tudo antes de /api/sas.

11. Configurar e executar o aplicativo cliente

  1. Renomeie o ./azure-upload-file-to-storage/app/.env.sample arquivo para .env.

  2. Abra o arquivo e cole a URL base da seção anterior como o valor para o .envVITE_API_SERVER.

    Um exemplo para um ambiente Codespaces pode parecer algo como VITE_API_SERVER=https://improved-space-fishstick-pgvxvxjpqgrh6qxp-7071.app.github.dev

  3. No outro terminal dividido, inicie o aplicativo cliente com o seguinte comando:

    npm run dev
    
  4. Aguarde até que o terminal retorne o seguinte aviso de que o aplicativo está disponível na porta 5173.

      VITE v4.4.4  ready in 410 ms
    
      ➜  Local:   https://localhost:5173/
      ➜  Network: use --host to expose
      ➜  press h to show help
    
  5. Selecione a guia Portas no painel inferior, clique com o botão direito do mouse na porta 5173 e selecione o ícone de globo.

  6. Você deve ver o aplicativo Web simples.

    Screenshot of web browser showing web app with Select File button available.

  7. Interaja com o aplicativo Web:

    • Selecione um arquivo de imagem (*.jpg ou *.png) do seu computador local para carregar.
    • Selecione o botão Obter uma SAS para solicitar um token SAS do aplicativo API. A resposta mostra o URL completo a ser usado para carregar o arquivo no Armazenamento.
    • Selecione o botão Carregar para enviar o arquivo de imagem diretamente para o armazenamento.

    Screenshot of web browser showing web app with the image file uploaded and a thumbnail of the file displayed.

  8. O aplicativo cliente e o aplicativo de API trabalharam juntos com êxito em um ambiente de desenvolvedor em contêiner.

12. Confirmar alterações de código

  1. No Visual Studio Code, abra a guia Controle do código-fonte.
  2. Selecione o + ícone para preparar todas as alterações. Essas alterações devem incluir apenas novos arquivos package-lock.json para as app pastas e api para este tutorial.

13. Implantar aplicativo Web estático no Azure

O aplicativo Azure Functions está usando um recurso de visualização, ele deve ser implantado no West US 2 para funcionar corretamente.

  1. No Visual Studio Code, selecione o explorador do Azure.

  2. No Azure Explorer, clique com o botão direito do mouse no nome da assinatura e selecione Create Resource....

  3. Selecione Criar aplicativo Web estático na lista.

  4. Siga as instruções usando a tabela a seguir para entender como criar seu recurso de aplicativo Web estático.

    Property valor
    Insira um nome globalmente exclusivo para o novo aplicativo Web. Insira um valor exclusivo, como fileuploadstor, para o nome do recurso de armazenamento.

    Esse nome exclusivo é o nome do recurso usado na próxima seção. Use apenas caracteres e números, até 24 de comprimento. Você precisa desse nome de conta para usar mais tarde.
    Selecione um local para novos recursos. Use o local recomendado.
  5. Siga as instruções para fornecer as seguintes informações:

    Prompt Enter
    Selecione um grupo de recursos para novos recursos. Use o grupo de recursos que você criou para o recurso de armazenamento.
    Insira o nome do novo aplicativo Web estático. Aceite o nome padrão.
    Selecione uma SKU Selecione o SKU gratuito para este tutorial. Se você já tiver um recurso gratuito do Static Web App em sua assinatura, selecione o próximo nível de preço.
    Escolha a predefinição de compilação para configurar a estrutura padrão do projeto. Selecione Personalizado.
    Selecione o local do código do seu aplicativo azure-upload-file-to-storage/app
    Selecione o local do seu código do Azure Functions azure-upload-file-to-storage/api
    Insira o caminho da sua saída de compilação... dist

    Este é o caminho do seu aplicativo para seus arquivos estáticos (gerados).
    Selecione um local para novos recursos. Selecione uma região perto de si.
  6. Quando o processo estiver concluído, será exibido um pop-up de notificação. Selecione Exibir/Editar fluxo de trabalho.

  7. Sua bifurcação remota tem um novo arquivo de fluxo de trabalho para implantação em aplicativos Web estáticos. Puxe esse arquivo para baixo em seu ambiente com o seguinte comando no terminal:

    git pull origin main
    
  8. Abra o arquivo de fluxo de trabalho localizado em /.github/workflows/.

  9. Verifique se a seção do fluxo de trabalho específica para o aplicativo Web estático deste tutorial deve ter a seguinte aparência:

    ###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
    # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
    app_location: "/azure-upload-file-to-storage/app" # App source code path
    api_location: "/azure-upload-file-to-storage/api" # Api source code path - optional
    output_location: "dist" # Built app content directory - optional
    ###### End of Repository/Build Configurations ######
    
  10. Vá para a bifurcação do GitHub do exemplo https://github.com/YOUR-ACCOUNT/azure-typescript-e2e-apps/actions para verificar a ação de compilação e implantação, nomeada Azure Static Web Apps CI/CD, concluída com êxito. Isso pode levar alguns minutos para ser concluído.

  11. Vá para seu portal do Azure para seu aplicativo e exiba a seção APIs de Configurações. O Nome do recurso de back-end no ambiente de produção está (managed) indicando que suas APIs foram implantadas com êxito.

  12. Selecione (gerenciado) para ver a lista de APIs carregadas no aplicativo:

    • list
    • SAS
    • estado
  13. Vá para a página Visão geral para encontrar a URL do seu aplicativo implantado.

  14. A implantação do aplicativo está concluída.

14. Configurar a API com o nome e a chave do recurso de armazenamento

O aplicativo precisa do nome e da chave do recurso do Armazenamento do Azure antes que a API funcione corretamente.

  1. Ainda no Azure Explorer, clique com o botão direito do mouse no recurso Aplicativo Web estático e selecione Abrir no Portal.

  2. Selecione Configuração na seção Configurações.

  3. Adicione as configurações do aplicativo usando a tabela a seguir.

    Property valor Description
    Azure_Storage_AccountName Nome da conta do Armazenamento do Azure, por exemplo: fileuploadstor. Usado no código-fonte para se conectar ao recurso de armazenamento.
    Azure_Storage_AccountKey Chave da conta do Armazenamento do Azure Usado no código-fonte para se conectar ao recurso de armazenamento.
  4. Selecione Salvar na página Configuração para salvar ambas as configurações.

Nota

Não é necessário definir a variável env do aplicativo cliente VITE_API_SERVER porque o aplicativo cliente e a API são hospedados a partir do mesmo domínio.

15. Usar o aplicativo Web estático implantado no Azure

Verifique se a implantação e a configuração foram bem-sucedidas usando o site.

  1. No Visual Studio Code, clique com o botão direito do mouse em seu aplicativo Web estático no explorador do Azure e selecione Procurar site.
  2. Na nova janela do navegador da Web, selecione Escolher arquivo e, em seguida, selecione um arquivo de imagem (*.png ou *.jpg) para carregar.
  3. Selecione Obter token sas. Essa ação passa o nome do arquivo para a API e recebe a URL do token SAS necessária para carregar o arquivo.
  4. Selecione Carregar arquivo para usar a URL do token SAS para carregar o arquivo . O navegador exibe a miniatura e o URL do arquivo carregado.

16. Limpar os recursos

No Visual Studio Code, use o explorador do Azure para Grupos de Recursos, clique com o botão direito do mouse em seu grupo de recursos e selecione Excluir.

Isso exclui todos os recursos do grupo, incluindo os recursos do aplicativo Web estático e de armazenamento.

Resolução de Problemas

Relate problemas com este exemplo no repositório GitHub observado abaixo. Inclua o seguinte no problema:

  • O URL do artigo
  • A etapa ou contexto dentro do artigo que foi problemático
  • Seu ambiente de desenvolvimento

Código de exemplo

Se você quiser continuar com este aplicativo, saiba como implantar o aplicativo no Azure para hospedagem com uma das seguintes opções: