当前位置: 首页 > news >正文

使用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,我们可以轻松地将数据上传到云存储,从而构建更加可靠和可扩展的应用程序。在实际项目中,我们可以根据具体需求扩展这些示例,添加更多功能如进度监控、错误恢复、批量操作等。

http://www.dtcms.com/a/353214.html

相关文章:

  • AR眼镜 + 视觉大模型在工业巡检的核心应用场景
  • AI赋能前端性能优化:核心技术与实战策略
  • “一带一路软件博览馆2025”香港开幕,金山办公田然:软件正重新定义未来生产力
  • 人机交互如何变革科普展示?哪些技术正成吸睛焦点?
  • 东芝2000AC彩机开机报请求维修CD40维修解决案例1
  • Kafka 4.0 升级实战路线图、关键变更与避坑清单
  • 2024年06月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 项目概要设计说明文档
  • 微服务-30.配置管理-动态路由
  • 当AI有了温度,三星正在重新定义生活的边界
  • Ubuntu安装Zookeeper全攻略
  • [Windows] WPS官宣 64位正式版(12.1.0.22525)全新发布!
  • leetcode274:H指数(计数排序)从 O(N²) 到 O(N) 的思维上升
  • 重学JS-004 --- JavaScript算法与数据结构(四)JavaScript 表单验证
  • Linux 下 Nginx 服务器从入门到精通:安装、配置、实战与性能优化​
  • mfc中操作excel
  • 关于国产 RAC 和分布式研讨
  • 【DBCExcelConvent】CAN报文解析辅助工具之DBC与Excel互转
  • 使用k8s实现部署MySQL的主从复制
  • 【LeetCode - 每日1题】求网格最长V形对角线段的长度
  • 页面跳转html
  • HTML响应式设计的颜色选择器,适配各种屏幕尺寸
  • rk3588 ubuntu20.04屏幕显示问题解决
  • CPU-IO-网络-内核参数的调优
  • AOSP 编译系统 (Android build system)
  • 嵌入式C语言进阶:位操作的艺术与实战
  • 【测试】pytest测试环境搭建
  • Linux 离线环境下 Anaconda3 与核心机器学习库(scikit-learn/OpenCV/PyTorch)安装配置指南
  • 解决Visual Studio中UWP设计器无法显示的问题:需升级至Windows 11 24H2
  • 【SQL优化案例】SQL执行频率问题与优化效果预期