Azure Blob Storage學習筆記——圖片的上傳,瀏覽,下載,刪除


 1.通過NuGet將Azure Storage的相關包引入項目

2.在config文件中寫入相關帳號

    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
      <!--存儲賬號名稱-->
      <add key="AccountName" value="account-name" />
      <!--存儲賬號密鑰-->
      <add key="AccountKey" value="account-key" />
      <!--ContainerName,必須是小寫-->
      <add key="ContainerName" value="images" />
      <!-- SAS過期時間xx秒-->
      <add key="expireseconds" value="60" />
      <add key="RecyclebinContainerName" value="recyclebin" />

3.Azure的相關操作

#region Azure Helper
        public static void EnsureContaierExists()
        {
            string containername = ConfigurationManager.AppSettings["ContainerName"].ToString();
            var container = GetContainer(containername);
            // 檢查container是否被創建,如果沒有,創建container
            container.CreateIfNotExists();
            var permissions = container.GetPermissions();
            //對Storage的訪問權限是可以瀏覽Container
            permissions.PublicAccess = BlobContainerPublicAccessType.Off;
            container.SetPermissions(permissions);
        }

        public static CloudBlobContainer GetContainer(string containername)
        {
            //Get config from Web.Config
            string accountname = ConfigurationManager.AppSettings["AccountName"].ToString();
            string accountkey = ConfigurationManager.AppSettings["AccountKey"].ToString();
            string connectionString = GenerateConnectionString(accountname, accountkey);
            //Get Azure Storage Connection String 
            var account = CloudStorageAccount.Parse(connectionString);
            var client = account.CreateCloudBlobClient();
            //Get BlobContainer Object
            return client.GetContainerReference(containername);
        }

        public static string GenerateConnectionString(string accountname, string accountkey)
        {
            StringBuilder sbuilder = new StringBuilder();
            sbuilder.Append(@"BlobEndpoint=https://");
            sbuilder.Append(accountname);
            sbuilder.Append(".blob.core.windows.net/");

            sbuilder.Append(@";QueueEndpoint=https://");
            sbuilder.Append(accountname);
            sbuilder.Append(".queue.core.windows.net/");

            sbuilder.Append(@";TableEndpoint=https://");
            sbuilder.Append(accountname);
            sbuilder.Append(".table.core.windows.net/");

            sbuilder.Append(";AccountName=");
            sbuilder.Append(accountname);

            sbuilder.Append(";AccountKey=");
            sbuilder.Append(accountkey);

            return sbuilder.ToString();
        }
        public static string GetSAS(CloudBlockBlob blob)
        {
            string seconds = ConfigurationManager.AppSettings["expireseconds"].ToString();
            float result = 20;

            var sas = blob.GetSharedAccessSignature(
                new SharedAccessBlobPolicy()
                {
                    Permissions = SharedAccessBlobPermissions.Read,
                    SharedAccessExpiryTime = DateTime.UtcNow.AddSeconds(float.TryParse(seconds, out result) ? result : 0f)
                });
            var secureURl = blob.Uri.AbsoluteUri + sas;

            return secureURl.ToString();
        }
        #endregion

 

4.上傳圖片

    string sFileEXT = Path.GetExtension(imageName);
    string sFileMimeType = Utils.GetFileContentType(sFileEXT);
    Guid gID = Guid.NewGuid();
byte[] imageCONTENT = File.ReadAllBytes(imageName);   
string containername = ConfigurationManager.AppSettings["ContainerName"].ToString(); CloudBlockBlob blob = GetContainer(containername).GetBlockBlobReference(Sql.ToString(gID) + sFileEXT); blob.Properties.ContentType = sFileMimeType; using (MemoryStream ms = new MemoryStream(imageCONTENT, false)) { blob.UploadFromStream(ms); }
spImages_Update(ref gID,...);
//將圖片的相關信息存入數據庫

5.瀏覽圖片(通過圖片ID查看圖片)

string filename =Sql.ToString(gID)+ sFileEXT; 
string containername = ConfigurationManager.AppSettings["ContainerName"].ToString();
CloudBlockBlob blob = APSqlProcs.GetContainer(containername).GetBlockBlobReference(filename);
string sSASURL = APSqlProcs.GetSAS(blob);
sSrc
= sSASURL;
//將Src傳給前台的圖片控件

6.下載圖片

Response.ContentType = Sql.ToString(rdr["FILE_MIME_TYPE"]);
 sFileName = Path.GetFileName(Sql.ToString(rdr["FILENAME"]));
 Response.AddHeader("Content-Disposition", "attachment;filename=" + sFileName);
 string sFileEXT = Path.GetExtension(sFileName);
 string filename = gID.ToString() + sFileEXT;
 string containername = ConfigurationManager.AppSettings["ContainerName"].ToString();
 CloudBlockBlob blob = APSqlProcs.GetContainer(containername).GetBlockBlobReference(filename);
 using (MemoryStream memoryStream = new MemoryStream())
 {
      blob.DownloadToStream(memoryStream);
      byte[] bytes = new byte[memoryStream.Length];
    memoryStream.Seek(0, SeekOrigin.Begin);//memoryStream的指針在讀入數據后指向了末尾,所以要重置到開始的位置,用memoryStream.Position = 0也可以
memoryStream.Read(bytes, 0, bytes.Length);
using (BinaryWriter bw = new BinaryWriter(Response.OutputStream))
{
bw.Write(bytes);
}
}

 7.刪除圖片(其實是將圖片移動到名為recyclebin的Container里去,方便找回,可以寫一個計划任務,定期刪除recyclebin里的文件)

      private void DelImage(Guid gImageID, string sImageName)
        {
            string sFileEXT = Path.GetExtension(sImageName);
            string sFileMimeType = Utils.GetFileContentType(sFileEXT);
            string filename = gImageID.ToString() + sFileEXT;
            string sourceContainer = ConfigurationManager.AppSettings["ContainerName"].ToString();
            string targetContainer = ConfigurationManager.AppSettings["RecyclebinContainerName"].ToString();
            CloudBlockBlob sourceBlob = APSqlProcs.GetContainer(sourceContainer).GetBlockBlobReference(filename);
            CloudBlockBlob targetBlob = APSqlProcs.GetContainer(targetContainer).GetBlockBlobReference(filename);
            targetBlob.StartCopyAsync(sourceBlob);
            sourceBlob.Delete();
        }

 

注:相關操作請參考Microsoft Azure官方文章Get started with Azure Blob storage using .NET(https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-how-to-use-blobs)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM