.net MVC 檔案上傳至Azure Blob
公司幾乎都Azure化。
而我,以前沒玩過任何Azure,不過,其實好像又沒什麼太大差別,反正觀念就那樣。
以前檔案會放在網站路徑下或某個實體位置,今天我們來看看如何將檔案放在Azure的Blob上。
先看官方網站的說明:如何使用 .NET 的 Blob 儲存體
必須說,這份文件大概是我看過最快上手的文件了。
所以,這篇文章會記錄我自己的一些程式寫法。
先看看Blob的概念,一個帳號底下可以有多個Container(想像成資料夾),
一個Container可以有多個Blob(也就是檔案)。
再來要注意Container & Blob的命名方式(很重要),因為,只要命名規則錯誤,Azure一定回給你400錯誤。
1: public class AzureBlob
2: {
3: private readonly string storeageConnStr = ConfigurationManager.ConnectionStrings["storeageConnStr"].ConnectionString;
4:
5: private CloudBlobContainer GetContainer(string containerName)
6: {
7: if (string.IsNullOrWhiteSpace(containerName))
8: throw new ArgumentException("參數遺失");
9:
10: var account = CloudStorageAccount.Parse(this.storeageConnStr);
11:
12: var client = account.CreateCloudBlobClient();
13:
14: return client.GetContainerReference(containerName.ToLower());
15: }
16:
17: public void Download()
18: {
19: var blockBlob = GetBlockBlob("containerName", "fileName");
20:
21: using (var ms = new MemoryStream())
22: {
23: blockBlob.DownloadToStream(ms);
24: }
25: }
26:
27: public CloudBlockBlob GetBlockBlob(string containerName, string fileName)
28: {
29: var container = GetContainer(containerName);
30:
31: container.CreateIfNotExists();
32:
33: return container.GetBlockBlobReference(fileName);
34: }
35:
36: public async Task SaveBlobAsync(string containerName, string fileName, Stream fileStream)
37: {
38: /*
39: 可以在之前先做檔案檢查,例如附檔名等...
40: */
41: var blockBlob = GetBlockBlob(containerName, fileName);
42:
43: await blockBlob.UploadFromStreamAsync(fileStream);
44: }
45:
46: public async Task DelBlob(string containerName, string fileName)
47: {
48: var blockBlob = GetBlockBlob(containerName, fileName);
49:
50: if (blockBlob.Exists())
51: await blockBlob.DeleteAsync();
52: }
53: }
因為幾乎所有操作都需要取得CloudBlockBlob物件,所以,抽出來成一個Function。
檔案刪除部分,也是一樣先確認Blob存在,才進行刪除。否則,Azure會丟400錯誤。
就讓程式碼說明一切吧!!應該不難懂,有不懂的也歡迎大家提出。