CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-com-azure--azure-storage-blob

Microsoft Azure client library for Blob Storage - Azure Blob Storage is Microsoft's object storage solution for the cloud, optimized for storing massive amounts of unstructured data such as text or binary data.

Pending
Overview
Eval results
Files

models.mddocs/

Model Classes & Enums

This documentation covers the key model classes, properties, and enums used throughout the Azure Storage Blob Java SDK for representing data, configuration, and service responses.

Core Model Classes

BlobProperties

Comprehensive properties and metadata for a blob.

import com.azure.storage.blob.models.BlobProperties;
import java.time.OffsetDateTime;
import java.util.Map;

// Get blob properties
BlobProperties properties = blobClient.getProperties();

// Basic blob information
System.out.println("Blob size: " + properties.getBlobSize() + " bytes");
System.out.println("Blob type: " + properties.getBlobType()); // BLOCK_BLOB, APPEND_BLOB, PAGE_BLOB
System.out.println("ETag: " + properties.getETag());
System.out.println("Last modified: " + properties.getLastModified());
System.out.println("Creation time: " + properties.getCreationTime());

// Content properties
System.out.println("Content type: " + properties.getContentType());
System.out.println("Content encoding: " + properties.getContentEncoding());
System.out.println("Content language: " + properties.getContentLanguage());
System.out.println("Content disposition: " + properties.getContentDisposition());
System.out.println("Cache control: " + properties.getCacheControl());
System.out.println("Content MD5: " + Arrays.toString(properties.getContentMd5()));

// Access tier and archival
System.out.println("Access tier: " + properties.getAccessTier());
System.out.println("Tier inferred: " + properties.getAccessTierInferred());
System.out.println("Tier change time: " + properties.getAccessTierChangeTime());
System.out.println("Archive status: " + properties.getArchiveStatus());

// Versioning and snapshots
System.out.println("Version ID: " + properties.getVersionId());
System.out.println("Is current version: " + properties.isCurrentVersion());
System.out.println("Deleted time: " + properties.getDeletedTime());
System.out.println("Remaining retention days: " + properties.getRemainingRetentionDays());

// Lease information
System.out.println("Lease status: " + properties.getLeaseStatus());
System.out.println("Lease state: " + properties.getLeaseState());
System.out.println("Lease duration: " + properties.getLeaseDuration());

// Copy information
System.out.println("Copy ID: " + properties.getCopyId());
System.out.println("Copy status: " + properties.getCopyStatus());
System.out.println("Copy source: " + properties.getCopySource());
System.out.println("Copy progress: " + properties.getCopyProgress());
System.out.println("Copy completion time: " + properties.getCopyCompletionTime());

// Encryption and security
System.out.println("Server encrypted: " + properties.isServerEncrypted());
System.out.println("Encryption key SHA256: " + properties.getEncryptionKeySha256());
System.out.println("Encryption scope: " + properties.getEncryptionScope());

// Compliance and governance
System.out.println("Has legal hold: " + properties.hasLegalHold());
BlobImmutabilityPolicy immutabilityPolicy = properties.getImmutabilityPolicy();
if (immutabilityPolicy != null) {
    System.out.println("Immutability expiry: " + immutabilityPolicy.getExpiryTime());
    System.out.println("Immutability mode: " + immutabilityPolicy.getPolicyMode());
}

// Metadata and tags
Map<String, String> metadata = properties.getMetadata();
System.out.println("Metadata count: " + metadata.size());
System.out.println("Tag count: " + properties.getTagCount());

// Page blob specific
if (properties.getBlobType() == BlobType.PAGE_BLOB) {
    System.out.println("Blob sequence number: " + properties.getBlobSequenceNumber());
}

// Block blob specific
if (properties.getBlobType() == BlobType.BLOCK_BLOB) {
    System.out.println("Committed block count: " + properties.getCommittedBlockCount());
}

// Object replication
List<ObjectReplicationPolicy> replicationPolicies = properties.getObjectReplicationSourcePolicies();
if (replicationPolicies != null) {
    System.out.println("Object replication policies: " + replicationPolicies.size());
}
System.out.println("Replication destination policy: " + properties.getObjectReplicationDestinationPolicyId());

BlobContainerProperties

Properties and metadata for a blob container.

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

// Get container properties
BlobContainerProperties containerProps = containerClient.getProperties();

// Basic container information
System.out.println("ETag: " + containerProps.getETag());
System.out.println("Last modified: " + containerProps.getLastModified());
System.out.println("Public access: " + containerProps.getPublicAccess());

// Lease information
System.out.println("Lease status: " + containerProps.getLeaseStatus());
System.out.println("Lease state: " + containerProps.getLeaseState());
System.out.println("Lease duration: " + containerProps.getLeaseDuration());

// Security and compliance
System.out.println("Has immutability policy: " + containerProps.hasImmutabilityPolicy());
System.out.println("Has legal hold: " + containerProps.hasLegalHold());

// Encryption
System.out.println("Default encryption scope: " + containerProps.getDefaultEncryptionScope());
System.out.println("Encryption scope override prevented: " + 
    containerProps.isEncryptionScopeOverridePrevented());

// Metadata
Map<String, String> containerMetadata = containerProps.getMetadata();
System.out.println("Container metadata:");
containerMetadata.forEach((key, value) -> 
    System.out.println("  " + key + ": " + value));

BlobItem

Represents a blob item in listing operations.

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

// List blobs and examine blob items
PagedIterable<BlobItem> blobs = containerClient.listBlobs();
for (BlobItem blobItem : blobs) {
    // Basic blob item information
    System.out.println("Blob name: " + blobItem.getName());
    System.out.println("Is deleted: " + blobItem.isDeleted());
    System.out.println("Snapshot: " + blobItem.getSnapshot());
    System.out.println("Version ID: " + blobItem.getVersionId());
    System.out.println("Is current version: " + blobItem.isCurrentVersion());
    System.out.println("Has versions only: " + blobItem.hasVersionsOnly());

    // Blob properties from listing
    BlobItemProperties itemProps = blobItem.getProperties();
    System.out.println("Size: " + itemProps.getContentLength() + " bytes");
    System.out.println("Content type: " + itemProps.getContentType());
    System.out.println("Last modified: " + itemProps.getLastModified());
    System.out.println("ETag: " + itemProps.getETag());
    System.out.println("Blob type: " + itemProps.getBlobType());
    System.out.println("Access tier: " + itemProps.getAccessTier());
    System.out.println("Server encrypted: " + itemProps.isServerEncrypted());

    // Metadata and tags (if requested in list options)
    Map<String, String> itemMetadata = blobItem.getMetadata();
    if (itemMetadata != null) {
        System.out.println("Metadata entries: " + itemMetadata.size());
    }
    
    Map<String, String> itemTags = blobItem.getTags();
    if (itemTags != null) {
        System.out.println("Tag entries: " + itemTags.size());
    }

    // Object replication
    List<ObjectReplicationPolicy> replicationPolicies = blobItem.getObjectReplicationSourcePolicies();
    if (replicationPolicies != null) {
        System.out.println("Replication policies: " + replicationPolicies.size());
    }
}

BlobServiceProperties

Service-level properties for Azure Blob Storage account.

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

// Get and configure service properties
BlobServiceProperties serviceProps = serviceClient.getProperties();

// Logging configuration
BlobAnalyticsLogging logging = serviceProps.getLogging();
if (logging != null) {
    System.out.println("Logging version: " + logging.getVersion());
    System.out.println("Delete enabled: " + logging.isDeleteEnabled());
    System.out.println("Read enabled: " + logging.isReadEnabled());
    System.out.println("Write enabled: " + logging.isWriteEnabled());
    
    BlobRetentionPolicy logRetention = logging.getRetentionPolicy();
    if (logRetention != null) {
        System.out.println("Log retention enabled: " + logRetention.isEnabled());
        System.out.println("Log retention days: " + logRetention.getDays());
    }
}

// Metrics configuration
BlobMetrics hourMetrics = serviceProps.getHourMetrics();
if (hourMetrics != null) {
    System.out.println("Hour metrics enabled: " + hourMetrics.isEnabled());
    System.out.println("Include APIs: " + hourMetrics.isIncludeApis());
    
    BlobRetentionPolicy metricsRetention = hourMetrics.getRetentionPolicy();
    if (metricsRetention != null) {
        System.out.println("Metrics retention days: " + metricsRetention.getDays());
    }
}

BlobMetrics minuteMetrics = serviceProps.getMinuteMetrics();
if (minuteMetrics != null) {
    System.out.println("Minute metrics enabled: " + minuteMetrics.isEnabled());
}

// CORS rules
List<BlobCorsRule> corsRules = serviceProps.getCors();
if (corsRules != null) {
    System.out.println("CORS rules count: " + corsRules.size());
    for (BlobCorsRule corsRule : corsRules) {
        System.out.println("Allowed origins: " + corsRule.getAllowedOrigins());
        System.out.println("Allowed methods: " + corsRule.getAllowedMethods());
        System.out.println("Max age: " + corsRule.getMaxAgeInSeconds());
    }
}

// Default service version
System.out.println("Default service version: " + serviceProps.getDefaultServiceVersion());

// Delete retention policy
BlobRetentionPolicy deleteRetention = serviceProps.getDeleteRetentionPolicy();
if (deleteRetention != null) {
    System.out.println("Delete retention enabled: " + deleteRetention.isEnabled());
    System.out.println("Delete retention days: " + deleteRetention.getDays());
}

// Static website configuration
BlobStaticWebsite staticWebsite = serviceProps.getStaticWebsite();
if (staticWebsite != null) {
    System.out.println("Static website enabled: " + staticWebsite.isEnabled());
    System.out.println("Index document: " + staticWebsite.getIndexDocument());
    System.out.println("Error document: " + staticWebsite.getErrorDocument404Path());
}

HTTP Headers and Request Models

BlobHttpHeaders

HTTP headers for blob content.

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

// Create and configure HTTP headers
BlobHttpHeaders headers = new BlobHttpHeaders()
    .setContentType("application/pdf")
    .setContentLanguage("en-US")
    .setContentEncoding("gzip")
    .setCacheControl("public, max-age=31536000")
    .setContentDisposition("attachment; filename=document.pdf");

// Calculate and set content MD5
byte[] content = Files.readAllBytes(Paths.get("document.pdf"));
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] contentMd5 = md5.digest(content);
headers.setContentMd5(contentMd5);

// Use headers in upload
blobClient.upload(BinaryData.fromBytes(content), true);
blobClient.setHttpHeaders(headers);

// Get current headers
BlobProperties properties = blobClient.getProperties();
System.out.println("Content type: " + properties.getContentType());
System.out.println("Content encoding: " + properties.getContentEncoding());
System.out.println("Content language: " + properties.getContentLanguage());
System.out.println("Content disposition: " + properties.getContentDisposition());
System.out.println("Cache control: " + properties.getCacheControl());
System.out.println("Content MD5: " + Arrays.toString(properties.getContentMd5()));

BlobRequestConditions

Conditional request parameters for blob operations.

import com.azure.storage.blob.models.BlobRequestConditions;
import java.time.OffsetDateTime;

// Create request conditions for optimistic concurrency control
BlobRequestConditions conditions = new BlobRequestConditions()
    .setIfMatch("\"0x8D64EA4B2C6B7A0\"")  // Only if ETag matches
    .setIfNoneMatch("*")  // Only if blob doesn't exist
    .setIfModifiedSince(OffsetDateTime.now().minusHours(1))  // Only if modified since
    .setIfUnmodifiedSince(OffsetDateTime.now())  // Only if not modified since
    .setLeaseId("lease-id-12345")  // Only with valid lease
    .setTagsConditions("\"environment\" = 'production' AND \"team\" = 'backend'");  // Tag-based conditions

// Use conditions in operations
try {
    blobClient.uploadWithResponse(
        new BlobParallelUploadOptions(BinaryData.fromString("Updated content"))
            .setRequestConditions(conditions),
        Duration.ofMinutes(5),
        Context.NONE
    );
    System.out.println("Upload succeeded with conditions");
} catch (BlobStorageException ex) {
    if (ex.getStatusCode() == 412) { // Precondition Failed
        System.err.println("Conditional operation failed: " + ex.getErrorCode());
    } else {
        throw ex;
    }
}

// Specialized conditions for different blob types
AppendBlobRequestConditions appendConditions = new AppendBlobRequestConditions()
    .setIfMatch(currentETag)
    .setAppendPositionEqual(expectedOffset)  // Append only at specific position
    .setMaxSize(100 * 1024 * 1024L);  // Ensure blob doesn't exceed 100MB

PageBlobRequestConditions pageConditions = new PageBlobRequestConditions()
    .setIfMatch(currentETag)
    .setIfSequenceNumberEqual(expectedSequenceNumber)  // Page blob sequence number check
    .setIfSequenceNumberLessThan(maxSequenceNumber)
    .setIfSequenceNumberLessThanOrEqual(limitSequenceNumber);

Response and Result Models

BlockBlobItem, AppendBlobItem, PageBlobItem

Results from specialized blob operations.

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

// Block blob operation results
BlockBlobItem blockResult = blockBlobClient.upload(BinaryData.fromString("Block content"), true);
System.out.println("Block blob ETag: " + blockResult.getETag());
System.out.println("Last modified: " + blockResult.getLastModified());
System.out.println("Content MD5: " + Arrays.toString(blockResult.getContentMd5()));
System.out.println("Version ID: " + blockResult.getVersionId());
System.out.println("Server encrypted: " + blockResult.isServerEncrypted());
System.out.println("Encryption key SHA256: " + blockResult.getEncryptionKeySha256());

// Append blob operation results
appendBlobClient.create();
AppendBlobItem appendResult = appendBlobClient.appendBlock(BinaryData.fromString("Log entry"));
System.out.println("Append ETag: " + appendResult.getETag());
System.out.println("Last modified: " + appendResult.getLastModified());
System.out.println("Append offset: " + appendResult.getBlobAppendOffset());
System.out.println("Committed block count: " + appendResult.getBlobCommittedBlockCount());

// Page blob operation results
pageBlobClient.create(1024 * 512); // 512KB
PageBlobItem pageResult = pageBlobClient.uploadPages(
    new PageRange().setStart(0).setEnd(511), 
    BinaryData.fromBytes(new byte[512])
);
System.out.println("Page blob ETag: " + pageResult.getETag());
System.out.println("Last modified: " + pageResult.getLastModified());
System.out.println("Blob sequence number: " + pageResult.getBlobSequenceNumber());

BlobCopyInfo and Copy Status

Information about blob copy operations.

// Start copy operation
String sourceUrl = "https://source.blob.core.windows.net/container/source.txt";
SyncPoller<BlobCopyInfo, Void> copyPoller = blobClient.beginCopy(sourceUrl, Duration.ofMinutes(1));

// Monitor copy progress
while (!copyPoller.poll().getStatus().isComplete()) {
    BlobCopyInfo copyInfo = copyPoller.poll().getValue();
    
    System.out.println("Copy ID: " + copyInfo.getCopyId());
    System.out.println("Copy status: " + copyInfo.getCopyStatus());
    System.out.println("Copy source: " + copyInfo.getCopySource());
    
    if (copyInfo.getTotalBytes() != null && copyInfo.getBytesTransferred() != null) {
        long progress = (copyInfo.getBytesTransferred() * 100) / copyInfo.getTotalBytes();
        System.out.println("Progress: " + progress + "% (" + 
            copyInfo.getBytesTransferred() + "/" + copyInfo.getTotalBytes() + " bytes)");
    }
    
    if (copyInfo.getCopyStatus() == CopyStatusType.FAILED) {
        System.err.println("Copy failed: " + copyInfo.getError());
        break;
    }
    
    Thread.sleep(1000); // Wait 1 second
}

// Get final copy status
BlobProperties finalProperties = blobClient.getProperties();
System.out.println("Final copy status: " + finalProperties.getCopyStatus());
System.out.println("Copy completion time: " + finalProperties.getCopyCompletionTime());

Storage Account and Service Models

StorageAccountInfo

Information about the storage account.

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

// Get account information
StorageAccountInfo accountInfo = serviceClient.getAccountInfo();

System.out.println("SKU name: " + accountInfo.getSkuName());
System.out.println("Account kind: " + accountInfo.getAccountKind());
System.out.println("Hierarchical namespace enabled: " + accountInfo.isHierarchicalNamespaceEnabled());

// Account kind values
AccountKind kind = accountInfo.getAccountKind();
switch (kind) {
    case STORAGE:
        System.out.println("General-purpose v1 account");
        break;
    case STORAGE_V2:
        System.out.println("General-purpose v2 account");
        break;
    case BLOB_STORAGE:
        System.out.println("Blob storage account");
        break;
    case BLOCK_BLOB_STORAGE:
        System.out.println("Premium block blob storage account");
        break;
    default:
        System.out.println("Other account type: " + kind);
}

// SKU name values indicate performance tier
SkuName sku = accountInfo.getSkuName();
System.out.println("Performance tier: " + (sku.toString().contains("Premium") ? "Premium" : "Standard"));

BlobServiceStatistics

Statistics for blob service geo-replication.

import com.azure.storage.blob.models.BlobServiceStatistics;
import com.azure.storage.blob.models.GeoReplication;

// Get service statistics (only available for RA-GRS accounts)
try {
    BlobServiceStatistics stats = serviceClient.getStatistics();
    
    GeoReplication geoReplication = stats.getGeoReplication();
    if (geoReplication != null) {
        System.out.println("Geo-replication status: " + geoReplication.getStatus());
        System.out.println("Last sync time: " + geoReplication.getLastSyncTime());
        
        switch (geoReplication.getStatus()) {
            case LIVE:
                System.out.println("Secondary region is available for read access");
                break;
            case BOOTSTRAP:
                System.out.println("Initial synchronization is in progress");
                break;
            case UNAVAILABLE:
                System.out.println("Secondary region is unavailable");
                break;
            default:
                System.out.println("Unknown replication status: " + geoReplication.getStatus());
        }
    } else {
        System.out.println("Geo-replication not configured");
    }
} catch (BlobStorageException ex) {
    if (ex.getStatusCode() == 400) {
        System.out.println("Statistics not available (account not configured for geo-replication)");
    } else {
        throw ex;
    }
}

TaggedBlobItem

Represents a blob found by tag-based queries.

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

// Find blobs by tags
String tagQuery = "environment='production' AND team='backend'";
PagedIterable<TaggedBlobItem> taggedBlobs = serviceClient.findBlobsByTags(tagQuery);

for (TaggedBlobItem taggedBlob : taggedBlobs) {
    System.out.println("Blob name: " + taggedBlob.getName());
    System.out.println("Container: " + taggedBlob.getContainerName());
    
    // Access tags
    BlobTags tags = taggedBlob.getTags();
    Map<String, String> tagMap = tags.toMap();
    System.out.println("Tags:");
    tagMap.forEach((key, value) -> System.out.println("  " + key + ": " + value));
}

Enums and Constants

BlobType

Types of blobs supported by Azure Storage.

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

// Check blob type from properties
BlobProperties properties = blobClient.getProperties();
BlobType blobType = properties.getBlobType();

switch (blobType) {
    case BLOCK_BLOB:
        System.out.println("Block blob - optimized for streaming and general-purpose scenarios");
        BlockBlobClient blockClient = blobClient.getBlockBlobClient();
        break;
        
    case APPEND_BLOB:
        System.out.println("Append blob - optimized for append operations and logging");
        AppendBlobClient appendClient = blobClient.getAppendBlobClient();
        break;
        
    case PAGE_BLOB:
        System.out.println("Page blob - optimized for random read/write operations");
        PageBlobClient pageClient = blobClient.getPageBlobClient();
        break;
        
    default:
        System.out.println("Unknown blob type: " + blobType);
}

AccessTier

Storage access tiers for cost optimization.

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

// Set appropriate access tier based on access patterns
AccessTier tier = determineOptimalTier(blobAccessFrequency);
blobClient.setAccessTier(tier);

// Access tier values and their characteristics
public AccessTier determineOptimalTier(String accessFrequency) {
    switch (accessFrequency.toLowerCase()) {
        case "frequent":
            return AccessTier.HOT;      // Highest storage cost, lowest access cost
        case "infrequent":
            return AccessTier.COOL;     // Lower storage cost, higher access cost (30+ days)
        case "rarely":
            return AccessTier.COLD;     // Even lower storage cost (90+ days)
        case "archive":
            return AccessTier.ARCHIVE;  // Lowest storage cost, highest access cost (180+ days)
        default:
            return AccessTier.HOT;
    }
}

// Premium access tiers for premium storage accounts
if (accountInfo.getSkuName().toString().contains("Premium")) {
    // Premium tiers: P4, P6, P10, P15, P20, P30, P40, P50, P60, P70, P80
    blobClient.setAccessTier(AccessTier.P30); // Premium performance tier
}

// Check current access tier
BlobProperties properties = blobClient.getProperties();
System.out.println("Current access tier: " + properties.getAccessTier());
System.out.println("Tier inferred: " + properties.getAccessTierInferred());
System.out.println("Tier change time: " + properties.getAccessTierChangeTime());

// Archive status for blobs being rehydrated
ArchiveStatus archiveStatus = properties.getArchiveStatus();
if (archiveStatus != null) {
    System.out.println("Archive status: " + archiveStatus);
    switch (archiveStatus) {
        case REHYDRATE_PENDING_TO_HOT:
            System.out.println("Blob is being rehydrated to Hot tier");
            break;
        case REHYDRATE_PENDING_TO_COOL:
            System.out.println("Blob is being rehydrated to Cool tier");
            break;
        case REHYDRATE_PENDING_TO_COLD:
            System.out.println("Blob is being rehydrated to Cold tier");
            break;
    }
}

PublicAccessType

Public access levels for blob containers.

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

// Configure container public access
PublicAccessType publicAccess = PublicAccessType.BLOB;
containerClient.setAccessPolicy(publicAccess, null);

// Public access types
switch (publicAccess) {
    case CONTAINER:
        System.out.println("Container and blobs can be read by anonymous clients");
        // Anonymous clients can:
        // - List blobs in the container
        // - Read container metadata and properties
        // - Read blob data and metadata
        break;
        
    case BLOB:
        System.out.println("Only blobs can be read by anonymous clients");
        // Anonymous clients can:
        // - Read blob data and metadata (with direct URL)
        // Cannot list blobs or read container properties
        break;
        
    case null:
        System.out.println("No public access - authentication required");
        // All access requires authentication
        break;
}

// Check current public access level
BlobContainerProperties containerProps = containerClient.getProperties();
PublicAccessType currentAccess = containerProps.getPublicAccess();
System.out.println("Current public access: " + 
    (currentAccess != null ? currentAccess : "None"));

Lease States and Status

Lease information for concurrency control.

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

// Check lease status from properties
BlobProperties properties = blobClient.getProperties();

LeaseStatusType leaseStatus = properties.getLeaseStatus();
LeaseStateType leaseState = properties.getLeaseState();
LeaseDurationType leaseDuration = properties.getLeaseDuration();

System.out.println("Lease status: " + leaseStatus);
System.out.println("Lease state: " + leaseState);
System.out.println("Lease duration: " + leaseDuration);

// Lease status interpretation
switch (leaseStatus) {
    case LOCKED:
        System.out.println("Blob has an active lease");
        break;
    case UNLOCKED:
        System.out.println("Blob is not leased");
        break;
}

// Lease state details
switch (leaseState) {
    case AVAILABLE:
        System.out.println("Blob is available for leasing");
        break;
    case LEASED:
        System.out.println("Blob is currently leased");
        break;
    case EXPIRED:
        System.out.println("Lease has expired but not yet broken");
        break;
    case BREAKING:
        System.out.println("Lease is being broken");
        break;
    case BROKEN:
        System.out.println("Lease has been broken");
        break;
}

// Lease duration types
if (leaseDuration != null) {
    switch (leaseDuration) {
        case INFINITE:
            System.out.println("Infinite lease duration");
            break;
        case FIXED:
            System.out.println("Fixed lease duration");
            break;
    }
}

Copy Status and Operations

Copy operation status and information.

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

// Monitor copy operation status
BlobProperties properties = blobClient.getProperties();
CopyStatusType copyStatus = properties.getCopyStatus();

if (copyStatus != null) {
    switch (copyStatus) {
        case PENDING:
            System.out.println("Copy operation is in progress");
            System.out.println("Progress: " + properties.getCopyProgress());
            break;
            
        case SUCCESS:
            System.out.println("Copy operation completed successfully");
            System.out.println("Copy completion time: " + properties.getCopyCompletionTime());
            break;
            
        case ABORTED:
            System.out.println("Copy operation was aborted");
            System.out.println("Copy status description: " + properties.getCopyStatusDescription());
            break;
            
        case FAILED:
            System.out.println("Copy operation failed");
            System.out.println("Copy status description: " + properties.getCopyStatusDescription());
            break;
    }
    
    System.out.println("Copy ID: " + properties.getCopyId());
    System.out.println("Copy source: " + properties.getCopySource());
}

Service Version

Azure Storage service API versions.

import com.azure.storage.blob.BlobServiceVersion;

// Use latest service version
BlobServiceVersion latest = BlobServiceVersion.getLatest();
System.out.println("Latest service version: " + latest.getVersion());

// Create client with specific service version
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
    .connectionString(connectionString)
    .serviceVersion(BlobServiceVersion.V2023_11_03)
    .buildClient();

// Available versions (subset of most common ones)
BlobServiceVersion[] commonVersions = {
    BlobServiceVersion.V2023_11_03,  // Latest stable
    BlobServiceVersion.V2023_08_03,
    BlobServiceVersion.V2023_05_03,
    BlobServiceVersion.V2023_01_03,
    BlobServiceVersion.V2022_11_02,
    BlobServiceVersion.V2021_12_02,
    BlobServiceVersion.V2021_10_04,
    BlobServiceVersion.V2021_08_06
};

for (BlobServiceVersion version : commonVersions) {
    System.out.println("Available version: " + version.getVersion());
}

// Get current service version from client
BlobServiceVersion currentVersion = serviceClient.getServiceVersion();
System.out.println("Client service version: " + currentVersion.getVersion());

Error Handling Models

BlobStorageException and Error Codes

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

try {
    blobClient.upload(BinaryData.fromString("content"), false); // Don't overwrite
} catch (BlobStorageException ex) {
    System.err.println("Storage operation failed:");
    System.err.println("Status code: " + ex.getStatusCode());
    System.err.println("Error code: " + ex.getErrorCode());
    System.err.println("Error message: " + ex.getMessage());
    System.err.println("Request ID: " + ex.getValue().getRequestId());
    
    // Handle specific error conditions
    BlobErrorCode errorCode = ex.getErrorCode();
    switch (errorCode) {
        case BLOB_ALREADY_EXISTS:
            System.err.println("Blob exists - use overwrite option or different name");
            break;
        case BLOB_NOT_FOUND:
            System.err.println("Blob not found - check blob name and container");
            break;
        case CONTAINER_NOT_FOUND:
            System.err.println("Container not found - create container first");
            break;
        case AUTHENTICATION_FAILED:
            System.err.println("Authentication failed - check credentials");
            break;
        case AUTHORIZATION_FAILURE:
            System.err.println("Authorization failed - check permissions");
            break;
        case REQUEST_BODY_TOO_LARGE:
            System.err.println("Request too large - use parallel upload for large files");
            break;
        case INVALID_BLOB_OR_BLOCK:
            System.err.println("Invalid blob or block - check content and size");
            break;
        case LEASE_ID_MISMATCH:
            System.err.println("Lease ID mismatch - provide correct lease ID");
            break;
        case CONDITION_NOT_MET:
            System.err.println("Precondition failed - check conditional parameters");
            break;
        default:
            System.err.println("Other error: " + errorCode);
    }
}

Utility and Helper Models

BlobRange

Represents a byte range for partial blob operations.

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

// Download specific range of blob
BlobRange range = new BlobRange(1024, 4096L); // Bytes 1024-5119 (4096 bytes)
BinaryData rangeData = blobClient.downloadContentWithResponse(
    new BlobDownloadOptions().setRange(range),
    Duration.ofMinutes(2),
    Context.NONE
).getValue();

System.out.println("Downloaded " + rangeData.getLength() + " bytes from range");

// Range for entire blob from offset
BlobRange fromOffset = new BlobRange(1024); // From byte 1024 to end
BinaryData tailData = blobClient.downloadContentWithResponse(
    new BlobDownloadOptions().setRange(fromOffset),
    Duration.ofMinutes(2),
    Context.NONE
).getValue();

// Use ranges with page blob operations
PageRange pageRange = new PageRange().setStart(0).setEnd(511); // First 512-byte page
pageBlobClient.uploadPages(pageRange, BinaryData.fromBytes(new byte[512]));

// Clear specific page range
PageRange clearRange = new PageRange().setStart(512).setEnd(1023); // Second page
pageBlobClient.clearPages(clearRange);

Related Documentation

  • ← Back to Overview
  • ← Specialized Blob Types
  • Configuration Options →
  • Security & Authentication →
  • Streaming & Advanced I/O →

Install with Tessl CLI

npx tessl i tessl/maven-com-azure--azure-storage-blob

docs

blob-client.md

container-client.md

index.md

models.md

options.md

security.md

service-client.md

specialized-clients.md

streaming.md

tile.json