GitHub Copilot ChatGPT Claude Codex CLI Cursor opencode Skill Text

azure-storage-blob-java

Build blob storage applications with Azure Storage Blob SDK for Java. Use when uploading, downloading, or managing files in Azure Blob Storage, working with containers, or implementing streaming data operations.

Ciza · 0 points · 22 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download microsoft-skills-.github_plugins_azure-sdk-java_skills_azure-storage-blob-java-e58528d.zip · 6 KB
Part of microsoft/skills — 195 skills

Install

skills CLI npx skills add https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-java/skills/azure-storage-blob-java
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install microsoft-skills@llmmart
Git git clone https://github.com/microsoft/skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole microsoft/skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Azure Storage Blob SDK for Java

Build blob storage applications using the Azure Storage Blob SDK for Java.

Installation

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-blob</artifactId>
    <version>12.33.0</version>
</dependency>

Client Creation

BlobServiceClient

import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;

// With SAS token
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
    .endpoint("<storage-account-url>")
    .sasToken("<sas-token>")
    .buildClient();

// With connection string
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
    .connectionString("<connection-string>")
    .buildClient();

With DefaultAzureCredential

import com.azure.core.credential.TokenCredential;
import com.azure.identity.AzureIdentityEnvVars;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.identity.ManagedIdentityCredentialBuilder;

// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
TokenCredential credential = new DefaultAzureCredentialBuilder()
    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
    .build();
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes
// TokenCredential credential = new ManagedIdentityCredentialBuilder().build();

BlobServiceClient serviceClient = new BlobServiceClientBuilder()
    .endpoint("<storage-account-url>")
    .credential(credential)
    .buildClient();

BlobContainerClient

import com.azure.storage.blob.BlobContainerClient;

// From service client
BlobContainerClient containerClient = serviceClient.getBlobContainerClient("mycontainer");

// Direct construction
BlobContainerClient containerClient = new BlobContainerClientBuilder()
    .connectionString("<connection-string>")
    .containerName("mycontainer")
    .buildClient();

BlobClient

import com.azure.storage.blob.BlobClient;

// From container client
BlobClient blobClient = containerClient.getBlobClient("myblob.txt");

// With directory structure
BlobClient blobClient = containerClient.getBlobClient("folder/subfolder/myblob.txt");

// Direct construction
BlobClient blobClient = new BlobClientBuilder()
    .connectionString("<connection-string>")
    .containerName("mycontainer")
    .blobName("myblob.txt")
    .buildClient();

Core Patterns

Create Container

// Create container
serviceClient.createBlobContainer("mycontainer");

// Create if not exists
BlobContainerClient container = serviceClient.createBlobContainerIfNotExists("mycontainer");

// From container client
containerClient.create();
containerClient.createIfNotExists();

Upload Data

import com.azure.core.util.BinaryData;

// Upload string
String data = "Hello, Azure Blob Storage!";
blobClient.upload(BinaryData.fromString(data));

// Upload with overwrite
blobClient.upload(BinaryData.fromString(data), true);

Upload from File

blobClient.uploadFromFile("local-file.txt");

// With overwrite
blobClient.uploadFromFile("local-file.txt", true);

Upload from Stream

import com.azure.storage.blob.specialized.BlockBlobClient;

BlockBlobClient blockBlobClient = blobClient.getBlockBlobClient();

try (ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes())) {
    blockBlobClient.upload(dataStream, data.length());
}

Upload with Options

import com.azure.storage.blob.models.BlobHttpHeaders;
import com.azure.storage.blob.options.BlobParallelUploadOptions;

BlobHttpHeaders headers = new BlobHttpHeaders()
    .setContentType("text/plain")
    .setCacheControl("max-age=3600");

Map<String, String> metadata = Map.of("author", "john", "version", "1.0");

try (InputStream stream = new FileInputStream("large-file.bin")) {
    BlobParallelUploadOptions options = new BlobParallelUploadOptions(stream)
        .setHeaders(headers)
        .setMetadata(metadata);
    
    blobClient.uploadWithResponse(options, null, Context.NONE);
}

Upload if Not Exists

import com.azure.storage.blob.models.BlobRequestConditions;

BlobParallelUploadOptions options = new BlobParallelUploadOptions(inputStream, length)
    .setRequestConditions(new BlobRequestConditions().setIfNoneMatch("*"));

blobClient.uploadWithResponse(options, null, Context.NONE);

Download Data

// Download to BinaryData
BinaryData content = blobClient.downloadContent();
String text = content.toString();

// Download to file
blobClient.downloadToFile("downloaded-file.txt");

Download to Stream

try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
    blobClient.downloadStream(outputStream);
    byte[] data = outputStream.toByteArray();
}

Download with InputStream

import com.azure.storage.blob.specialized.BlobInputStream;

try (BlobInputStream blobIS = blobClient.openInputStream()) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = blobIS.read(buffer)) != -1) {
        // Process buffer
    }
}

Upload via OutputStream

import com.azure.storage.blob.specialized.BlobOutputStream;

try (BlobOutputStream blobOS = blobClient.getBlockBlobClient().getBlobOutputStream()) {
    blobOS.write("Data to upload".getBytes());
}

List Blobs

import com.azure.storage.blob.models.BlobItem;

// List all blobs
for (BlobItem blobItem : containerClient.listBlobs()) {
    System.out.println("Blob: " + blobItem.getName());
}

// List with prefix (virtual directory)
import com.azure.storage.blob.models.ListBlobsOptions;

ListBlobsOptions options = new ListBlobsOptions().setPrefix("folder/");
for (BlobItem blobItem : containerClient.listBlobs(options, null)) {
    System.out.println("Blob: " + blobItem.getName());
}

List Blobs by Hierarchy

import com.azure.storage.blob.models.BlobListDetails;

String delimiter = "/";
ListBlobsOptions options = new ListBlobsOptions()
    .setPrefix("data/")
    .setDetails(new BlobListDetails().setRetrieveMetadata(true));

for (BlobItem item : containerClient.listBlobsByHierarchy(delimiter, options, null)) {
    if (item.isPrefix()) {
        System.out.println("Directory: " + item.getName());
    } else {
        System.out.println("Blob: " + item.getName());
    }
}

Delete Blob

blobClient.delete();

// Delete if exists
blobClient.deleteIfExists();

// Delete with snapshots
import com.azure.storage.blob.models.DeleteSnapshotsOptionType;
blobClient.deleteWithResponse(DeleteSnapshotsOptionType.INCLUDE, null, null, Context.NONE);

Copy Blob

import com.azure.storage.blob.models.BlobCopyInfo;
import com.azure.core.util.polling.SyncPoller;

// Async copy (for large blobs or cross-account)
SyncPoller<BlobCopyInfo, Void> poller = blobClient.beginCopy("<source-blob-url>", Duration.ofSeconds(1));
poller.waitForCompletion();

// Sync copy from URL (for same account)
blobClient.copyFromUrl("<source-blob-url>");

Generate SAS Token

import com.azure.storage.blob.sas.*;
import java.time.OffsetDateTime;

// Blob-level SAS
BlobSasPermission permissions = new BlobSasPermission().setReadPermission(true);
OffsetDateTime expiry = OffsetDateTime.now().plusDays(1);

BlobServiceSasSignatureValues sasValues = new BlobServiceSasSignatureValues(expiry, permissions);
String sasToken = blobClient.generateSas(sasValues);

// Container-level SAS
BlobContainerSasPermission containerPermissions = new BlobContainerSasPermission()
    .setReadPermission(true)
    .setListPermission(true);
    
BlobServiceSasSignatureValues containerSasValues = new BlobServiceSasSignatureValues(expiry, containerPermissions);
String containerSas = containerClient.generateSas(containerSasValues);

Blob Properties and Metadata

import com.azure.storage.blob.models.BlobProperties;

// Get properties
BlobProperties properties = blobClient.getProperties();
System.out.println("Size: " + properties.getBlobSize());
System.out.println("Content-Type: " + properties.getContentType());
System.out.println("Last Modified: " + properties.getLastModified());

// Set metadata
Map<String, String> metadata = Map.of("key1", "value1", "key2", "value2");
blobClient.setMetadata(metadata);

// Set HTTP headers
BlobHttpHeaders headers = new BlobHttpHeaders()
    .setContentType("application/json")
    .setCacheControl("max-age=86400");
blobClient.setHttpHeaders(headers);

Lease Blob

import com.azure.storage.blob.specialized.BlobLeaseClient;
import com.azure.storage.blob.specialized.BlobLeaseClientBuilder;

BlobLeaseClient leaseClient = new BlobLeaseClientBuilder()
    .blobClient(blobClient)
    .buildClient();

// Acquire lease (-1 for infinite)
String leaseId = leaseClient.acquireLease(60);

// Renew lease
leaseClient.renewLease();

// Release lease
leaseClient.releaseLease();

Error Handling

import com.azure.storage.blob.models.BlobStorageException;

try {
    blobClient.download(outputStream);
} catch (BlobStorageException e) {
    System.out.println("Status: " + e.getStatusCode());
    System.out.println("Error code: " + e.getErrorCode());
    // 404 = Blob not found
    // 409 = Conflict (lease, etc.)
}

Proxy Configuration

import com.azure.core.http.ProxyOptions;
import com.azure.core.http.netty.NettyAsyncHttpClientBuilder;
import java.net.InetSocketAddress;

ProxyOptions proxyOptions = new ProxyOptions(
    ProxyOptions.Type.HTTP,
    new InetSocketAddress("localhost", 8888));

BlobServiceClient client = new BlobServiceClientBuilder()
    .endpoint("<endpoint>")
    .sasToken("<sas-token>")
    .httpClient(new NettyAsyncHttpClientBuilder().proxy(proxyOptions).build())
    .buildClient();

Environment Variables

AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...  # Alternative to Entra ID auth
AZURE_STORAGE_ACCOUNT_URL=https://<account>.blob.core.windows.net  # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production

Trigger Phrases

  • "Azure Blob Storage Java"
  • "upload download blob"
  • "blob container SDK"
  • "storage streaming"
  • "SAS token generation"
  • "blob metadata properties"
