This browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can trysigning in orchanging directories.
Access to this page requires authorization. You can trychanging directories.
Azure Blob storage is optimized for storing large amounts of unstructured data. Blobs are objects that can hold text or binary data, including images, documents, streaming media, and archive data. In this quickstart, you learn to manage blobs by using JavaScript in a browser. You'll upload and list blobs, and you'll create and delete containers.
Theexample code shows you how to accomplish the following tasks with the Azure Blob storage client library for #"#declare-fields-for-ui-elements" data-linktype="self-bookmark">Declare fields for UI elements
Additional resources:
API reference |Library source code |Package (npm) |Samples
Blob storage offers three types of resources:
The following diagram shows the relationship between these resources.

In this quickstart, you'll use the following JavaScript classes to interact with these resources:
BlobServiceClient class allows you to manipulate Azure Storage resources and blob containers.ContainerClient class allows you to manipulate Azure Storage containers and their blobs.BlockBlobClient class allows you to manipulate Azure Storage blobs.To programmatically access your storage account from a web browser, you need to configure CORS access and create an SAS connection string.
Before your web application can access blob storage from the client, you must configure your account to enablecross-origin resource sharing, or CORS.
In the Azure portal, select your storage account. To define a new CORS rule, navigate to theSettings section and selectCORS. For this quickstart, you create a fully-open CORS rule:

The following table describes each CORS setting and explains the values used to define the rule.
| Setting | Value | Description |
|---|---|---|
| ALLOWED ORIGINS | * | Accepts a comma-delimited list of domains set as acceptable origins. Setting the value to* allows all domains access to the storage account. |
| ALLOWED METHODS | DELETE,GET,HEAD,MERGE,POST,OPTIONS, andPUT | Lists the HTTP verbs allowed to execute against the storage account. For the purposes of this quickstart, select all available options. |
| ALLOWED HEADERS | * | Defines a list of request headers (including prefixed headers) allowed by the storage account. Setting the value to* allows all headers access. |
| EXPOSED HEADERS | * | Lists the allowed response headers by the account. Setting the value to* allows the account to send any header. |
| MAX AGE | 86400 | The maximum amount of time the browser caches the preflight OPTIONS request in seconds. A value of86400 allows the cache to remain for a full day. |
After you fill in the fields with the values from this table, select theSave button.
Important
Ensure any settings you use in production expose the minimum amount of access necessary to your storage account to maintain secure access. The CORS settings described here are appropriate for a quickstart as it defines a lenient security policy. These settings, however, are not recommended for a real-world context.
The shared access signature (SAS) is used by code running in the browser to authorize Azure Blob storage requests. By using the SAS, the client can authorize access to storage resources without the account access key or connection string. For more information on SAS, seeUsing shared access signatures (SAS).
Follow these steps to get the Blob service SAS URL:
Note
The SAS token returned by the portal does not include the delimiter character ('?') for the URL query string. If you are appending the SAS token to a resource URL, remember to append the delimiter character to the resource URL before appending the SAS token.
Create a JavaScript application namedblob-quickstart-v12.
In a console window (such as cmd, PowerShell, or Bash), create a new directory for the project.
mkdir blob-quickstart-v12Switch to the newly createdblob-quickstart-v12 directory.
cd blob-quickstart-v12Create apackage.json.
npm init -yOpen the project in Visual Studio Code:
code .In a Visual Studio Code terminal, install the Azure Storage npm package:
npm install @azure/storage-blobInstall a bundler package to bundle the files and package for the browser:
npm install parcelIf you plan to use a different bundler, learn more aboutbundling the Azure SDK.
In Visual Studio Code, open thepackage.json file and add abrowserlist. Thisbrowserlist targets the latest version of popular browsers. The fullpackage.json file should now look like this:
"browserslist": [ "last 1 Edge version", "last 1 Chrome version", "last 1 Firefox version", "last 1 safari version", "last 1 webkit version"],Add astart script to bundle the website:
"scripts": { "start": "parcel ./index.html"},Createindex.html and add the following HTML code:
<!-- index.html --><!DOCTYPE html><html><body> <button>Create container</button> <button>Select and upload files</button> <input type="file" multiple /> <button>List files</button> <button>Delete selected files</button> <button>Delete container</button> <p><b>Status:</b></p> <p /> <p><b>Files:</b></p> <select multiple /></body><script type="module" src="./index.js"></script></html>From the project directory:
Create a new file namedindex.js.
Add the Azure Storage npm package.
const { BlobServiceClient } = require("@azure/storage-blob");Add DOM elements for user interaction:
const createContainerButton = document.getElementById("create-container-button");const deleteContainerButton = document.getElementById("delete-container-button");const selectButton = document.getElementById("select-button");const fileInput = document.getElementById("file-input");const listButton = document.getElementById("list-button");const deleteButton = document.getElementById("delete-button");const status = document.getElementById("status");const fileList = document.getElementById("file-list");const reportStatus = message => { status.innerHTML += `${message}<br/>`; status.scrollTop = status.scrollHeight;}This code declares fields for each HTML element and implements areportStatus function to display output.
Add the following code at the end of theindex.js file to access your storage account. Replace the<placeholder> with your Blob service SAS URL that you generated earlier. Add the following code to the end of theindex.js file.
// Update <placeholder> with your Blob service SAS URL stringconst blobSasUrl = "<placeholder>";CreateBlobServiceClient andContainerClient objects to connect to your storage account. Add the following code to the end of theindex.js file.
// Create a new BlobServiceClientconst blobServiceClient = new BlobServiceClient(blobSasUrl);// Create a unique name for the container by // appending the current time to the file nameconst containerName = "container" + new Date().getTime();// Get a container client from the BlobServiceClientconst containerClient = blobServiceClient.getContainerClient(containerName);Create and delete the storage container when you select the corresponding button on the web page. Add the following code to the end of theindex.js file.
const createContainer = async () => { try { reportStatus(`Creating container "${containerName}"...`); await containerClient.create(); reportStatus(`Done. URL:${containerClient.url}`); } catch (error) { reportStatus(error.message); }};const deleteContainer = async () => { try { reportStatus(`Deleting container "${containerName}"...`); await containerClient.delete(); reportStatus(`Done.`); } catch (error) { reportStatus(error.message); }};createContainerButton.addEventListener("click", createContainer);deleteContainerButton.addEventListener("click", deleteContainer);List the contents of the storage container when you select theList files button. Add the following code to the end of theindex.js file.
const listFiles = async () => { fileList.size = 0; fileList.innerHTML = ""; try { reportStatus("Retrieving file list..."); let iter = containerClient.listBlobsFlat(); let blobItem = await iter.next(); while (!blobItem.done) { fileList.size += 1; fileList.innerHTML += `<option>${blobItem.value.name}</option>`; blobItem = await iter.next(); } if (fileList.size > 0) { reportStatus("Done."); } else { reportStatus("The container does not contain any files."); } } catch (error) { reportStatus(error.message); }};listButton.addEventListener("click", listFiles);This code calls theContainerClient.listBlobsFlat function, then uses an iterator to retrieve the name of eachBlobItem returned. For eachBlobItem, it updates theFiles list with thename property value.
Upload files to the storage container when you select theSelect and upload files button. Add the following code to the end of theindex.js file.
const uploadFiles = async () => { try { reportStatus("Uploading files..."); const promises = []; for (const file of fileInput.files) { const blockBlobClient = containerClient.getBlockBlobClient(file.name); promises.push(blockBlobClient.uploadBrowserData(file)); } await Promise.all(promises); reportStatus("Done."); listFiles(); } catch (error) { reportStatus(error.message); }}selectButton.addEventListener("click", () => fileInput.click());fileInput.addEventListener("change", uploadFiles);This code connects theSelect and upload files button to the hiddenfile-input element. The buttonclick event triggers the file inputclick event and displays the file picker. After you select files and close the dialog box, theinput event occurs and theuploadFiles function is called. This function creates aBlockBlobClient object, then calls the browser-onlyuploadBrowserData function for each file you selected. Each call returns aPromise. EachPromise is added to a list so that they can all be awaited together, causing the files to upload in parallel.
Delete files from the storage container when you select theDelete selected files button. Add the following code to the end of theindex.js file.
const deleteFiles = async () => { try { if (fileList.selectedOptions.length > 0) { reportStatus("Deleting files..."); for (const option of fileList.selectedOptions) { await containerClient.deleteBlob(option.text); } reportStatus("Done."); listFiles(); } else { reportStatus("No files selected."); } } catch (error) { reportStatus(error.message); }};deleteButton.addEventListener("click", deleteFiles);This code calls theContainerClient.deleteBlob function to remove each file selected in the list. It then calls thelistFiles function shown earlier to refresh the contents of theFiles list.
From a Visual Studio Code terminal, run the app.
npm startThis process bundles the files and starts a web server.
Access the web site with a browser using the following URL:
http://localhost:1234This quickstart created a container and blob on the Azure cloud. You can also use the Azure Blob storage npm package to create these resources locally on theAzure Storage emulator for development and testing.
blob-quickstart-v12 directory.In this quickstart, you learned how to upload, list, and delete blobs using JavaScript. You also learned how to create and delete a blob storage container.
For tutorials, samples, quickstarts, and other documentation, visit:
Was this page helpful?
Need help with this topic?
Want to try using Ask Learn to clarify or guide you through this topic?
Was this page helpful?
Want to try using Ask Learn to clarify or guide you through this topic?