Upload en bild till en Azure Storage blob

Använd en app på React klientsidan för att ladda upp en bildfil till en Azure Storage-blob med ett NPM-paket Azure Storage @azure/storage-blob.

TypeScript-programmeringsarbetet är klart åt dig. Den här självstudien fokuserar på att använda de lokala och fjärranslutna Azure-miljöerna inifrån Visual Studio Code med Azure-tillägg.

Programarkitektur och funktioner

Den här artikeln innehåller flera viktiga Azure-uppgifter för JavaScript-utvecklare:

  • Köra en React/TypeScript-app lokalt med Visual Studio Code
  • Skapa en Azure Storage Blob-resurs och konfigurera för filuppladdningar
    • Konfigurera CORS
    • Skapa SAS-token (signaturer för delad åtkomst)
  • Konfigurera kod för Azure SDK-klientbiblioteket för att använda SAS-token för att autentisera till tjänsten

Exempelappen React, som finns GitHub, består av följande element:

Enkel React som är ansluten Azure Storage blobar.

1. Konfigurera utvecklingsmiljön

2. För- och klona exempelprogrammet

  1. Öppna den GitHub exempel-URL:en i en webbläsare:

    https://github.com/Azure-Samples/js-e2e-browser-file-upload-storage-blob
    
  2. Välj Förk för att skapa en egen förk för det här exempelprojektet. Din egen GitHub är nödvändig för att distribuera det här exemplet till Azure som en statisk webbapp.

  3. Välj knappen Kod och kopiera sedan klon-URL:en.

  4. I en bash-terminal klonar du den förked lagringsplatsen och REPLACE-WITH-YOUR-ACCOUNT-NAME ersätter GitHub namnet på ditt konto:

    git clone https://github.com/REPLACE-WITH-YOUR-ACCOUNT-NAME/js-e2e-browser-file-upload-storage-blob
    
    
  5. Ändra till den nya katalogen och öppna Visual Studio Code.

    cd js-e2e-browser-file-upload-storage-blob && code .
    

