avatar

目录
Azure 学习笔记 II —— Azure Storage

什么是 Azure Storage

Azure Storage 官网:https://azure.microsoft.com/en-gb/services/storage/

一句话概括:按需支付的安全的云存储服务,帮你解决繁重的数据中心管理任务。

Azure Storage包括以下存储服务:

  • File:简单的分布式跨平台文件系统
  • Blob:高度可伸缩的非结构化数据存储
  • Disk:适用于每种工作负荷的持久高性能磁盘存储
  • Data Lake Storage:适用于大数据分析的、安全、高度可伸缩的存储
  • Archive:在存储不常使用的数据方面具有行业领先的价格优势
  • Azure vFXT for Azure:在边缘设备上的高性能计算

为什么要用 Azure Storage

Azure Storage可以简单理解为“微软云盘”,若你正为“百度网盘”的限速所苦恼,来拥抱Azure Storage吧!
个人将其优势概括如下:

  • 使用简单
  • 可用于云计算,满足云服务的存储需求
  • 按需支付

Azure Storage 定价标准

https://azure.microsoft.com/en-us/pricing/details/storage/

开始使用 Azure Storage

创建Azure Storage账户

  • 在Azure portal中搜索storage accounts,点击进入“Storage accounts”界面
  • 点击红框处Add,即可新建存储账户
  • 填写必要信息后,创建存储账户(详细填写说明参照官方文档

Azure Storage Explorer

下载Azure Storage Explorer,使用同一账号登录,找到对应的订阅即可看到刚刚创建的Storage account。

我们可以直接使用Azure Storage Explorer进行文件的上传和下载操作,可以看到一个Storage Account下有四种类型的服务:

  • Blob Containers
    • 可以新建多个Containers,每个Container下均可以存储文件,Azure中将存储于Container中的文件称为Blob
    • 存储可通过浏览器直接访问的文档、图片
    • 存储视频、音频流数据
    • 适合存储大文件
    • 价格便宜
  • File Shares
    • 同Windows文件夹性质相同,可创建多级子文件夹
    • 存储需要被多方(多台虚拟机或多个程序)访问的文件
    • 价格高昂
  • Queues:不常用,不做介绍
  • Tables:不常用,不做介绍

Azure Storage SDK

除了使用桌面端App:Azure Storage Explorer操作Azure Storage之外,若我们需要在代码中对其进行操作,就需要使用对应编程语言的SDK了,此处我们主要介绍.Net SDK,其他支持的语言还有:Java、Python、JavaScript、Go、PHP、Ruby等。

新建项目

  • 打开Visual Studio,新建“Console App”项目

添加配置文件

  • 右击Project,新建“App.config”配置文件,用来配置Azure Storage Account

  • 在“App.config”中添加如下代码:
xml
1
2
3
4
5
6
7
8
9
< ?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
< /startup>
<appSettings>
<add key="StorageConnectionString" value="YOUR STORAGECONNECTIONSTRING" />
< /appSettings>
< /configuration>

复制的话记得将“< ?”和“< /”中间的空格删掉,这里加上空格是为了防止浏览器将其误渲染。

其中的YOUR STORAGECONNECTIONSTRING可从Azure portal对应的Storage account中找到:

上传/删除/下载 by C#

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
using Microsoft.Azure.Storage;      // Namespace for Storage Client Library
using Microsoft.Azure.Storage.Blob; // Namespace for Azure Blobs
using Microsoft.Azure.Storage.File; // Namespace for Azure Files
using System;
using System.IO;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static async Task Main()
{
// 获取StorageConnectionString
var appSettings = System.Configuration.ConfigurationManager.AppSettings;
// 创建与storageAccount的连接
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(appSettings["StorageConnectionString"]);

// ===========================================================================================

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); // 创建blob client

String containerName = "myContainer"; // Container名称
String blobName = "xxx.ext"; // Blob名称
String localFilePath = "localFile.ext"; // 待上传的本地文件路径
var fileStream = File.OpenRead(localFilePath); // 获取fileStream

// 上传文件到Blob
upload_to_blob(blobClient, containerName, blobName, fileStream);
// 从Blob删除文件
delete_from_blob(blobClient, containerName, blobName);
// 从Blob读取Bytes
byte[] bb = readbytes_from_blob(blobClient, containerName, blobName);
// 从Blob读取文本
String text = readtext_from_blob(blobClient, containerName, blobName);

// ===========================================================================================

CloudFileClient fileClient = storageAccount.CreateCloudFileClient(); // 创建file client

String shareName = "myShare"; // FileShare名称
String dirName = "subDir"; // 子目录名称
String cloudFileName = "xxx.ext"; // 云端文件名称
String localFileName = "localFile.ext"; // 待上传的本地文件路径
var fileStream = System.IO.File.OpenRead(localFileName); // 获取fileStream

// 上传文件到fileShare
upload_to_fileshare(fileClient, shareName, dirName, cloudFileName, fileStream);
// 从fileShare删除文件
delete_from_fileshare(fileClient, shareName, dirName, cloudFileName);
// 从fileShare读取Bytes
byte[] bb = readbytes_from_fileshare(fileClient, shareName, dirName, cloudFileName);
// 从fileShare读取文本
String text = readtext_from_fileshare(fileClient, shareName, dirName, cloudFileName);

}

public static void upload_to_blob(CloudBlobClient blobClient, String containerName, String blobName, Stream stream)
{
CloudBlobContainer container = blobClient.GetContainerReference(containerName); // 从blobClient获取container的引用
container.CreateIfNotExists(); // 如果不存在就创建 FileShare
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); // 从container获取blob的引用

blockBlob.UploadFromStream(stream); // 上传文件
}

public static void delete_from_blob(CloudBlobClient blobClient, String containerName, String blobName)
{
CloudBlobContainer container = blobClient.GetContainerReference(containerName); // 从blobClient获取container的引用
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); // 从container获取blob的引用

blockBlob.DeleteIfExists(); // 删除文件
}

public static byte[] readbytes_from_blob(CloudBlobClient blobClient, String containerName, String blobName)
{
CloudBlobContainer container = blobClient.GetContainerReference(containerName); // 从blobClient获取container的引用
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); // 从container获取blob的引用

if (!blockBlob.Exists()) // Blob不存在
return null;

byte[] content = new byte[blockBlob.Properties.Length];
blockBlob.DownloadToByteArray(content, 0); // 读取Bytes
return content;
}

public static String readtext_from_blob(CloudBlobClient blobClient, String containerName, String blobName)
{
CloudBlobContainer container = blobClient.GetContainerReference(containerName); // 从blobClient获取container的引用
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); // 从container获取blob的引用

if (!blockBlob.Exists()) // Blob不存在
return null;

return blockBlob.DownloadText(); // 读取文本
}

public static void upload_to_fileshare(CloudFileClient fileClient, String shareName, String dirName, String cloudFileName, Stream stream)
{
CloudFileShare share = fileClient.GetShareReference(shareName); // 获取 FileShare 对象
share.CreateIfNotExists(); // 如果不存在就创建 FileShare

CloudFileDirectory rootDir = share.GetRootDirectoryReference(); // 获取根目录的引用
CloudFileDirectory webDir = rootDir.GetDirectoryReference(dirName); // 获取子目录的引用
webDir.CreateIfNotExists(); // 获取子目录

CloudFile cloudFile = webDir.GetFileReference(cloudFileName); // 获取文件的引用
cloudFile.UploadFromStream(stream); // 上传文件
}

public static void delete_from_fileshare(CloudFileClient fileClient, String shareName, String dirName, String cloudFileName)
{
CloudFileShare share = fileClient.GetShareReference(shareName); // 获取 FileShare 对象

CloudFileDirectory rootDir = share.GetRootDirectoryReference(); // 获取根目录的引用
CloudFileDirectory webDir = rootDir.GetDirectoryReference(dirName); // 获取子目录的引用

CloudFile cloudFile = webDir.GetFileReference(cloudFileName); // 获取文件的引用
cloudFile.DeleteIfExists(); // 删除文件
}

public static byte[] readbytes_from_fileshare(CloudFileClient fileClient, String shareName, String dirName, String cloudFileName)
{
CloudFileShare share = fileClient.GetShareReference(shareName); // 获取 FileShare 对象
CloudFileDirectory rootDir = share.GetRootDirectoryReference(); // 获取根目录的引用

CloudFile cloudFile;
if (String.IsNullOrEmpty(dirName)) // 文件在根目录
{
cloudFile = rootDir.GetFileReference(cloudFileName); // 获取文件的引用
}
else // 文件在子目录
{
CloudFileDirectory webDir = rootDir.GetDirectoryReference(dirName); // 获取子目录的引用
cloudFile = webDir.GetFileReference(cloudFileName); // 获取文件的引用
}

if (!cloudFile.Exists()) // 文件不存在
return null;

byte[] content = new byte[cloudFile.Properties.Length];
cloudFile.DownloadToByteArray(content, 0); // 读取Bytes
return content;
}

public static String readtext_from_fileshare(CloudFileClient fileClient, String shareName, String dirName, String cloudFileName)
{
CloudFileShare share = fileClient.GetShareReference(shareName); // 获取 FileShare 对象
CloudFileDirectory rootDir = share.GetRootDirectoryReference(); // 获取根目录的引用

CloudFile cloudFile;
if (String.IsNullOrEmpty(dirName)) // 文件在根目录
{
cloudFile = rootDir.GetFileReference(cloudFileName); // 获取文件的引用
}
else // 文件在子目录
{
CloudFileDirectory webDir = rootDir.GetDirectoryReference(dirName); // 获取子目录的引用
cloudFile = webDir.GetFileReference(cloudFileName); // 获取文件的引用
}

if (!cloudFile.Exists()) // 文件不存在
return null;

return cloudFile.DownloadText(); // 读取文本
}

}
}
文章作者: Reborn
文章链接: https://reborn8888.github.io/2020/05/10/Azure-2-Storage/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Reborn
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论