[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CS805ZFTWA1S9AS121X3AV":3,"skill-same:01M6CS805ZFTWA1S9AS121X3AV":63},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":38,"repositoryHtmlUrl":39,"repositoryHomepageUrl":39,"ownerHtmlUrl":40,"ownerBlogUrl":6,"ownerDescription":41,"updatedAt":42,"install":43,"resources":56},"01M6CS805ZFTWA1S9AS121X3AV","azure-storage-blob-java",null,"Build blob storage applications using the Azure Storage Blob SDK for Java.","Sam-06060\u002Fjarvis-assistant","Sam-06060","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F208600848?v=4","01M6CRKT7C7FXD21V6HXF293S0","Samson Frank Ganta","01M6CRKTBEKYFD8YX5Z1GT99EE",6,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fazure-storage-blob-java\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27],"storage","azure storage","azure","azure storage blob java","java","sdk","applications","build","community","2026-11-10 10:12:30",false,"---\nname: azure-storage-blob-java\ndescription: \"Build blob storage applications using the Azure Storage Blob SDK for Java.\"\nrisk: unknown\nsource: community\ndate_added: \"2026-02-27\"\n---\n\n# Azure Storage Blob SDK for Java\n\nBuild blob storage applications using the Azure Storage Blob SDK for Java.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-storage-blob\u003C\u002FartifactId>\n    \u003Cversion>12.33.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Client Creation\n\n### BlobServiceClient\n\n```java\nimport com.azure.storage.blob.BlobServiceClient;\nimport com.azure.storage.blob.BlobServiceClientBuilder;\n\n\u002F\u002F With SAS token\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cstorage-account-url>\")\n    .sasToken(\"\u003Csas-token>\")\n    .buildClient();\n\n\u002F\u002F With connection string\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .buildClient();\n```\n\n### With DefaultAzureCredential\n\n```java\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cstorage-account-url>\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n```\n\n### BlobContainerClient\n\n```java\nimport com.azure.storage.blob.BlobContainerClient;\n\n\u002F\u002F From service client\nBlobContainerClient containerClient = serviceClient.getBlobContainerClient(\"mycontainer\");\n\n\u002F\u002F Direct construction\nBlobContainerClient containerClient = new BlobContainerClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .containerName(\"mycontainer\")\n    .buildClient();\n```\n\n### BlobClient\n\n```java\nimport com.azure.storage.blob.BlobClient;\n\n\u002F\u002F From container client\nBlobClient blobClient = containerClient.getBlobClient(\"myblob.txt\");\n\n\u002F\u002F With directory structure\nBlobClient blobClient = containerClient.getBlobClient(\"folder\u002Fsubfolder\u002Fmyblob.txt\");\n\n\u002F\u002F Direct construction\nBlobClient blobClient = new BlobClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .containerName(\"mycontainer\")\n    .blobName(\"myblob.txt\")\n    .buildClient();\n```\n\n## Core Patterns\n\n### Create Container\n\n```java\n\u002F\u002F Create container\nserviceClient.createBlobContainer(\"mycontainer\");\n\n\u002F\u002F Create if not exists\nBlobContainerClient container = serviceClient.createBlobContainerIfNotExists(\"mycontainer\");\n\n\u002F\u002F From container client\ncontainerClient.create();\ncontainerClient.createIfNotExists();\n```\n\n### Upload Data\n\n```java\nimport com.azure.core.util.BinaryData;\n\n\u002F\u002F Upload string\nString data = \"Hello, Azure Blob Storage!\";\nblobClient.upload(BinaryData.fromString(data));\n\n\u002F\u002F Upload with overwrite\nblobClient.upload(BinaryData.fromString(data), true);\n```\n\n### Upload from File\n\n```java\nblobClient.uploadFromFile(\"local-file.txt\");\n\n\u002F\u002F With overwrite\nblobClient.uploadFromFile(\"local-file.txt\", true);\n```\n\n### Upload from Stream\n\n```java\nimport com.azure.storage.blob.specialized.BlockBlobClient;\n\nBlockBlobClient blockBlobClient = blobClient.getBlockBlobClient();\n\ntry (ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes())) {\n    blockBlobClient.upload(dataStream, data.length());\n}\n```\n\n### Upload with Options\n\n```java\nimport com.azure.storage.blob.models.BlobHttpHeaders;\nimport com.azure.storage.blob.options.BlobParallelUploadOptions;\n\nBlobHttpHeaders headers = new BlobHttpHeaders()\n    .setContentType(\"text\u002Fplain\")\n    .setCacheControl(\"max-age=3600\");\n\nMap\u003CString, String> metadata = Map.of(\"author\", \"john\", \"version\", \"1.0\");\n\ntry (InputStream stream = new FileInputStream(\"large-file.bin\")) {\n    BlobParallelUploadOptions options = new BlobParallelUploadOptions(stream)\n        .setHeaders(headers)\n        .setMetadata(metadata);\n    \n    blobClient.uploadWithResponse(options, null, Context.NONE);\n}\n```\n\n### Upload if Not Exists\n\n```java\nimport com.azure.storage.blob.models.BlobRequestConditions;\n\nBlobParallelUploadOptions options = new BlobParallelUploadOptions(inputStream, length)\n    .setRequestConditions(new BlobRequestConditions().setIfNoneMatch(\"*\"));\n\nblobClient.uploadWithResponse(options, null, Context.NONE);\n```\n\n### Download Data\n\n```java\n\u002F\u002F Download to BinaryData\nBinaryData content = blobClient.downloadContent();\nString text = content.toString();\n\n\u002F\u002F Download to file\nblobClient.downloadToFile(\"downloaded-file.txt\");\n```\n\n### Download to Stream\n\n```java\ntry (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {\n    blobClient.downloadStream(outputStream);\n    byte[] data = outputStream.toByteArray();\n}\n```\n\n### Download with InputStream\n\n```java\nimport com.azure.storage.blob.specialized.BlobInputStream;\n\ntry (BlobInputStream blobIS = blobClient.openInputStream()) {\n    byte[] buffer = new byte[1024];\n    int bytesRead;\n    while ((bytesRead = blobIS.read(buffer)) != -1) {\n        \u002F\u002F Process buffer\n    }\n}\n```\n\n### Upload via OutputStream\n\n```java\nimport com.azure.storage.blob.specialized.BlobOutputStream;\n\ntry (BlobOutputStream blobOS = blobClient.getBlockBlobClient().getBlobOutputStream()) {\n    blobOS.write(\"Data to upload\".getBytes());\n}\n```\n\n### List Blobs\n\n```java\nimport com.azure.storage.blob.models.BlobItem;\n\n\u002F\u002F List all blobs\nfor (BlobItem blobItem : containerClient.listBlobs()) {\n    System.out.println(\"Blob: \" + blobItem.getName());\n}\n\n\u002F\u002F List with prefix (virtual directory)\nimport com.azure.storage.blob.models.ListBlobsOptions;\n\nListBlobsOptions options = new ListBlobsOptions().setPrefix(\"folder\u002F\");\nfor (BlobItem blobItem : containerClient.listBlobs(options, null)) {\n    System.out.println(\"Blob: \" + blobItem.getName());\n}\n```\n\n### List Blobs by Hierarchy\n\n```java\nimport com.azure.storage.blob.models.BlobListDetails;\n\nString delimiter = \"\u002F\";\nListBlobsOptions options = new ListBlobsOptions()\n    .setPrefix(\"data\u002F\")\n    .setDetails(new BlobListDetails().setRetrieveMetadata(true));\n\nfor (BlobItem item : containerClient.listBlobsByHierarchy(delimiter, options, null)) {\n    if (item.isPrefix()) {\n        System.out.println(\"Directory: \" + item.getName());\n    } else {\n        System.out.println(\"Blob: \" + item.getName());\n    }\n}\n```\n\n### Delete Blob\n\n```java\nblobClient.delete();\n\n\u002F\u002F Delete if exists\nblobClient.deleteIfExists();\n\n\u002F\u002F Delete with snapshots\nimport com.azure.storage.blob.models.DeleteSnapshotsOptionType;\nblobClient.deleteWithResponse(DeleteSnapshotsOptionType.INCLUDE, null, null, Context.NONE);\n```\n\n### Copy Blob\n\n```java\nimport com.azure.storage.blob.models.BlobCopyInfo;\nimport com.azure.core.util.polling.SyncPoller;\n\n\u002F\u002F Async copy (for large blobs or cross-account)\nSyncPoller\u003CBlobCopyInfo, Void> poller = blobClient.beginCopy(\"\u003Csource-blob-url>\", Duration.ofSeconds(1));\npoller.waitForCompletion();\n\n\u002F\u002F Sync copy from URL (for same account)\nblobClient.copyFromUrl(\"\u003Csource-blob-url>\");\n```\n\n### Generate SAS Token\n\n```java\nimport com.azure.storage.blob.sas.*;\nimport java.time.OffsetDateTime;\n\n\u002F\u002F Blob-level SAS\nBlobSasPermission permissions = new BlobSasPermission().setReadPermission(true);\nOffsetDateTime expiry = OffsetDateTime.now().plusDays(1);\n\nBlobServiceSasSignatureValues sasValues = new BlobServiceSasSignatureValues(expiry, permissions);\nString sasToken = blobClient.generateSas(sasValues);\n\n\u002F\u002F Container-level SAS\nBlobContainerSasPermission containerPermissions = new BlobContainerSasPermission()\n    .setReadPermission(true)\n    .setListPermission(true);\n    \nBlobServiceSasSignatureValues containerSasValues = new BlobServiceSasSignatureValues(expiry, containerPermissions);\nString containerSas = containerClient.generateSas(containerSasValues);\n```\n\n### Blob Properties and Metadata\n\n```java\nimport com.azure.storage.blob.models.BlobProperties;\n\n\u002F\u002F Get properties\nBlobProperties properties = blobClient.getProperties();\nSystem.out.println(\"Size: \" + properties.getBlobSize());\nSystem.out.println(\"Content-Type: \" + properties.getContentType());\nSystem.out.println(\"Last Modified: \" + properties.getLastModified());\n\n\u002F\u002F Set metadata\nMap\u003CString, String> metadata = Map.of(\"key1\", \"value1\", \"key2\", \"value2\");\nblobClient.setMetadata(metadata);\n\n\u002F\u002F Set HTTP headers\nBlobHttpHeaders headers = new BlobHttpHeaders()\n    .setContentType(\"application\u002Fjson\")\n    .setCacheControl(\"max-age=86400\");\nblobClient.setHttpHeaders(headers);\n```\n\n### Lease Blob\n\n```java\nimport com.azure.storage.blob.specialized.BlobLeaseClient;\nimport com.azure.storage.blob.specialized.BlobLeaseClientBuilder;\n\nBlobLeaseClient leaseClient = new BlobLeaseClientBuilder()\n    .blobClient(blobClient)\n    .buildClient();\n\n\u002F\u002F Acquire lease (-1 for infinite)\nString leaseId = leaseClient.acquireLease(60);\n\n\u002F\u002F Renew lease\nleaseClient.renewLease();\n\n\u002F\u002F Release lease\nleaseClient.releaseLease();\n```\n\n## Error Handling\n\n```java\nimport com.azure.storage.blob.models.BlobStorageException;\n\ntry {\n    blobClient.download(outputStream);\n} catch (BlobStorageException e) {\n    System.out.println(\"Status: \" + e.getStatusCode());\n    System.out.println(\"Error code: \" + e.getErrorCode());\n    \u002F\u002F 404 = Blob not found\n    \u002F\u002F 409 = Conflict (lease, etc.)\n}\n```\n\n## Proxy Configuration\n\n```java\nimport com.azure.core.http.ProxyOptions;\nimport com.azure.core.http.netty.NettyAsyncHttpClientBuilder;\nimport java.net.InetSocketAddress;\n\nProxyOptions proxyOptions = new ProxyOptions(\n    ProxyOptions.Type.HTTP,\n    new InetSocketAddress(\"localhost\", 8888));\n\nBlobServiceClient client = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cendpoint>\")\n    .sasToken(\"\u003Csas-token>\")\n    .httpClient(new NettyAsyncHttpClientBuilder().proxy(proxyOptions).build())\n    .buildClient();\n```\n\n## Environment Variables\n\n```bash\nAZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...\nAZURE_STORAGE_ACCOUNT_URL=https:\u002F\u002F\u003Caccount>.blob.core.windows.net\n```\n\n## Trigger Phrases\n\n- \"Azure Blob Storage Java\"\n- \"upload download blob\"\n- \"blob container SDK\"\n- \"storage streaming\"\n- \"SAS token generation\"\n- \"blob metadata properties\"\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n","# Azure Storage Blob SDK for Java\n\nBuild blob storage applications using the Azure Storage Blob SDK for Java.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-storage-blob\u003C\u002FartifactId>\n    \u003Cversion>12.33.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Client Creation\n\n### BlobServiceClient\n\n```java\nimport com.azure.storage.blob.BlobServiceClient;\nimport com.azure.storage.blob.BlobServiceClientBuilder;\n\n\u002F\u002F With SAS token\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cstorage-account-url>\")\n    .sasToken(\"\u003Csas-token>\")\n    .buildClient();\n\n\u002F\u002F With connection string\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .buildClient();\n```\n\n### With DefaultAzureCredential\n\n```java\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cstorage-account-url>\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n```\n\n### BlobContainerClient\n\n```java\nimport com.azure.storage.blob.BlobContainerClient;\n\n\u002F\u002F From service client\nBlobContainerClient containerClient = serviceClient.getBlobContainerClient(\"mycontainer\");\n\n\u002F\u002F Direct construction\nBlobContainerClient containerClient = new BlobContainerClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .containerName(\"mycontainer\")\n    .buildClient();\n```\n\n### BlobClient\n\n```java\nimport com.azure.storage.blob.BlobClient;\n\n\u002F\u002F From container client\nBlobClient blobClient = containerClient.getBlobClient(\"myblob.txt\");\n\n\u002F\u002F With directory structure\nBlobClient blobClient = containerClient.getBlobClient(\"folder\u002Fsubfolder\u002Fmyblob.txt\");\n\n\u002F\u002F Direct construction\nBlobClient blobClient = new BlobClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .containerName(\"mycontainer\")\n    .blobName(\"myblob.txt\")\n    .buildClient();\n```\n\n## Core Patterns\n\n### Create Container\n\n```java\n\u002F\u002F Create container\nserviceClient.createBlobContainer(\"mycontainer\");\n\n\u002F\u002F Create if not exists\nBlobContainerClient container = serviceClient.createBlobContainerIfNotExists(\"mycontainer\");\n\n\u002F\u002F From container client\ncontainerClient.create();\ncontainerClient.createIfNotExists();\n```\n\n### Upload Data\n\n```java\nimport com.azure.core.util.BinaryData;\n\n\u002F\u002F Upload string\nString data = \"Hello, Azure Blob Storage!\";\nblobClient.upload(BinaryData.fromString(data));\n\n\u002F\u002F Upload with overwrite\nblobClient.upload(BinaryData.fromString(data), true);\n```\n\n### Upload from File\n\n```java\nblobClient.uploadFromFile(\"local-file.txt\");\n\n\u002F\u002F With overwrite\nblobClient.uploadFromFile(\"local-file.txt\", true);\n```\n\n### Upload from Stream\n\n```java\nimport com.azure.storage.blob.specialized.BlockBlobClient;\n\nBlockBlobClient blockBlobClient = blobClient.getBlockBlobClient();\n\ntry (ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes())) {\n    blockBlobClient.upload(dataStream, data.length());\n}\n```\n\n### Upload with Options\n\n```java\nimport com.azure.storage.blob.models.BlobHttpHeaders;\nimport com.azure.storage.blob.options.BlobParallelUploadOptions;\n\nBlobHttpHeaders headers = new BlobHttpHeaders()\n    .setContentType(\"text\u002Fplain\")\n    .setCacheControl(\"max-age=3600\");\n\nMap\u003CString, String> metadata = Map.of(\"author\", \"john\", \"version\", \"1.0\");\n\ntry (InputStream stream = new FileInputStream(\"large-file.bin\")) {\n    BlobParallelUploadOptions options = new BlobParallelUploadOptions(stream)\n        .setHeaders(headers)\n        .setMetadata(metadata);\n    \n    blobClient.uploadWithResponse(options, null, Context.NONE);\n}\n```\n\n### Upload if Not Exists\n\n```java\nimport com.azure.storage.blob.models.BlobRequestConditions;\n\nBlobParallelUploadOptions options = new BlobParallelUploadOptions(inputStream, length)\n    .setRequestConditions(new BlobRequestConditions().setIfNoneMatch(\"*\"));\n\nblobClient.uploadWithResponse(options, null, Context.NONE);\n```\n\n### Download Data\n\n```java\n\u002F\u002F Download to BinaryData\nBinaryData content = blobClient.downloadContent();\nString text = content.toString();\n\n\u002F\u002F Download to file\nblobClient.downloadToFile(\"downloaded-file.txt\");\n```\n\n### Download to Stream\n\n```java\ntry (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {\n    blobClient.downloadStream(outputStream);\n    byte[] data = outputStream.toByteArray();\n}\n```\n\n### Download with InputStream\n\n```java\nimport com.azure.storage.blob.specialized.BlobInputStream;\n\ntry (BlobInputStream blobIS = blobClient.openInputStream()) {\n    byte[] buffer = new byte[1024];\n    int bytesRead;\n    while ((bytesRead = blobIS.read(buffer)) != -1) {\n        \u002F\u002F Process buffer\n    }\n}\n```\n\n### Upload via OutputStream\n\n```java\nimport com.azure.storage.blob.specialized.BlobOutputStream;\n\ntry (BlobOutputStream blobOS = blobClient.getBlockBlobClient().getBlobOutputStream()) {\n    blobOS.write(\"Data to upload\".getBytes());\n}\n```\n\n### List Blobs\n\n```java\nimport com.azure.storage.blob.models.BlobItem;\n\n\u002F\u002F List all blobs\nfor (BlobItem blobItem : containerClient.listBlobs()) {\n    System.out.println(\"Blob: \" + blobItem.getName());\n}\n\n\u002F\u002F List with prefix (virtual directory)\nimport com.azure.storage.blob.models.ListBlobsOptions;\n\nListBlobsOptions options = new ListBlobsOptions().setPrefix(\"folder\u002F\");\nfor (BlobItem blobItem : containerClient.listBlobs(options, null)) {\n    System.out.println(\"Blob: \" + blobItem.getName());\n}\n```\n\n### List Blobs by Hierarchy\n\n```java\nimport com.azure.storage.blob.models.BlobListDetails;\n\nString delimiter = \"\u002F\";\nListBlobsOptions options = new ListBlobsOptions()\n    .setPrefix(\"data\u002F\")\n    .setDetails(new BlobListDetails().setRetrieveMetadata(true));\n\nfor (BlobItem item : containerClient.listBlobsByHierarchy(delimiter, options, null)) {\n    if (item.isPrefix()) {\n        System.out.println(\"Directory: \" + item.getName());\n    } else {\n        System.out.println(\"Blob: \" + item.getName());\n    }\n}\n```\n\n### Delete Blob\n\n```java\nblobClient.delete();\n\n\u002F\u002F Delete if exists\nblobClient.deleteIfExists();\n\n\u002F\u002F Delete with snapshots\nimport com.azure.storage.blob.models.DeleteSnapshotsOptionType;\nblobClient.deleteWithResponse(DeleteSnapshotsOptionType.INCLUDE, null, null, Context.NONE);\n```\n\n### Copy Blob\n\n```java\nimport com.azure.storage.blob.models.BlobCopyInfo;\nimport com.azure.core.util.polling.SyncPoller;\n\n\u002F\u002F Async copy (for large blobs or cross-account)\nSyncPoller\u003CBlobCopyInfo, Void> poller = blobClient.beginCopy(\"\u003Csource-blob-url>\", Duration.ofSeconds(1));\npoller.waitForCompletion();\n\n\u002F\u002F Sync copy from URL (for same account)\nblobClient.copyFromUrl(\"\u003Csource-blob-url>\");\n```\n\n### Generate SAS Token\n\n```java\nimport com.azure.storage.blob.sas.*;\nimport java.time.OffsetDateTime;\n\n\u002F\u002F Blob-level SAS\nBlobSasPermission permissions = new BlobSasPermission().setReadPermission(true);\nOffsetDateTime expiry = OffsetDateTime.now().plusDays(1);\n\nBlobServiceSasSignatureValues sasValues = new BlobServiceSasSignatureValues(expiry, permissions);\nString sasToken = blobClient.generateSas(sasValues);\n\n\u002F\u002F Container-level SAS\nBlobContainerSasPermission containerPermissions = new BlobContainerSasPermission()\n    .setReadPermission(true)\n    .setListPermission(true);\n    \nBlobServiceSasSignatureValues containerSasValues = new BlobServiceSasSignatureValues(expiry, containerPermissions);\nString containerSas = containerClient.generateSas(containerSasValues);\n```\n\n### Blob Properties and Metadata\n\n```java\nimport com.azure.storage.blob.models.BlobProperties;\n\n\u002F\u002F Get properties\nBlobProperties properties = blobClient.getProperties();\nSystem.out.println(\"Size: \" + properties.getBlobSize());\nSystem.out.println(\"Content-Type: \" + properties.getContentType());\nSystem.out.println(\"Last Modified: \" + properties.getLastModified());\n\n\u002F\u002F Set metadata\nMap\u003CString, String> metadata = Map.of(\"key1\", \"value1\", \"key2\", \"value2\");\nblobClient.setMetadata(metadata);\n\n\u002F\u002F Set HTTP headers\nBlobHttpHeaders headers = new BlobHttpHeaders()\n    .setContentType(\"application\u002Fjson\")\n    .setCacheControl(\"max-age=86400\");\nblobClient.setHttpHeaders(headers);\n```\n\n### Lease Blob\n\n```java\nimport com.azure.storage.blob.specialized.BlobLeaseClient;\nimport com.azure.storage.blob.specialized.BlobLeaseClientBuilder;\n\nBlobLeaseClient leaseClient = new BlobLeaseClientBuilder()\n    .blobClient(blobClient)\n    .buildClient();\n\n\u002F\u002F Acquire lease (-1 for infinite)\nString leaseId = leaseClient.acquireLease(60);\n\n\u002F\u002F Renew lease\nleaseClient.renewLease();\n\n\u002F\u002F Release lease\nleaseClient.releaseLease();\n```\n\n## Error Handling\n\n```java\nimport com.azure.storage.blob.models.BlobStorageException;\n\ntry {\n    blobClient.download(outputStream);\n} catch (BlobStorageException e) {\n    System.out.println(\"Status: \" + e.getStatusCode());\n    System.out.println(\"Error code: \" + e.getErrorCode());\n    \u002F\u002F 404 = Blob not found\n    \u002F\u002F 409 = Conflict (lease, etc.)\n}\n```\n\n## Proxy Configuration\n\n```java\nimport com.azure.core.http.ProxyOptions;\nimport com.azure.core.http.netty.NettyAsyncHttpClientBuilder;\nimport java.net.InetSocketAddress;\n\nProxyOptions proxyOptions = new ProxyOptions(\n    ProxyOptions.Type.HTTP,\n    new InetSocketAddress(\"localhost\", 8888));\n\nBlobServiceClient client = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cendpoint>\")\n    .sasToken(\"\u003Csas-token>\")\n    .httpClient(new NettyAsyncHttpClientBuilder().proxy(proxyOptions).build())\n    .buildClient();\n```\n\n## Environment Variables\n\n```bash\nAZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...\nAZURE_STORAGE_ACCOUNT_URL=https:\u002F\u002F\u003Caccount>.blob.core.windows.net\n```\n\n## Trigger Phrases\n\n- \"Azure Blob Storage Java\"\n- \"upload download blob\"\n- \"blob container SDK\"\n- \"storage streaming\"\n- \"SAS token generation\"\n- \"blob metadata properties\"\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n",{"name":5,"risk":33,"source":27,"date_added":34,"description":7},"unknown","2026-02-27","main","a50a3aa6b39fb0e1b7db88bef1bfc9c93606e126","modules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fazure-storage-blob-java",0,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant","https:\u002F\u002Fgithub.com\u002FSam-06060","Mobile Application Developer | Kotlin | Flutter, KMP, Swfit, Android,Swift UI | Building at Saar It Resources | Creator of Jarvis (AI Assistant)","2026-06-23 05:13:38",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add Sam-06060\u002Fjarvis-assistant --skill azure-storage-blob-java",{"tool":49,"command":50},"bunx","bunx skills add Sam-06060\u002Fjarvis-assistant --skill azure-storage-blob-java",{"tool":52,"command":53},"pnpm","pnpm dlx skills add Sam-06060\u002Fjarvis-assistant --skill azure-storage-blob-java","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fazure-storage-blob-java\u002FSKILL.md",true,[57],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"evals\u002Fevals.json","REFERENCE","参考文档",5945,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FMarketing-and-Growth\u002Fproduct-marketing-context\u002Fevals\u002Fevals.json",[64,77,93,120,139,166],{"skillNo":65,"name":66,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":74,"publishedAt":28},"01M6GDRVS6FXX3ESH0C9DW01C0","test_skill","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fscratch\u002Ftest_skill\u002FSKILL.md",[69],{"categoryNo":70,"categoryName":71,"taxonomyType":72,"taxonomyTypeDesc":73},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[75,76],"Test Skill","test",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":28},"01M6GDRQ40HX22MA6XWC31RHHK","zustand-store-ts","Create Zustand stores following established patterns with proper TypeScript types and middleware.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzustand-store-ts\u002FSKILL.md",[],[84,85,86,87,88,89,90,27,91,92],"zustand store ts","zustand","store","with","types","middleware","patterns","create","typescript",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":102,"publishedAt":28},"01M6GDRKEA0WE670SPFWX5GKCN","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoom-automation\u002FSKILL.md",[99],{"categoryNo":100,"categoryName":101,"taxonomyType":72,"taxonomyTypeDesc":73},"01JBSEEDCAT000000000000023","Skill与智能体开发",[103,104,105,106,107,108,109,110,111,112,113,114,115,116,27,117,118,119],"automation","zoom automation","zoom","first","Tools","search","MCP","via","meeting","automate","critical","creation","webinars","composio","recordings","management","tracking",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":127,"publishedAt":28},"01M6GDRFS1452PC71JQ38S24HR","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoho-crm-automation\u002FSKILL.md",[126],{"categoryNo":100,"categoryName":101,"taxonomyType":72,"taxonomyTypeDesc":73},[128,103,129,130,131,132,133,27,108,134,116,135,113,112,107,136,91,137,109,138],"crm automation","zoho crm","crm","zoho crm automation","zoho","leads","contacts","records","update","tasks","manage",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":148,"publishedAt":28},"01M6GDRCKQBAVTGHX5XBH26KPZ","zod-validation-expert","Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",[145],{"categoryNo":146,"categoryName":147,"taxonomyType":72,"taxonomyTypeDesc":73},"01JBSEEDCAT000000000000009","前端开发",[149,150,151,152,153,92,154,155,156,157,158,159,87,160,161,162,163,27,164,165],"expert","zod","zod validation expert","validation","react","safe","parsing","errors","schema validation","react hook form","hook","trpc","form","type","next","schema","Next.js",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":173,"publishedAt":28},"01M6GDR658B08K4MY0RWD4A6EH","zeroize-audit","Detects missing zeroization of sensitive data in source code and identifies zeroization removed by compiler optimizations, with assembly-level analysis, and control-flow verification. Use for auditing C\u002FC++\u002FRust code handling secrets, keys, passwords, or other sensitive data.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzeroize-audit\u002FSKILL.md",[172],{"categoryNo":100,"categoryName":101,"taxonomyType":72,"taxonomyTypeDesc":73},[174,175,176,177,178,179,180,181,27,182,183,184,185,186,187,188,189,190,191,109],"zeroize audit","audit","write","passwords","get","project","c++","activate","assembly","read","Bash","secrets","analysis","data","flow","verification","code","rust"]