由於azure上各個雲服務都是分開的,所以當一個地方生成文件后,我在別的地方想要讀取他就變得困難,不過azure上面有解決方案,就是azure blob storage。
在現有的訂閱賬號下,新建一個存儲blob,分私有和公共,私有的為私有存儲,外部鏈接無法訪問,公共則可以在外部直接通過鏈接進行存儲內容的訪問。
首先在cloud service和portal配置文件中均需添加一個key為storageAccount,value則為azure上的blobend,queueend,tableend,以及他的thumbprint。
在configuration文件中配置改存儲名稱。
public static string EmailFileContainer { get { return "email-response-save"; } }
建立一個BlobClient類,用來執行blob事件。
1 public class BlobClient 2 { 3 private static CloudBlobClient _cloudBlobClient; 4 5 static BlobClient() 6 { 7 _cloudBlobClient = CloudStorageAccount.Parse(Config.CloudStorageAccount).CreateCloudBlobClient(); 8 _cloudBlobClient.RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(1), 3); 9 } 10 11 /// <summary> 12 /// Get file from blob 13 /// </summary> 14 /// <param name="containerName"></param> 15 /// <param name="blobName"></param> 16 /// <param name="blobPath"></param> 17 public static void GetBlob(string containerName, string blobName, string blobPath) 18 { 19 var container = _cloudBlobClient.GetContainerReference(containerName); 20 21 var blob = container.GetBlockBlobReference(blobName); 22 var mode = System.IO.FileMode.Create; 23 blob.DownloadToFileAsync(blobPath, mode); 24 25 return; 26 } 27 28 /// <summary> 29 /// Add file to blob 30 /// </summary> 31 /// <param name="containerName"></param> 32 /// <param name="blobName"></param> 33 /// <param name="blobPath"></param> 34 /// <param name="blobFileName"></param> 35 public static void AddBlob(string containerName, string blobName, string blobPath,string blobFileName) 36 { 37 var container = _cloudBlobClient.GetContainerReference(containerName); 38 container.CreateIfNotExists(); 39 40 var blob = container.GetBlockBlobReference(blobName); 41 var mode = System.IO.FileMode.Open; 42 blob.UploadFromFileAsync(blobPath+blobFileName, mode); 43 44 return; 45 } 46 47 public static void DeleteBlob(string containerName, string blobName) 48 { 49 var container = _cloudBlobClient.GetContainerReference(containerName); 50 container.CreateIfNotExists(); 51 52 var blob = container.GetBlockBlobReference(blobName); 53 blob.DeleteIfExistsAsync(); 54 55 return; 56 } 57 58 public static void DeleteBlobContainer(string containerName) 59 { 60 var container = _cloudBlobClient.GetContainerReference(containerName); 61 container.CreateIfNotExists(); 62 63 foreach (var item in container.ListBlobs(null, false)) 64 { 65 foreach (var item1 in ((CloudBlobDirectory)item).ListBlobs()) 66 { 67 foreach (var item2 in ((CloudBlobDirectory)item1).ListBlobs()) 68 { 69 ((CloudBlockBlob)item2).DeleteIfExistsAsync(); 70 } 71 } 72 } 73 } 74 }
執行寫入blob storage步驟。
BlobClient.AddBlob(Config.EmailFileContainer, "MailExportTotalImage/"+ imgName, location, imgName);
讀取blob storage中的文件。
BlobClient.GetBlob(Config.EmailFileContainer, "MailExportAttachment1/" + sFileName, uploadPath + sFileName);
將內存流數據存入TXT。
var fn = DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt"; byte[] bs = stream.ToArray(); String contentStr = System.Text.Encoding.UTF8.GetString(bs);
BlobClient.AddBlob(Config.FileContainer, fn, contentStr);
若要創建公共可訪問文件的鏈接,需在對應雲服務的configuration文件中申明一個設置名稱。
<ConfigurationSettings> <!--Local--> <Setting name="aaaa" value="bbbbbbbbbbb" /> . . . <Setting name="EmailBlobStorage" value="http(s)://xxx.blob.core.chinacloudapi.cn/email-response-save/" /> </ConfigurationSettings>
核心configuration文件中建立一個指向雲服務configuration特定設置名稱的屬性。
public static string EmailBlobStorage { get { return CloudConfigurationManager.GetSetting("EmailBlobStorage"); } }
使用:
var location = Config.EmailBlobStorage; var imgsrc = location + "MailExportTotalImage/" + string.Format("{0:yyyy-MM-dd}", DateTime.Today.ToGmt8()) + _title + ".png";