3. Installera beroenden och kör lokalt projekt

  1. I Visual Studio Code öppnar du en integrerad bash-terminal, CtrlSkift, och kör följande kommando för att ` installera exemplets beroenden.

    npm install
    
  2. Kör webbappen genom att köra kommandot i samma terminalfönster.

    npm start
    
  3. Öppna en webbläsare och använd följande URL för att visa webbappen på den lokala datorn.

    http://localhost:3000/
    

    Om du ser den enkla webbappen i webbläsaren med texten som Storage har konfigurerats, har du lyckats med det här avsnittet i självstudien.

    Enkel Node.js som är ansluten till MongoDB-databasen.

  4. Stoppa koden med CtrlC i terminalen Visual Studio Code.

4. Skapa Storage resurs med Visual Studio tillägg

  1. Gå till Azure Storage tillägget. Högerklicka på prenumerationen och välj Create Storage Account... sedan .

    Gå till Azure Storage tillägget. Högerklicka på prenumerationen och välj sedan

  2. Följ anvisningarna med hjälp av följande tabell för att förstå hur du skapar Storage resurs.

    Egenskap Värde
    Ange ett globalt unikt namn för den nya webbappen. Ange ett värde som fileuploaddemo , för Storage resursnamn.

    Det här unika namnet är ditt resursnamn som används i nästa avsnitt. Använd endast tecken och siffror, upp till 24 tecken långt. Du behöver det här kontonamnet för senare användning.
  3. När processen för att skapa appen är klar visas ett meddelande med information om den nya resursen.

    När processen för att skapa appen är klar visas ett meddelande med information om den nya resursen.

5. Generera din SAS-token (signatur för delad åtkomst)

Generera SAS-token innan du konfigurerar CORS.

  1. I Visual Studio Code för Storage högerklickar du på resursen och väljer Öppna i portalen. Då öppnas Azure Portal till din exakta Storage resurs.

  2. I avsnittet Säkerhet + nätverk väljer du Signatur för delad åtkomst.

  3. Konfigurera SAS-token med följande inställningar.

    Egenskap Värde
    Tillåtna tjänster Blob
    Tillåtna resurstyper Tjänst, container, objekt
    Tillåtna behörigheter Läsa, skriva, ta bort, lista, lägga till, skapa
    Behörigheter för blobversionshantering Markerad
    Tillåt behörigheter för blobindex Läsning/skrivning och filter ska vara markerat
    Start- och slutdatum/tid Acceptera startdatum/-tid och ange slutdatumet 24 timmar i framtiden. Din SAS-token är bara bra i 24 timmar.
    Endast HTTPS Markerat
    Önskad routningsnivå Basic
    Signeringsnyckel key1 valt

    Konfigurera SAS-token som visas på bilden. Inställningarna beskrivs under bilden.

  4. Välj Skapa SAS och anslutningssträng.

  5. Kopiera OMEDELBART SAS-token. Du kommer inte att kunna visa den här token, så om du inte har kopierat den måste du generera en ny SAS-token.

6. Ange Storage i .env-filen

SAS-token används när frågor görs till din molnbaserade resurs.

  1. Skapa ett filnamn .env i projektroten.

  2. Lägg till två obligatoriska variabler med deras lagringsvärden:

    REACT_APP_STORAGESASTOKEN=
    REACT_APP_STORAGERESOURCENAME=
    

    React skapar de statiska filerna med dessa variabler.

  3. Om token börjar med ett frågetecken tar du bort ? . Kodfilen innehåller ? för dig så att du inte behöver den i token.

7. Konfigurera CORS för Azure Storage resurs

Konfigurera CORS för din resurs så att klientsidans kod React komma åt ditt lagringskonto.

  1. När du fortfarande är i Azure-portalerna går Inställningar avsnittet och väljer Resursdelning (CORS).

  2. Konfigurera Blob Service CORS enligt bilden. Inställningarna beskrivs under bilden.

    Egenskap Värde
    Tillåtna ursprung *
    Tillåtna metoder Alla utom korrigering.
    Tillåtna rubriker *
    Exponerade rubriker *
    Maximal ålder 86400

    Konfigurera CORS enligt bilden. Inställningarna beskrivs under bilden.

  3. Välj Spara ovanför inställningarna för att spara dem till resursen. Koden kräver inte några ändringar för att fungera med de här CORS-inställningarna.

8. Kör projektet lokalt för att verifiera anslutningen till Storage konto

Ditt SAS-token och lagringskontonamn har angetts src/azure-storage-blob.ts i filen, så du är redo att köra programmet.

  1. Om appen inte körs startar du den igen:

    npm start
    
  2. Öppna följande URL i en webbläsare:

    http://localhost:3000

    Den React som är ansluten till Azure Storage blobar bör visas med en knapp för filval och en filuppladdningsknapp.

  3. Välj en bild från mappen images som du vill ladda upp och välj sedan images

  4. Klientkoden React i klientsidan anropar ./src/azure-storage-blob.ts för att autentisera till Azure och skapar sedan en Storage-container (om den inte redan finns) och laddar sedan upp filen till den containern.

9. Distribuera statisk webbapp till Azure

  1. I Visual Studio Code väljer du Azure Explorer.

  2. Om du ser ett popup-fönster där du uppmanas att genomföra ändringarna ska du inte göra detta. Exemplet bör vara redo att distribueras utan ändringar.

    Om du vill återställa ändringarna går Visual Studio kod väljer du ikonen Källkodskontroll i aktivitetsfältet. Markera sedan varje ändrad fil i listan Ändringar och välj ikonen Ignorera ändringar.

  3. Högerklicka på prenumerationsnamnet och välj sedan Skapa statisk webbapp (avancerat).

  4. Följ anvisningarna för att ange följande information:

    Prompt Ange
    Ange namnet på den nya statiska webbappen. Skapa ett unikt namn för din resurs. Du kan till exempel lägga till namnet på lagringsplatsen före namnet, till exempel upload-file-to-storage .
    Välj en resursgrupp för nya resurser. Använd resursgruppen som du skapade för lagringsresursen.
    Välj en SKU Välj den kostnadsfria SKU:n för den här självstudien. Om du redan har en kostnadsfri statisk webbappresurs som används väljer du nästa prisnivå.
    Välj byggförinställning för att konfigurera standardprojektstrukturen. Välj React.
    Välj platsen för programkoden / – Detta anger att filen package.json finns i lagringsplatsens rot.
    Välj platsen för din Azure Functions kod Acceptera standardvärdet. Även om det här exemplet inte använder ett API kan du lägga till ett senare.
    Ange sökvägen till dina byggutdata... build

    Det här är sökvägen från din app till dina statiska (genererade) filer.
    Välj en plats för nya resurser. Välj en region nära dig.
  5. När processen är klar visas ett popup-meddelande. Välj Visa/redigera arbetsflöde.

    Partiell skärmbild av Visual Studio popup-fönster med knappen Visa/redigera arbetsflöde markerad.

10. Lägg till Azure Storage hemligheter för att GitHub hemligheter

  1. Gå tillbaka till exempelprojektets GitHub i en webbläsare för att lägga till de två hemligheterna och deras värden:

    https://github.com/YOUR-GITHUB-ACCOUNT/js-e2e-browser-file-upload-storage-blob/settings/secrets/actions
    

    Skärmbild av en webbläsare som visar  , på sidan Inställningar  hemligheter, med knappen Ny hemlighet för lagringsplatsen markerad.

11. Konfigurera en statisk webbapp för att ansluta till lagringsresursen

Redigera arbetsflödet GitHub hemligheter för att ansluta till Azure Storage.

  1. I Visual Studio Code öppnar du YAML-arbetsflödesfilen och lägger till de två .github/workflows lagringsmiljövariablerna with efter avsnittet i build_and_deploy_job .

    jobs:
      build_and_deploy_job:
        if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
        runs-on: ubuntu-latest
        name: Build and Deploy Job
        steps:
          - uses: actions/checkout@v2
            with:
              submodules: true
          - name: Build And Deploy
            id: builddeploy
            uses: Azure/static-web-apps-deploy@v1
            with:
              azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_123456 }}
              repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
              action: "upload"
              ###### 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: "/" # App source code path
              api_location: "api" # Api source code path - optional
              output_location: "build" # Built app content directory - optional
              ###### End of Repository/Build Configurations ######
            env: # Add environment variables here
                REACT_APP_STORAGESASTOKEN: ${{secrets.REACT_APP_STORAGESASTOKEN}}
                REACT_APP_STORAGERESOURCENAME: ${{secrets.REACT_APP_STORAGERESOURCENAME}}
    

    Detta hämtar hemligheterna till byggprocessen.

  2. I Visual Studio Code väljer du Källkontroll, CtrlSkift G och sedan additionsikonen för att lägga till den ändrade *.yml-filen.

  3. Ange en kommentar för ditt genomförande, till exempel Adding Storage secrets .

  4. Skicka till din GitHub genom att välja ikonen Synkronisera ändringar i statusfältet.

    Partiell skärmbild Visual Studio statusfältet Kod.

  5. I popup-fönstret för att bekräfta om du vill skicka och hämta från fjärrlagringsplatsen väljer du OK.

    Om du får ett felmeddelande i det här steget kan du checka ut git-fjärrservern för att kontrollera att du har klonat din föring: .

  6. Denna push utlöser en ny version och distribueras för din statiska webbapp.

12. Kontrollera att bygg- och distributionsjobbet har slutförts

  1. Gå tillbaka till din GitHub i exempelprojektet i en webbläsare.

  2. Välj Åtgärderoch välj sedan den Azure Static Web Apps CI/CD-åtgärden.

  3. Välj Build and Deploy Job (Skapa och distribuera jobb) för att se hur processen slutförs.

    Skärmbild av webbläsare som visar GitHub åtgärden lyckades

13. Använd den Azure-distribuerade statiska webbappen

  1. I Visual Studio Code högerklickar du på din statiska webbapp från Azure Explorer och väljer

    Partiell skärmbild som väljer Bläddra på webbplatsen från Azure Static-webbplatsen.

  2. I det nya webbläsarfönstret väljer du en fil och laddar upp filen.

Felsöka lokal anslutning till Storage konto

Om du har fått ett fel eller om filen inte laddas upp till containern kontrollerar du följande:

  • Återskapa din SAS-token och se till att din token skapas Storage på resursnivå och inte på containernivå. Kopiera den nya token till koden på rätt plats.
  • Kontrollera att tokensträngen som du kopierade till koden inte innehåller ? (frågetecknet) i början av strängen.
  • Kontrollera CORS-inställningen för Storage resurs.

Upload-knappfunktioner

src/App.tsxTypeScript-filen tillhandahålls som en del av appskapandet med create-react-app. Filen har ändrats för att tillhandahålla filvalsknappen, uppladdningsknappen och stödkoden för att tillhandahålla den funktionen.

Koden som ansluter till Azure Blob Storage är markerad. Anropet uploadFileToBlob till returnerar alla blobar (filer) i containern som en platt lista. Listan visas med DisplayImagesFromContainer funktionen .

// ./src/App.tsx

import React, { useState } from 'react';
import Path from 'path';
import uploadFileToBlob, { isStorageConfigured } from './azure-storage-blob';

const storageConfigured = isStorageConfigured();

const App = (): JSX.Element => {
  // all blobs in container
  const [blobList, setBlobList] = useState<string[]>([]);

  // current file to upload into container
  const [fileSelected, setFileSelected] = useState(null);

  // UI/form management
  const [uploading, setUploading] = useState(false);
  const [inputKey, setInputKey] = useState(Math.random().toString(36));

  const onFileChange = (event: any) => {
    // capture file into state
    setFileSelected(event.target.files[0]);
  };

  const onFileUpload = async () => {
    // prepare UI
    setUploading(true);

    // *** UPLOAD TO AZURE STORAGE ***
    const blobsInContainer: string[] = await uploadFileToBlob(fileSelected);

    // prepare UI for results
    setBlobList(blobsInContainer);

    // reset state/form
    setFileSelected(null);
    setUploading(false);
    setInputKey(Math.random().toString(36));
  };

  // display form
  const DisplayForm = () => (
    <div>
      <input type="file" onChange={onFileChange} key={inputKey || ''} />
      <button type="submit" onClick={onFileUpload}>
        Upload!
          </button>
    </div>
  )

  // display file name and image
  const DisplayImagesFromContainer = () => (
    <div>
      <h2>Container items</h2>
      <ul>
        {blobList.map((item) => {
          return (
            <li key={item}>
              <div>
                {Path.basename(item)}
                <br />
                <img src={item} alt={item} height="200" />
              </div>
            </li>
          );
        })}
      </ul>
    </div>
  );

  return (
    <div>
      <h1>Upload file to Azure Blob Storage</h1>
      {storageConfigured && !uploading && DisplayForm()}
      {storageConfigured && uploading && <div>Uploading</div>}
      <hr />
      {storageConfigured && blobList.length > 0 && DisplayImagesFromContainer()}
      {!storageConfigured && <div>Storage is not configured.</div>}
    </div>
  );
};

export default App;

Upload för att Azure Storage blob med Azure SDK-klientbiblioteket

Koden för att ladda upp filen Azure Storage är ramverksoberoende. När koden har skapats för en självstudie gjordes val för enkelhetens och förståelsen. Dessa alternativ förklaras. Du bör granska ditt eget projekt för avsiktlig användning, säkerhet och effektivitet.

Exemplet skapar och använder en offentligt tillgänglig container och filer. Om du vill skydda dina filer i ditt eget projekt har du många lager där du kan styra detta från att kräva övergripande autentisering till din resurs till mycket specifika behörigheter för varje blobobjekt.

Beroenden och variabler

TypeScript-filen azure-storage-blob.ts läser in beroendena och hämtar de nödvändiga variablerna av antingen miljövariabler eller hårdkodade strängar.

Variabel Beskrivning
sasToken SAS-token som skapas Azure Portal med en Azure Portal med ? . Ta bort den innan du anger den i sasToken variabeln.
container Namnet på containern i Blob Storage. Du kan tänka på detta som en motsvarighet till en mapp eller katalog för ett filsystem.
storageAccountName Ditt resursnamn.
// THIS IS SAMPLE CODE ONLY - NOT MEANT FOR PRODUCTION USE
import { BlobServiceClient, ContainerClient} from '@azure/storage-blob';

const containerName = `tutorial-container`;
const sasToken = process.env.REACT_APP_STORAGESASTOKEN;
const storageAccountName = process.env.REACT_APP_STORAGERESOURCENAME;

Skapa Storage klient och hantera steg

Funktionen uploadFileToBlob är filens huvudfunktion. Den skapar klientobjektet för Storage-tjänsten och skapar sedan klienten till containerobjektet, laddar upp filen och hämtar sedan en lista över alla blobar i containern.

const uploadFileToBlob = async (file: File | null): Promise<string[]> => {
  if (!file) return [];

  // get BlobService = notice `?` is pulled out of sasToken - if created in Azure portal
  const blobService = new BlobServiceClient(
    `https://${storageAccountName}.blob.core.windows.net/?${sasToken}`
  );

  // get Container - full public read access
  const containerClient: ContainerClient = blobService.getContainerClient(containerName);
  await containerClient.createIfNotExists({
    access: 'container',
  });

  // upload file
  await createBlobInContainer(containerClient, file);

  // get list of blobs in container
  return getBlobsInContainer(containerClient);
};

