Azure Blob Storage 基本用法上传/下载(Java)
文章目录
- 简单概念
- Blob Storage
- Azure Blob Storage的存储结构
- Azure Storage Account
- Container
- Blob
- 操作
- Maven依赖
- 创建Container对象
- 获取Blob列表
- 下载Blob
- 本地文件上传
- 测试
简单概念
Blob Storage
Azure Blob Storage是用来存放文本,图片,视频等非架构华数据从存储服务, 我们可以在任何地方通过http/https协议访问Blob Storage
Azure Blob Storage的存储结构
Azure Storage Account
Account是用来管理Azure Storage的一个命名空间,主要用来控制存储数据的访问权限和计费. Account控制Blob, Queue, File和Table的访问权限.
要想使用Blob Storage, 必须要有一个Storage Account账户
Container
Container中包含一组资源(Blob), 所有的Blob都必须存在于Container中, 概念可以类比window系统的C/D/E/F盘(我是这么理解的, 如有错,轻喷)
一个Storage Account可以控制不同Container的访问权限. 可以包含无数个Container, 每个Container中也可以包含无数个Blob
注意: Container的名字是小写
Blob
一个Blob代表一个文件, Blob划分为三种类型
- Block Blob: 主要存储静态文件, 如图片, 视频, 文档.
- Append Blob: 与Block Blob类似, 优化了append操作, 主要应用场景就是日志存储.
- Page Blob: 针对频繁的读写操作做了优化, 如Azure上虚拟机的磁盘使用的就是Page Blob.
操作
Maven依赖
<dependency><groupId>com.microsoft.azure</groupId><artifactId>azure-data-lake-store-sdk</artifactId><version>2.1.5</version>
</dependency><dependency><groupId>com.microsoft.azure</groupId><artifactId>azure-storage-blob</artifactId><version>11.0.0</version>
</dependency><dependency><groupId>com.microsoft.azure</groupId><artifactId>azure-storage</artifactId><version>8.3.0</version>
</dependency>
创建Container对象
public static void initAzure(String containerName) {String ACCOUNT_NAME = <ACCOUNT NAME>;String ACCOUNT_KEY = <ACCOUNT KEY>;String END_POINT = <END POINT>;String PROTOCOL = "https";String format = "DefaultEndpointsProtocol={0};AccountName={1};AccountKey={2};EndpointSuffix={3}";CloudStorageAccount storageAccount = null;CloudBlobClient blobClient = null;CloudBlobContainer container = null;try {// 获得StorageAccount对象storageAccount = CloudStorageAccount.parse(MessageFormat.format(format, PROTOCOL, ACCOUNT_NAME, ACCOUNT_KEY, END_POINT));// 由StorageAccount对象创建BlobClientblobClient = storageAccount.createCloudBlobClient();// 根据传入的containerName, 获得container实例container = blobClient.getContainerReference(containerName);} catch (URISyntaxException | InvalidKeyException | StorageException e) {e.printStackTrace();}
}
获取Blob列表
public static void listBlobs() {/*** 第一个参数, container中blob的前缀, 可以是文件夹的前缀, 也可以是blob的前缀* 第二个参数, 是否展开文件夹中的文件* false: 如Container中只有blob就全部列出; 如有文件夹,则只列出文件夹名* true: 列出所有blob*/Iterable<ListBlobItem> blobItems = container.listBlobs(null,false);for (ListBlobItem blobItem : blobItems) {String uri = blobItem.getUri().toString();System.out.println(uri);}
}
下载Blob
public static void downloadFile(String blobPath, String targetPath) {String finalPath = targetPath.concat(blobPath);try {// 传入要blob的pathCloudBlockBlob blob = container.getBlockBlobReference(blobPath);// 传入目标pathblob.downloadToFile(finalPath);} catch (URISyntaxException | StorageException | IOException e) {e.printStackTrace();}
}
本地文件上传
上传文件注意做校验, 这里只是校验本地文件和云端文件的大小
public static void uploadFile(File file) {try {// 构建目标BlockBlob对象CloudBlockBlob blob = container.getBlockBlobReference("20191012/a");// 将本地文件上传到Azure Containerblob.uploadFromFile(file.getPath());// 获得获得属性blob.downloadAttributes();// 获得上传后的文件大小long blobSize = blob.getProperties().getLength();// 获得本地文件大小long localSize = file.length();// 校验if (blobSize != localSize) {System.out.println("校验失败...上传失败");// 删除blobblob.deleteIfExists();} else {System.out.println("上传成功");}} catch (URISyntaxException | StorageException | IOException e) {e.printStackTrace();}
}
测试
import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.StorageException;
import com.microsoft.azure.storage.blob.CloudBlobClient;
import com.microsoft.azure.storage.blob.CloudBlobContainer;
import com.microsoft.azure.storage.blob.CloudBlockBlob;
import com.microsoft.azure.storage.blob.ListBlobItem;import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.InvalidKeyException;
import java.text.MessageFormat;/*** @author jiale.he* @date 2019/10/12*/
public class AzureDemo {private static String ACCOUNT_NAME = "***";private static String ACCOUNT_KEY = "***";private static String END_POINT = "***";private static String PROTOCOL = "***";private static String format = "DefaultEndpointsProtocol={0};AccountName={1};AccountKey={2};EndpointSuffix={3}";private static CloudStorageAccount storageAccount = null;private static CloudBlobClient blobClient = null;private static CloudBlobContainer container = null;public static void main(String[] args) {initAzure("***");listBlobs(null);}public static void listBlobs(String perfix) {/*** 第一个参数, container中blob的前缀, 可以是文件夹的前缀, 也可以是blob的前缀* 第二个参数, 是否展开文件夹中的文件, 如container中无文件夹, 则会列出所有blob*/Iterable<ListBlobItem> blobItems = container.listBlobs(null, true);for (ListBlobItem blobItem : blobItems) {String uri = blobItem.getUri().toString();System.out.println(uri);}}public static void uploadFile(File file) {try {// 构建目标BlockBlob对象CloudBlockBlob blob = container.getBlockBlobReference("20191012/aaa.txt");// 将本地文件上传到Azure Containerblob.uploadFromFile(file.getPath());// 获得获得属性blob.downloadAttributes();// 获得上传后的文件大小long blobSize = blob.getProperties().getLength();// 获得本地文件大小long localSize = file.length();// 校验if (blobSize != localSize) {System.out.println("校验失败...上传失败");// 删除blobblob.deleteIfExists();} else {System.out.println("上传成功");}} catch (URISyntaxException | StorageException | IOException e) {e.printStackTrace();}}public static void downloadFile(String blobPath, String targetPath) {String finalPath = targetPath.concat(blobPath);try {// 传入要blob的pathCloudBlockBlob blob = container.getBlockBlobReference(blobPath);// 传入目标pathblob.downloadToFile(finalPath);} catch (URISyntaxException | StorageException | IOException e) {e.printStackTrace();}}public static void initAzure(String containerName) {try {// 获得StorageAccount对象storageAccount = CloudStorageAccount.parse(MessageFormat.format(format, PROTOCOL, ACCOUNT_NAME, ACCOUNT_KEY, END_POINT));// 由StorageAccount对象创建BlobClientblobClient = storageAccount.createCloudBlobClient();// 根据传入的containerName, 获得container实例container = blobClient.getContainerReference(containerName);} catch (URISyntaxException | InvalidKeyException | StorageException e) {e.printStackTrace();}}
}
结果:
Azure Blob Storage 基本用法上传/下载(Java)相关推荐
- Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...
- 微信js-sdk图片上传下载——java完整流程
最近做的一个项目刚好用到微信js-sdk的图片上传接口,在这里做一下总结. 在这里能知道使用js api的基本配置https://mp.weixin.qq.com/wiki?t=resource/re ...
- ftp上传下载 java FTPClient
项目需要,网上搜了搜,很多,但问题也不少,估计转来转去,少了不少东西,而且也情况也不太一样.没办法,只能自己去写一个. 一, 安装sserv-u ftp服务器 版本10.1.0.1 我所设服务器 ...
- Azure File Storage 基本用法 -- Azure Storage 之 File
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Blob Storage 基 ...
- Azure Table storage 基本用法 -- Azure Storage 之 Table
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table,其中的 Table 就是本文的主角 Azure Tabl ...
- servlet文件上传下载_Servlet上传文件和下载文件示例
servlet文件上传下载 Java Web应用程序中的文件上载和下载以及常见任务. 由于最近我写了很多有关Java servlet的文章 ,因此我想提供一个使用servlet上传和下载文件的示例示例 ...
- 2021-10-14 ContextType(MIME) 与 Java文件上传/下载
ContextType(MIME) 与 Java文件上传/下载 ContextType(MIME) Text Image Audio Video Application Multipart 和 Mes ...
- linux lftp下载目录,linux中使用lftp上传下载文件
lftp是linux中一款ftp服务器相比windows中的ftp显得要复杂不少了,下面我来总结一下lftp文件上传,文件下载,及文件查找等等相关命令吧. lftp连接的几种方法,最常用的是lftp ...
- Java文件上传下载
文件上传下载 Java文件上传和下载对于刚接触Java没多久的老铁们来说可能是一个技术难点.如果看过我前两篇文章的老铁肯定就知道,这次肯定又是一个工具类,废话少说我们直接附上代码. package c ...
最新文章
- 使用reveal.js制作PPT,并部署至GitHub
- 如何实现快速的diff工具(windiff, winmerge)?
- java 对象的强制类型转换
- python装饰器class_Python装饰器dataclass详解
- 数据库原理与应用 基于SQL Server 2005pdf
- hdu 3183(贪心)
- 虚拟服务器ftp文件权限修改,虚拟主机用户ftp和apache用户文件互操作权限解决方法...
- WinHEC 2008 China
- PHP-阿里云oss使用
- 论文记录-2018-A survey on image tampering and its detection in real-world photos
- 数学之美系列好文,强推
- [Rootkit] dll 隐藏 - VAD
- iTube Studio for Mac(高清视频下载器) V7.3.2破解版
- tilemap 菱形_带高度的isometric tile map 斜45度 2d 地图制作
- gnuplot 两点画线
- 查看windows服务器内存详细信息,Windows服务器查看内存型号
- agc024F Simple Subsequence Problem
- max等聚合函数和group by搭配使用的注意事项
- Python获取前一天的日期,前一个月的第一天,前一个月的最后一天
- 城市轨道交通自动售检票系统
热门文章
- python实现批量变更阿里云DNS解析记录状态
- laravel seeding
- python中的figure什么意思_Python Matplotlib.figure.Figure.text()用法及代码示例
- iperf和iperf3测速使用
- Django富文本编辑——Ckeditor的配置、使用和踩坑(应该全)
- Final SwfPlayer下载后在安卓12上玩宇宙的刻度2
- 双 JK 触发器 74LS112 逻辑功能。真值表_数字电路学习笔记(十一):时序逻辑...
- mysql结算订单表到用户_Luffy之结算订单页面(订单模型表的创建,订单的生成,以及订单详情展示等)...
- 交换机和路由器之间区别
- 【windows】windows创建软件raid0