> 技术文档 > 使用Java操作微软 Azure Blob Storage:上传和下载文件

使用Java操作微软 Azure Blob Storage:上传和下载文件


文章目录

    • 前言
    • 什么是Azure Blob Storage
    • 准备工作
    • 添加依赖项
    • 实现文件上传和下载功能
      • 1. 基本配置
      • 2. 上传本地文件
      • 3. 上传CSV内容字符串
      • 4. 下载文件
      • 5. 获取CSV文件内容为字符串
      • 6. 列出容器中的所有文件
      • 7. 删除文件
      • 8. 完整工具类
    • 总结

前言

在现代云原生应用开发中,存储和管理大量数据是常见的需求。Azure Blob Storage是微软Azure提供的一个高扩展性、高可用性的对象存储服务,特别适合存储大量非结构化数据,如文本、图片、视频等。本文将介绍如何使用Java SDK上传和下载文件到Azure Blob Storage。

使用Java操作微软 Azure Blob Storage:上传和下载文件

什么是Azure Blob Storage

Azure Blob Storage是微软Azure云平台提供的对象存储解决方案,用于存储大量非结构化数据。Blob是一种二进制大型对象,也是适用于要以二进制格式存储的任何数据类型的存储选项。它特别适合以下场景:

  • 提供图像或文档给浏览器直接下载
  • 存储文件以供分布式访问
  • 流式传输视频和音频
  • 存储备份、恢复、灾难恢复和存档数据
  • 使用Azure云服务进行分析
    Blob Storage提供了三种类型的资源:
    1.存储账户:所有Azure存储资源的顶级容器
    2.容器:类似于文件系统中的文件夹
    3.Blob:实际存储的数据文件

使用Java操作微软 Azure Blob Storage:上传和下载文件

准备工作

在开始编码之前,您需要:
1.Azure订阅:如果您没有Azure订阅,可以创建一个免费账户
2.存储账户:在Azure门户中创建一个存储账户
3.获取连接字符串:从Azure门户获取存储账户的连接字符串

使用Java操作微软 Azure Blob Storage:上传和下载文件

添加依赖项

首先,我们需要在项目中添加Azure Storage Blob SDK依赖。
如果使用Maven,将以下依赖添加到pom.xml文件中:

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

如果使用Gradle,请在build.gradle文件中添加:

implementation \'com.azure:azure-storage-blob:12.25.0\'

实现文件上传和下载功能

1. 基本配置

首先,我们需要获取Azure存储账户的连接字符串和容器名称:

/** * AzureBlobUtils * @author senfel * @version 1.0 * @date 2025/8/26 18:06 */@Slf4jpublic class AzureBlobUtils { // Azure存储账户连接字符串 private static final String CONNECTION_STRING = \"DefaultEndpointsProtocol=https;AccountName=;AccountKey=;EndpointSuffix=\"; // 容器名称 private static final String CONTAINER_NAME = \"your-container-name\"; // BlobServiceClient private static final BlobServiceClient BLOB_SERVICE_CLIENT = new BlobServiceClientBuilder() .connectionString(CONNECTION_STRING) .buildClient();; // 容器客户端 private static final BlobContainerClient CONTAINER_CLIENT = BLOB_SERVICE_CLIENT.getBlobContainerClient(CONTAINER_NAME); //构造方法私有 private AzureBlobUtils(){}}

2. 上传本地文件

以下方法演示如何将本地文件上传到Azure Blob Storage:

/** * 上传文件到Azure Blob Storage * @param filePath * @param blobName * @author senfel * @date 2025/8/26 19:23 * @return void */public static void uploadFileToBlob(String filePath, String blobName) { try { // 创建容器(如果不存在) if (!CONTAINER_CLIENT.exists()) { CONTAINER_CLIENT.create(); } // 获取Blob客户端 BlobClient blobClient = CONTAINER_CLIENT.getBlobClient(blobName); // 上传文件 blobClient.uploadFromFile(filePath, true); log.error( \"文件已成功上传到Azure Blob Storage:{}\",blobName); } catch (Exception e) { log.error(\"上传文件时发生错误:{},详细错误信息:\",e.getMessage(),e); }}

3. 上传CSV内容字符串

有时候,我们可能需要直接上传CSV格式的字符串内容,而不是本地文件:

/** * 上传CSV内容字符串到Azure Blob Storage * @param content * @param blobName * @author senfel * @date 2025/8/26 19:24 * @return */public static void uploadCsvContentToBlob(String content, String blobName) { try { // 创建容器(如果不存在) if (!CONTAINER_CLIENT.exists()) { CONTAINER_CLIENT.create(); } // 获取Blob客户端 BlobClient blobClient = CONTAINER_CLIENT.getBlobClient(blobName); // 将字符串内容转换为输入流 ByteArrayInputStream dataStream = new ByteArrayInputStream(content.getBytes()); // 上传数据 blobClient.upload(dataStream, content.length()); log.error(\"CSV内容已上传到Azure Blob Storage:{} \", blobName); } catch (Exception e) { log.error(\"上传CSV内容时发生错误:{},详细错误信息:\" , e.getMessage(),e); }}

4. 下载文件

以下方法演示如何从Azure Blob Storage下载文件到本地:

/** * 从Azure Blob Storage下载文件到本地 * @param blobName * @param localFilePath * @author senfel * @date 2025/8/26 19:28 * @return void */public static void downloadFromBlob(String blobName, String localFilePath) { try { // 检查容器是否存在 if (!CONTAINER_CLIENT.exists()) { log.error(\"容器不存在:{} \", CONTAINER_NAME); return; } // 获取Blob客户端 BlobClient blobClient = CONTAINER_CLIENT.getBlobClient(blobName); // 检查Blob是否存在 if (!blobClient.exists()) { log.error(\"文件不存在:{} \", blobName); return; } // 下载文件到本地路径 blobClient.downloadToFile(localFilePath, true); log.info(\"文件已下载到本地:{} \", localFilePath); } catch (Exception e) { log.error(\"下载文件时发生错误:{},详细错误信息:\" , e.getMessage(),e); }}

5. 获取CSV文件内容为字符串

有时候我们可能需要直接获取CSV文件的内容为字符串,而不是保存到本地文件:

/** * 获取Azure Blob Storage中CSV文件的内容为字符串 * @param blobName * @author senfel * @date 2025/8/26 19:30 * @return java.lang.String */public static String getContentFromBlob(String blobName) { try { // 检查容器是否存在 if (!CONTAINER_CLIENT.exists()) { log.error(\"容器不存在:{}\" , CONTAINER_NAME); return null; } // 获取Blob客户端 BlobClient blobClient = CONTAINER_CLIENT.getBlobClient(blobName); // 检查Blob是否存在 if (!blobClient.exists()) { log.error(\"文件不存在:{}\" , blobName); return null; } // 读取Blob内容到字节数组 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); blobClient.download(outputStream); // 将字节数组转换为字符串 String content = outputStream.toString(); outputStream.close(); log.error(\"获取CSV文件内容:{}\" , blobName); return content; } catch (Exception e) { log.error(\"获取CSV文件内容时发生错误:{},详细错误信息:\" , e.getMessage(),e); return null; }}

6. 列出容器中的所有文件

以下方法可以列出容器中的所有文件:

/** * 列出容器中的所有文件 * @author senfel * @date 2025/8/26 19:35 * @return void */public static void listBlobs() { try { // 检查容器是否存在 if (!CONTAINER_CLIENT.exists()) { log.error(\"容器不存在:{} \",CONTAINER_NAME); return; } // 列出所有Blob log.error(\"容器中的文件列表:{} \",CONTAINER_NAME); for (BlobItem blobItem : CONTAINER_CLIENT.listBlobs()) { // 只显示CSV文件 if (blobItem.getName().endsWith(\".csv\")) { System.out.println(\"- \" + blobItem.getName()); } } } catch (Exception e) { log.error(\"列出文件时发生错误:{},详细错误信息:\" , e.getMessage(),e); }}

7. 删除文件

以下方法可以删除容器中的文件:

/** * 删除容器中的文件 * @param blobName * @author senfel * @date 2025/8/26 19:40 * @return void */public static void deleteFromBlob(String blobName) { try { // 检查容器是否存在 if (!CONTAINER_CLIENT.exists()) { log.error(\"容器不存在:{} \" ,CONTAINER_NAME); return; } // 获取Blob客户端 BlobClient blobClient = CONTAINER_CLIENT.getBlobClient(blobName); // 检查Blob是否存在 if (!blobClient.exists()) { log.error(\"文件不存在:{} \" ,blobName); return; } // 删除Blob blobClient.delete(); log.info(\"文件已删除:{} \" ,blobName); } catch (Exception e) { log.error(\"删除文件时发生错误:{},详细错误信息:\" , e.getMessage(),e); }}

8. 完整工具类

以下是完整的示例程序,演示如何使用上述方法:

/** * AzureBlobUtils * @author senfel * @version 1.0 * @date 2025/8/26 18:06 */@Slf4jpublic class AzureBlobUtils { // Azure存储账户连接字符串 private static final String CONNECTION_STRING = \"DefaultEndpointsProtocol=https;AccountName=;AccountKey=;EndpointSuffix=\"; // 容器名称 private static final String CONTAINER_NAME = \"your-container-name\"; // BlobServiceClient private static final BlobServiceClient BLOB_SERVICE_CLIENT = new BlobServiceClientBuilder() .connectionString(CONNECTION_STRING) .buildClient();; // 容器客户端 private static final BlobContainerClient CONTAINER_CLIENT = BLOB_SERVICE_CLIENT.getBlobContainerClient(CONTAINER_NAME); //构造方法私有 private AzureBlobUtils(){} /** * 上传文件到Azure Blob Storage * @param filePath * @param blobName * @author senfel * @date 2025/8/26 19:23 * @return void */ public static void uploadFileToBlob(String filePath, String blobName) { try { // 创建容器(如果不存在) if (!CONTAINER_CLIENT.exists()) { CONTAINER_CLIENT.create(); } // 获取Blob客户端 BlobClient blobClient = CONTAINER_CLIENT.getBlobClient(blobName); // 上传文件 blobClient.uploadFromFile(filePath, true); log.error( \"文件已成功上传到Azure Blob Storage:{}\",blobName); } catch (Exception e) { log.error(\"上传文件时发生错误:{},详细错误信息:\",e.getMessage(),e); } } /** * 上传CSV内容字符串到Azure Blob Storage * @param content * @param blobName * @author senfel * @date 2025/8/26 19:24 * @return */ public static void uploadCsvContentToBlob(String content, String blobName) { try { // 创建容器(如果不存在) if (!CONTAINER_CLIENT.exists()) { CONTAINER_CLIENT.create(); } // 获取Blob客户端 BlobClient blobClient = CONTAINER_CLIENT.getBlobClient(blobName); // 将字符串内容转换为输入流 ByteArrayInputStream dataStream = new ByteArrayInputStream(content.getBytes()); // 上传数据 blobClient.upload(dataStream, content.length()); log.error(\"CSV内容已上传到Azure Blob Storage:{} \", blobName); } catch (Exception e) { log.error(\"上传CSV内容时发生错误:{},详细错误信息:\" , e.getMessage(),e); } } /** * 从Azure Blob Storage下载文件到本地 * @param blobName * @param localFilePath * @author senfel * @date 2025/8/26 19:28 * @return void */ public static void downloadFromBlob(String blobName, String localFilePath) { try { // 检查容器是否存在 if (!CONTAINER_CLIENT.exists()) { log.error(\"容器不存在:{} \", CONTAINER_NAME); return; } // 获取Blob客户端 BlobClient blobClient = CONTAINER_CLIENT.getBlobClient(blobName); // 检查Blob是否存在 if (!blobClient.exists()) { log.error(\"文件不存在:{} \", blobName); return; } // 下载文件到本地路径 blobClient.downloadToFile(localFilePath, true); log.info(\"文件已下载到本地:{} \", localFilePath); } catch (Exception e) { log.error(\"下载文件时发生错误:{},详细错误信息:\" , e.getMessage(),e); } } /** * 获取Azure Blob Storage中CSV文件的内容为字符串 * @param blobName * @author senfel * @date 2025/8/26 19:30 * @return java.lang.String */ public static String getContentFromBlob(String blobName) { try { // 检查容器是否存在 if (!CONTAINER_CLIENT.exists()) { log.error(\"容器不存在:{}\" , CONTAINER_NAME); return null; } // 获取Blob客户端 BlobClient blobClient = CONTAINER_CLIENT.getBlobClient(blobName); // 检查Blob是否存在 if (!blobClient.exists()) { log.error(\"文件不存在:{}\" , blobName); return null; } // 读取Blob内容到字节数组 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); blobClient.download(outputStream); // 将字节数组转换为字符串 String content = outputStream.toString(); outputStream.close(); log.error(\"获取CSV文件内容:{}\" , blobName); return content; } catch (Exception e) { log.error(\"获取CSV文件内容时发生错误:{},详细错误信息:\" , e.getMessage(),e); return null; } } /** * 列出容器中的所有文件 * @author senfel * @date 2025/8/26 19:35 * @return void */ public static void listBlobs() { try { // 检查容器是否存在 if (!CONTAINER_CLIENT.exists()) { log.error(\"容器不存在:{} \",CONTAINER_NAME); return; } // 列出所有Blob log.error(\"容器中的文件列表:{} \",CONTAINER_NAME); for (BlobItem blobItem : CONTAINER_CLIENT.listBlobs()) { // 只显示CSV文件 if (blobItem.getName().endsWith(\".csv\")) {  System.out.println(\"- \" + blobItem.getName()); } } } catch (Exception e) { log.error(\"列出文件时发生错误:{},详细错误信息:\" , e.getMessage(),e); } } /** * 删除容器中的文件 * @param blobName * @author senfel * @date 2025/8/26 19:40 * @return void */ public static void deleteFromBlob(String blobName) { try { // 检查容器是否存在 if (!CONTAINER_CLIENT.exists()) { log.error(\"容器不存在:{} \" ,CONTAINER_NAME); return; } // 获取Blob客户端 BlobClient blobClient = CONTAINER_CLIENT.getBlobClient(blobName); // 检查Blob是否存在 if (!blobClient.exists()) { log.error(\"文件不存在:{} \" ,blobName); return; } // 删除Blob blobClient.delete(); log.info(\"文件已删除:{} \" ,blobName); } catch (Exception e) { log.error(\"删除文件时发生错误:{},详细错误信息:\" , e.getMessage(),e); } } /** * test * @author senfel * @date 2025/8/26 19:55 * @return void */ public static void main(String[] args) { // 示例1: 上传本地文件 //uploadFileToBlob(\"C:\\\\Users\\\\user\\\\Desktop\\\\test.csv\", \"test.csv\"); // 示例2: 上传内容字符串 /*String contentStr = \"name,age,city\\nJohn,25,New York\\nJane,30,London\\n\"; uploadCsvContentToBlob(contentStr, \"sample-data.csv\");*/ // 示例3: 列出所有文件 //listBlobs(); // 示例4: 下载文件 //downloadFromBlob(\"test.csv\", \"C:\\\\Users\\\\user\\\\Desktop\\\\test2.csv\"); // 示例5: 获取文件内容为字符串 String content = getContentFromBlob(\"sample-data.csv\"); if (content != null) { //文件内容: //name,age,city //John,25,New York //Jane,30,London System.out.println(\"文件内容:\\n\" + content); } // 示例6: 删除文件 //deleteFromBlob(\"sample-data.csv\"); }}

总结

本文介绍了如何使用Java SDK上传和下载文件到Azure Blob Storage,并提供了文件的增删改查工具类。总的来说,Azure Blob Storage还是比较好用的,也是提供了高可用性和可扩展性,非常适合存储大量非结构化数据。通过使用Azure Storage SDK for Java,我们可以轻松地将数据上传到云存储,从而构建更加可靠和可扩展的应用程序。在实际项目中,我们可以根据具体需求扩展这些示例,添加更多功能如进度监控、错误恢复、批量操作等。