Upload till blob

Funktionen createBlobInContainer laddar upp filen till containern med hjälp av klassen createBlobInContainermetoden uploadData. Innehållstypen måste skickas med begäran om du tänker använda webbläsarfunktioner, vilket beror på filtypen, till exempel att visa en bild.

const createBlobInContainer = async (containerClient: ContainerClient, file: File) => {
  
  // create blobClient for container
  const blobClient = containerClient.getBlockBlobClient(file.name);

  // set mimetype as determined from browser with file upload control
  const options = { blobHTTPHeaders: { blobContentType: file.type } };

  // upload file
  await blobClient.uploadData(file, options);
}

Hämta lista över blobar

Funktionen hämtar en lista över URL:er med hjälp av getBlobsInContainergetBlobsInContainermetoden listBlobsFlat, för blobarna i containern. URL:erna är konstruerade för att användas som för src en bildvisning i HTML: <img src={item} alt={item} height="200" /> .

// return list of blobs in container to display
const getBlobsInContainer = async (containerClient: ContainerClient) => {
  const returnedBlobUrls: string[] = [];

  // get list of blobs in container
  // eslint-disable-next-line
  for await (const blob of containerClient.listBlobsFlat()) {
    // if image is public, just construct URL
    returnedBlobUrls.push(
      `https://${storageAccountName}.blob.core.windows.net/${containerName}/${blob.name}`
    );
  }

  return returnedBlobUrls;
}

Rensa resurser

I Visual Studio Code använder du Azure Explorer för resursgrupper, högerklickar på resursgruppen och väljer sedan Ta bort.

Detta tar bort alla resurser i gruppen, inklusive dina Storage och statiska webbappresurser.

Nästa steg

Om du vill fortsätta med den här appen kan du lära dig hur du distribuerar appen till Azure för värdtjänster med något av följande alternativ: