文章目录

  • 简单概念
    • 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划分为三种类型

  1. Block Blob: 主要存储静态文件, 如图片, 视频, 文档.
  2. Append Blob: 与Block Blob类似, 优化了append操作, 主要应用场景就是日志存储.
  3. 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)相关推荐

  1. Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...

  2. 微信js-sdk图片上传下载——java完整流程

    最近做的一个项目刚好用到微信js-sdk的图片上传接口,在这里做一下总结. 在这里能知道使用js api的基本配置https://mp.weixin.qq.com/wiki?t=resource/re ...

  3. ftp上传下载 java FTPClient

    项目需要,网上搜了搜,很多,但问题也不少,估计转来转去,少了不少东西,而且也情况也不太一样.没办法,只能自己去写一个. 一,    安装sserv-u ftp服务器 版本10.1.0.1 我所设服务器 ...

  4. Azure File Storage 基本用法 -- Azure Storage 之 File

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Blob Storage 基 ...

  5. Azure Table storage 基本用法 -- Azure Storage 之 Table

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table,其中的 Table 就是本文的主角 Azure Tabl ...

  6. servlet文件上传下载_Servlet上传文件和下载文件示例

    servlet文件上传下载 Java Web应用程序中的文件上载和下载以及常见任务. 由于最近我写了很多有关Java servlet的文章 ,因此我想提供一个使用servlet上传和下载文件的示例示例 ...

  7. 2021-10-14 ContextType(MIME) 与 Java文件上传/下载

    ContextType(MIME) 与 Java文件上传/下载 ContextType(MIME) Text Image Audio Video Application Multipart 和 Mes ...

  8. linux lftp下载目录,linux中使用lftp上传下载文件

    lftp是linux中一款ftp服务器相比windows中的ftp显得要复杂不少了,下面我来总结一下lftp文件上传,文件下载,及文件查找等等相关命令吧. lftp连接的几种方法,最常用的是lftp ...

  9. Java文件上传下载

    文件上传下载 Java文件上传和下载对于刚接触Java没多久的老铁们来说可能是一个技术难点.如果看过我前两篇文章的老铁肯定就知道,这次肯定又是一个工具类,废话少说我们直接附上代码. package c ...

最新文章

  1. 使用reveal.js制作PPT,并部署至GitHub
  2. 如何实现快速的diff工具(windiff, winmerge)?
  3. java 对象的强制类型转换
  4. python装饰器class_Python装饰器dataclass详解
  5. 数据库原理与应用 基于SQL Server 2005pdf
  6. hdu 3183(贪心)
  7. 虚拟服务器ftp文件权限修改,虚拟主机用户ftp和apache用户文件互操作权限解决方法...
  8. WinHEC 2008 China
  9. PHP-阿里云oss使用
  10. 论文记录-2018-A survey on image tampering and its detection in real-world photos
  11. 数学之美系列好文,强推
  12. [Rootkit] dll 隐藏 - VAD
  13. iTube Studio for Mac(高清视频下载器) V7.3.2破解版
  14. tilemap 菱形_带高度的isometric tile map 斜45度 2d 地图制作
  15. gnuplot 两点画线
  16. 查看windows服务器内存详细信息,Windows服务器查看内存型号
  17. agc024F Simple Subsequence Problem
  18. max等聚合函数和group by搭配使用的注意事项
  19. Python获取前一天的日期,前一个月的第一天,前一个月的最后一天
  20. 城市轨道交通自动售检票系统

热门文章

  1. python实现批量变更阿里云DNS解析记录状态
  2. laravel seeding
  3. python中的figure什么意思_Python Matplotlib.figure.Figure.text()用法及代码示例
  4. iperf和iperf3测速使用
  5. Django富文本编辑——Ckeditor的配置、使用和踩坑(应该全)
  6. Final SwfPlayer下载后在安卓12上玩宇宙的刻度2
  7. 双 JK 触发器 74LS112 逻辑功能。真值表_数字电路学习笔记(十一):时序逻辑...
  8. mysql结算订单表到用户_Luffy之结算订单页面(订单模型表的创建,订单的生成,以及订单详情展示等)...
  9. 交换机和路由器之间区别
  10. 【windows】windows创建软件raid0