使用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。
什么是Azure Blob Storage
Azure Blob Storage是微软Azure云平台提供的对象存储解决方案,用于存储大量非结构化数据。Blob是一种二进制大型对象,也是适用于要以二进制格式存储的任何数据类型的存储选项。它特别适合以下场景:
- 提供图像或文档给浏览器直接下载
- 存储文件以供分布式访问
- 流式传输视频和音频
- 存储备份、恢复、灾难恢复和存档数据
- 使用Azure云服务进行分析
Blob Storage提供了三种类型的资源:
1.存储账户:所有Azure存储资源的顶级容器
2.容器:类似于文件系统中的文件夹
3.Blob:实际存储的数据文件
准备工作
在开始编码之前,您需要:
1.Azure订阅:如果您没有Azure订阅,可以创建一个免费账户
2.存储账户:在Azure门户中创建一个存储账户
3.获取连接字符串:从Azure门户获取存储账户的连接字符串
添加依赖项
首先,我们需要在项目中添加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*/
@Slf4j
public class AzureBlobUtils {// Azure存储账户连接字符串private static final String CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=<your-account-name>;AccountKey=<your-account-key>;EndpointSuffix=<your-endpoint-suffi>";// 容器名称private static final String CONTAINER_NAME = "your-container-name";// BlobServiceClientprivate 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;}// 列出所有Bloblog.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;}// 删除BlobblobClient.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*/
@Slf4j
public class AzureBlobUtils {// Azure存储账户连接字符串private static final String CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=<your-account-name>;AccountKey=<your-account-key>;EndpointSuffix=<your-endpoint-suffi>";// 容器名称private static final String CONTAINER_NAME = "your-container-name";// BlobServiceClientprivate 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;}// 列出所有Bloblog.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;}// 删除BlobblobClient.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,LondonSystem.out.println("文件内容:\n" + content);}// 示例6: 删除文件//deleteFromBlob("sample-data.csv");}
}
总结
本文介绍了如何使用Java SDK上传和下载文件到Azure Blob Storage,并提供了文件的增删改查工具类。总的来说,Azure Blob Storage还是比较好用的,也是提供了高可用性和可扩展性,非常适合存储大量非结构化数据。通过使用Azure Storage SDK for Java,我们可以轻松地将数据上传到云存储,从而构建更加可靠和可扩展的应用程序。在实际项目中,我们可以根据具体需求扩展这些示例,添加更多功能如进度监控、错误恢复、批量操作等。