Files (skills)
  • references
    • examples.md 11.3 KB
      # Azure Storage Blob Java SDK - Examples
      
      Comprehensive code examples for the Azure Storage Blob SDK for Java.
      
      ## Table of Contents
      
      - [Maven Dependency](#maven-dependency)
      - [Client Creation](#client-creation)
      - [Container Operations](#container-operations)
      - [Upload Blobs](#upload-blobs)
      - [Download Blobs](#download-blobs)
      - [List Blobs](#list-blobs)
      - [SAS Token Generation](#sas-token-generation)
      - [Error Handling](#error-handling)
      
      ---
      
      ## Maven Dependency
      
      ```xml
      <dependency>
          <groupId>com.azure</groupId>
          <artifactId>azure-storage-blob</artifactId>
          <version>12.33.0</version>
      </dependency>
      ```
      
      Or use the BOM:
      
      ```xml
      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>com.azure</groupId>
                  <artifactId>azure-sdk-bom</artifactId>
                  <version>{bom_version}</version>
                  <type>pom</type>
                  <scope>import</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>
      
      <dependencies>
          <dependency>
              <groupId>com.azure</groupId>
              <artifactId>azure-storage-blob</artifactId>
          </dependency>
      </dependencies>
      ```
      
      ---
      
      ## Client Creation
      
      ### Using Shared Key Credential
      
      ```java
      import com.azure.storage.blob.BlobServiceClient;
      import com.azure.storage.blob.BlobServiceClientBuilder;
      import com.azure.storage.common.StorageSharedKeyCredential;
      
      StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
      
      String endpoint = String.format("https://%s.blob.core.windows.net", accountName);
      BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
          .endpoint(endpoint)
          .credential(credential)
          .buildClient();
      ```
      
      ### Using SAS Token
      
      ```java
      // Separate endpoint and SAS token
      BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
          .endpoint("<your-storage-account-url>")
          .sasToken("<your-sasToken>")
          .buildClient();
      
      // Combined URL with SAS token
      BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
          .endpoint("<your-storage-account-url>" + "?" + "<your-sasToken>")
          .buildClient();
      ```
      
      ### Using DefaultAzureCredential (Recommended)
      
      ```java
      import com.azure.identity.DefaultAzureCredentialBuilder;
      
      BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
          .endpoint("<your-storage-account-url>")
          .credential(new DefaultAzureCredentialBuilder().build())
          .buildClient();
      ```
      
      ---
      
      ## Container Operations
      
      ### Create BlobContainerClient
      
      ```java
      import com.azure.storage.blob.BlobContainerClient;
      import com.azure.storage.blob.BlobContainerClientBuilder;
      
      // From BlobServiceClient
      BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient("mycontainer");
      
      // From builder with SAS token
      BlobContainerClient containerClient = new BlobContainerClientBuilder()
          .endpoint("<your-storage-account-url>")
          .sasToken("<your-sasToken>")
          .containerName("mycontainer")
          .buildClient();
      ```
      
      ### Create Container
      
      ```java
      import java.util.Collections;
      import java.util.Map;
      
      // Simple create
      containerClient.create();
      
      // Create with metadata
      Map<String, String> metadata = Collections.singletonMap("mykey", "myvalue");
      containerClient.createWithResponse(metadata, null, null, Context.NONE);
      
      // Create from service client
      blobServiceClient.createBlobContainer("mycontainer");
      ```
      
      ### List and Delete Containers
      
      ```java
      // List all containers
      blobServiceClient.listBlobContainers().forEach(containerItem -> {
          System.out.println("Container name: " + containerItem.getName());
      });
      
      // Delete container
      containerClient.delete();
      ```
      
      ---
      
      ## Upload Blobs
      
      ### Upload BinaryData
      
      ```java
      import com.azure.core.util.BinaryData;
      import com.azure.storage.blob.BlobClient;
      
      BlobClient blobClient = containerClient.getBlobClient("myblob");
      String dataSample = "samples";
      blobClient.upload(BinaryData.fromString(dataSample));
      ```
      
      ### Upload from InputStream
      
      ```java
      import com.azure.storage.blob.specialized.BlockBlobClient;
      import java.io.ByteArrayInputStream;
      
      BlockBlobClient blockBlobClient = containerClient.getBlobClient("myblockblob").getBlockBlobClient();
      String dataSample = "samples";
      try (ByteArrayInputStream dataStream = new ByteArrayInputStream(dataSample.getBytes())) {
          blockBlobClient.upload(dataStream, dataSample.length());
      }
      ```
      
      ### Upload from File
      
      ```java
      BlobClient blobClient = containerClient.getBlobClient("myblockblob");
      blobClient.uploadFromFile("local-file.jpg");
      ```
      
      ### Upload with Overwrite Control
      
      ```java
      // Upload without overwrite (fails if blob exists)
      blobClient.upload(BinaryData.fromString("data"), false);
      
      // Upload with overwrite enabled
      blobClient.upload(BinaryData.fromString("data"), true);
      
      // Upload with access conditions (fail if blob exists)
      import com.azure.storage.blob.models.BlobRequestConditions;
      import com.azure.storage.blob.options.BlobParallelUploadOptions;
      
      BlobParallelUploadOptions options = new BlobParallelUploadOptions(dataStream, dataSample.length());
      options.setRequestConditions(new BlobRequestConditions().setIfNoneMatch("*"));
      blobClient.uploadWithResponse(options, null, Context.NONE);
      ```
      
      ### Upload with Metadata and Headers
      
      ```java
      import com.azure.storage.blob.models.BlobHttpHeaders;
      import java.security.MessageDigest;
      import java.nio.charset.StandardCharsets;
      
      Map<String, String> metadata = Collections.singletonMap("myblobmetadata", "sample");
      BlobHttpHeaders headers = new BlobHttpHeaders()
          .setContentDisposition("attachment")
          .setContentType("text/html; charset=utf-8");
      
      String data = "Hello world!";
      byte[] md5 = MessageDigest.getInstance("MD5").digest(data.getBytes(StandardCharsets.UTF_8));
      
      try (InputStream dataStream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8))) {
          blockBlobClient.uploadWithResponse(
              dataStream, 
              data.length(), 
              headers, 
              metadata, 
              null,  // tier
              md5,   // content MD5
              null,  // request conditions
              null,  // timeout
              null   // context
          );
      }
      ```
      
      ---
      
      ## Download Blobs
      
      ### Download to BinaryData
      
      ```java
      BinaryData content = blobClient.downloadContent();
      String text = content.toString();
      ```
      
      ### Download to OutputStream
      
      ```java
      import java.io.ByteArrayOutputStream;
      
      try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
          blobClient.downloadStream(outputStream);
          byte[] data = outputStream.toByteArray();
      }
      ```
      
      ### Download to File
      
      ```java
      blobClient.downloadToFile("downloaded-file.jpg");
      ```
      
      ### Download via InputStream
      
      ```java
      import com.azure.storage.blob.specialized.BlobInputStream;
      
      try (BlobInputStream blobIS = blobClient.openInputStream()) {
          int data = blobIS.read();
          // Process data...
      }
      ```
      
      ---
      
      ## List Blobs
      
      ### Simple Listing
      
      ```java
      import com.azure.storage.blob.models.BlobItem;
      
      for (BlobItem blobItem : containerClient.listBlobs()) {
          System.out.println("Blob name: " + blobItem.getName());
      }
      ```
      
      ### List and Create Clients
      
      ```java
      for (BlobItem blobItem : containerClient.listBlobs()) {
          BlobClient blobClient;
          if (blobItem.getSnapshot() != null) {
              blobClient = containerClient.getBlobClient(blobItem.getName(), blobItem.getSnapshot());
          } else {
              blobClient = containerClient.getBlobClient(blobItem.getName());
          }
          System.out.println("Blob URI: " + blobClient.getBlobUrl());
      }
      ```
      
      ---
      
      ## SAS Token Generation
      
      ```java
      import com.azure.storage.blob.sas.*;
      import com.azure.storage.common.sas.*;
      import java.time.OffsetDateTime;
      
      // Generate Account SAS
      OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1);
      AccountSasPermission accountSasPermission = new AccountSasPermission().setReadPermission(true);
      AccountSasService services = new AccountSasService().setBlobAccess(true);
      AccountSasResourceType resourceTypes = new AccountSasResourceType().setObject(true);
      
      AccountSasSignatureValues accountSasValues = new AccountSasSignatureValues(
          expiryTime, accountSasPermission, services, resourceTypes);
      String sasToken = blobServiceClient.generateAccountSas(accountSasValues);
      
      // Generate Container SAS
      BlobContainerSasPermission containerSasPermission = new BlobContainerSasPermission().setCreatePermission(true);
      BlobServiceSasSignatureValues serviceSasValues = new BlobServiceSasSignatureValues(expiryTime, containerSasPermission);
      String containerSas = containerClient.generateSas(serviceSasValues);
      
      // Generate Blob SAS
      BlobSasPermission blobSasPermission = new BlobSasPermission().setReadPermission(true);
      BlobServiceSasSignatureValues blobSasValues = new BlobServiceSasSignatureValues(expiryTime, blobSasPermission);
      String blobSas = blobClient.generateSas(blobSasValues);
      ```
      
      ---
      
      ## Error Handling
      
      ```java
      import com.azure.storage.blob.models.BlobErrorCode;
      import com.azure.storage.blob.models.BlobStorageException;
      
      try {
          containerClient.create();
      } catch (BlobStorageException e) {
          if (e.getErrorCode() == BlobErrorCode.CONTAINER_ALREADY_EXISTS) {
              System.out.println("Container already exists: " + containerClient.getBlobContainerUrl());
          } else if (e.getErrorCode() == BlobErrorCode.CONTAINER_BEING_DELETED) {
              System.out.println("Container is being deleted: " + e.getServiceMessage());
          } else if (e.getErrorCode() == BlobErrorCode.RESOURCE_NOT_FOUND) {
              System.out.println("Resource not found, status: " + e.getStatusCode());
          } else {
              throw e;
          }
      }
      ```
      
      ---
      
      ## Complete Working Example
      
      ```java
      import com.azure.storage.blob.*;
      import com.azure.storage.blob.specialized.BlockBlobClient;
      import com.azure.storage.common.StorageSharedKeyCredential;
      
      import java.io.*;
      import java.nio.charset.StandardCharsets;
      import java.util.Locale;
      
      public class BasicExample {
      
          public static void main(String[] args) throws IOException {
              String accountName = System.getenv("AZURE_STORAGE_ACCOUNT_NAME");
              String accountKey = System.getenv("AZURE_STORAGE_ACCOUNT_KEY");
      
              StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
              String endpoint = String.format(Locale.ROOT, "https://%s.blob.core.windows.net", accountName);
      
              BlobServiceClient storageClient = new BlobServiceClientBuilder()
                  .endpoint(endpoint)
                  .credential(credential)
                  .buildClient();
      
              // Create container (names must be lowercase)
              BlobContainerClient containerClient = storageClient
                  .getBlobContainerClient("myjavacontainer" + System.currentTimeMillis());
              containerClient.create();
      
              // Create blob client
              BlockBlobClient blobClient = containerClient
                  .getBlobClient("HelloWorld.txt")
                  .getBlockBlobClient();
      
              // Upload data
              String data = "Hello world!";
              try (InputStream dataStream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8))) {
                  blobClient.upload(dataStream, data.length());
              }
      
              // Download data
              int dataSize = (int) blobClient.getProperties().getBlobSize();
              try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(dataSize)) {
                  blobClient.downloadStream(outputStream);
                  String downloaded = new String(outputStream.toByteArray(), StandardCharsets.UTF_8);
                  System.out.println("Downloaded: " + downloaded);
              }
      
              // List blobs
              containerClient.listBlobs().forEach(blobItem -> 
                  System.out.println("Blob: " + blobItem.getName()));
      
              // Cleanup
              blobClient.delete();
              containerClient.delete();
          }
      }
      ```
      
  • SKILL.md 10.6 KB
    ---
    name: azure-storage-blob-java
    description: Build blob storage applications with Azure Storage Blob SDK for Java. Use when uploading, downloading, or managing files in Azure Blob Storage, working with containers, or implementing streaming data operations.
    license: MIT
    metadata:
      author: Microsoft
      version: "1.0.0"
      package: com.azure:azure-storage-blob
    ---
    
    # Azure Storage Blob SDK for Java
    
    Build blob storage applications using the Azure Storage Blob SDK for Java.
    
    ## Installation
    
    ```xml
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-storage-blob</artifactId>
        <version>12.33.0</version>
    </dependency>
    ```
    
    ## Client Creation
    
    ### BlobServiceClient
    
    ```java
    import com.azure.storage.blob.BlobServiceClient;
    import com.azure.storage.blob.BlobServiceClientBuilder;
    
    // With SAS token
    BlobServiceClient serviceClient = new BlobServiceClientBuilder()
        .endpoint("<storage-account-url>")
        .sasToken("<sas-token>")
        .buildClient();
    
    // With connection string
    BlobServiceClient serviceClient = new BlobServiceClientBuilder()
        .connectionString("<connection-string>")
        .buildClient();
    ```
    
    ### With DefaultAzureCredential
    
    ```java
    import com.azure.core.credential.TokenCredential;
    import com.azure.identity.AzureIdentityEnvVars;
    import com.azure.identity.DefaultAzureCredentialBuilder;
    import com.azure.identity.ManagedIdentityCredentialBuilder;
    
    // Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
    TokenCredential credential = new DefaultAzureCredentialBuilder()
        .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
        .build();
    // Or use a specific credential directly in production:
    // See https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes
    // TokenCredential credential = new ManagedIdentityCredentialBuilder().build();
    
    BlobServiceClient serviceClient = new BlobServiceClientBuilder()
        .endpoint("<storage-account-url>")
        .credential(credential)
        .buildClient();
    ```
    
    ### BlobContainerClient
    
    ```java
    import com.azure.storage.blob.BlobContainerClient;
    
    // From service client
    BlobContainerClient containerClient = serviceClient.getBlobContainerClient("mycontainer");
    
    // Direct construction
    BlobContainerClient containerClient = new BlobContainerClientBuilder()
        .connectionString("<connection-string>")
        .containerName("mycontainer")
        .buildClient();
    ```
    
    ### BlobClient
    
    ```java
    import com.azure.storage.blob.BlobClient;
    
    // From container client
    BlobClient blobClient = containerClient.getBlobClient("myblob.txt");
    
    // With directory structure
    BlobClient blobClient = containerClient.getBlobClient("folder/subfolder/myblob.txt");
    
    // Direct construction
    BlobClient blobClient = new BlobClientBuilder()
        .connectionString("<connection-string>")
        .containerName("mycontainer")
        .blobName("myblob.txt")
        .buildClient();
    ```
    
    ## Core Patterns
    
    ### Create Container
    
    ```java
    // Create container
    serviceClient.createBlobContainer("mycontainer");
    
    // Create if not exists
    BlobContainerClient container = serviceClient.createBlobContainerIfNotExists("mycontainer");
    
    // From container client
    containerClient.create();
    containerClient.createIfNotExists();
    ```
    
    ### Upload Data
    
    ```java
    import com.azure.core.util.BinaryData;
    
    // Upload string
    String data = "Hello, Azure Blob Storage!";
    blobClient.upload(BinaryData.fromString(data));
    
    // Upload with overwrite
    blobClient.upload(BinaryData.fromString(data), true);
    ```
    
    ### Upload from File
    
    ```java
    blobClient.uploadFromFile("local-file.txt");
    
    // With overwrite
    blobClient.uploadFromFile("local-file.txt", true);
    ```
    
    ### Upload from Stream
    
    ```java
    import com.azure.storage.blob.specialized.BlockBlobClient;
    
    BlockBlobClient blockBlobClient = blobClient.getBlockBlobClient();
    
    try (ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes())) {
        blockBlobClient.upload(dataStream, data.length());
    }
    ```
    
    ### Upload with Options
    
    ```java
    import com.azure.storage.blob.models.BlobHttpHeaders;
    import com.azure.storage.blob.options.BlobParallelUploadOptions;
    
    BlobHttpHeaders headers = new BlobHttpHeaders()
        .setContentType("text/plain")
        .setCacheControl("max-age=3600");
    
    Map<String, String> metadata = Map.of("author", "john", "version", "1.0");
    
    try (InputStream stream = new FileInputStream("large-file.bin")) {
        BlobParallelUploadOptions options = new BlobParallelUploadOptions(stream)
            .setHeaders(headers)
            .setMetadata(metadata);
        
        blobClient.uploadWithResponse(options, null, Context.NONE);
    }
    ```
    
    ### Upload if Not Exists
    
    ```java
    import com.azure.storage.blob.models.BlobRequestConditions;
    
    BlobParallelUploadOptions options = new BlobParallelUploadOptions(inputStream, length)
        .setRequestConditions(new BlobRequestConditions().setIfNoneMatch("*"));
    
    blobClient.uploadWithResponse(options, null, Context.NONE);
    ```
    
    ### Download Data
    
    ```java
    // Download to BinaryData
    BinaryData content = blobClient.downloadContent();
    String text = content.toString();
    
    // Download to file
    blobClient.downloadToFile("downloaded-file.txt");
    ```
    
    ### Download to Stream
    
    ```java
    try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
        blobClient.downloadStream(outputStream);
        byte[] data = outputStream.toByteArray();
    }
    ```
    
    ### Download with InputStream
    
    ```java
    import com.azure.storage.blob.specialized.BlobInputStream;
    
    try (BlobInputStream blobIS = blobClient.openInputStream()) {
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = blobIS.read(buffer)) != -1) {
            // Process buffer
        }
    }
    ```
    
    ### Upload via OutputStream
    
    ```java
    import com.azure.storage.blob.specialized.BlobOutputStream;
    
    try (BlobOutputStream blobOS = blobClient.getBlockBlobClient().getBlobOutputStream()) {
        blobOS.write("Data to upload".getBytes());
    }
    ```
    
    ### List Blobs
    
    ```java
    import com.azure.storage.blob.models.BlobItem;
    
    // List all blobs
    for (BlobItem blobItem : containerClient.listBlobs()) {
        System.out.println("Blob: " + blobItem.getName());
    }
    
    // List with prefix (virtual directory)
    import com.azure.storage.blob.models.ListBlobsOptions;
    
    ListBlobsOptions options = new ListBlobsOptions().setPrefix("folder/");
    for (BlobItem blobItem : containerClient.listBlobs(options, null)) {
        System.out.println("Blob: " + blobItem.getName());
    }
    ```
    
    ### List Blobs by Hierarchy
    
    ```java
    import com.azure.storage.blob.models.BlobListDetails;
    
    String delimiter = "/";
    ListBlobsOptions options = new ListBlobsOptions()
        .setPrefix("data/")
        .setDetails(new BlobListDetails().setRetrieveMetadata(true));
    
    for (BlobItem item : containerClient.listBlobsByHierarchy(delimiter, options, null)) {
        if (item.isPrefix()) {
            System.out.println("Directory: " + item.getName());
        } else {
            System.out.println("Blob: " + item.getName());
        }
    }
    ```
    
    ### Delete Blob
    
    ```java
    blobClient.delete();
    
    // Delete if exists
    blobClient.deleteIfExists();
    
    // Delete with snapshots
    import com.azure.storage.blob.models.DeleteSnapshotsOptionType;
    blobClient.deleteWithResponse(DeleteSnapshotsOptionType.INCLUDE, null, null, Context.NONE);
    ```
    
    ### Copy Blob
    
    ```java
    import com.azure.storage.blob.models.BlobCopyInfo;
    import com.azure.core.util.polling.SyncPoller;
    
    // Async copy (for large blobs or cross-account)
    SyncPoller<BlobCopyInfo, Void> poller = blobClient.beginCopy("<source-blob-url>", Duration.ofSeconds(1));
    poller.waitForCompletion();
    
    // Sync copy from URL (for same account)
    blobClient.copyFromUrl("<source-blob-url>");
    ```
    
    ### Generate SAS Token
    
    ```java
    import com.azure.storage.blob.sas.*;
    import java.time.OffsetDateTime;
    
    // Blob-level SAS
    BlobSasPermission permissions = new BlobSasPermission().setReadPermission(true);
    OffsetDateTime expiry = OffsetDateTime.now().plusDays(1);
    
    BlobServiceSasSignatureValues sasValues = new BlobServiceSasSignatureValues(expiry, permissions);
    String sasToken = blobClient.generateSas(sasValues);
    
    // Container-level SAS
    BlobContainerSasPermission containerPermissions = new BlobContainerSasPermission()
        .setReadPermission(true)
        .setListPermission(true);
        
    BlobServiceSasSignatureValues containerSasValues = new BlobServiceSasSignatureValues(expiry, containerPermissions);
    String containerSas = containerClient.generateSas(containerSasValues);
    ```
    
    ### Blob Properties and Metadata
    
    ```java
    import com.azure.storage.blob.models.BlobProperties;
    
    // Get properties
    BlobProperties properties = blobClient.getProperties();
    System.out.println("Size: " + properties.getBlobSize());
    System.out.println("Content-Type: " + properties.getContentType());
    System.out.println("Last Modified: " + properties.getLastModified());
    
    // Set metadata
    Map<String, String> metadata = Map.of("key1", "value1", "key2", "value2");
    blobClient.setMetadata(metadata);
    
    // Set HTTP headers
    BlobHttpHeaders headers = new BlobHttpHeaders()
        .setContentType("application/json")
        .setCacheControl("max-age=86400");
    blobClient.setHttpHeaders(headers);
    ```
    
    ### Lease Blob
    
    ```java
    import com.azure.storage.blob.specialized.BlobLeaseClient;
    import com.azure.storage.blob.specialized.BlobLeaseClientBuilder;
    
    BlobLeaseClient leaseClient = new BlobLeaseClientBuilder()
        .blobClient(blobClient)
        .buildClient();
    
    // Acquire lease (-1 for infinite)
    String leaseId = leaseClient.acquireLease(60);
    
    // Renew lease
    leaseClient.renewLease();
    
    // Release lease
    leaseClient.releaseLease();
    ```
    
    ## Error Handling
    
    ```java
    import com.azure.storage.blob.models.BlobStorageException;
    
    try {
        blobClient.download(outputStream);
    } catch (BlobStorageException e) {
        System.out.println("Status: " + e.getStatusCode());
        System.out.println("Error code: " + e.getErrorCode());
        // 404 = Blob not found
        // 409 = Conflict (lease, etc.)
    }
    ```
    
    ## Proxy Configuration
    
    ```java
    import com.azure.core.http.ProxyOptions;
    import com.azure.core.http.netty.NettyAsyncHttpClientBuilder;
    import java.net.InetSocketAddress;
    
    ProxyOptions proxyOptions = new ProxyOptions(
        ProxyOptions.Type.HTTP,
        new InetSocketAddress("localhost", 8888));
    
    BlobServiceClient client = new BlobServiceClientBuilder()
        .endpoint("<endpoint>")
        .sasToken("<sas-token>")
        .httpClient(new NettyAsyncHttpClientBuilder().proxy(proxyOptions).build())
        .buildClient();
    ```
    
    ## Environment Variables
    
    ```bash
    AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...  # Alternative to Entra ID auth
    AZURE_STORAGE_ACCOUNT_URL=https://<account>.blob.core.windows.net  # Required for all auth methods
    AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production
    ```
    
    ## Trigger Phrases
    
    - "Azure Blob Storage Java"
    - "upload download blob"
    - "blob container SDK"
    - "storage streaming"
    - "SAS token generation"
    - "blob metadata properties"
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related