کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش MVC Core-Azure Blob Storage In ASP.NET Core 2.0

آموزش MVC Core-Azure Blob Storage In ASP.NET Core 2.0

Problem

نحوه استفاده از ذخیره سازی Azure Blob در ASP.NET Core.

Solution

یک class library ایجاد کنید و NuGet package - WindowsAzure.Storage را اضافه کنید.
یک کلاس برای تنظیم کردن تنظیمات اضافه کنید:

public class AzureBlobSetings  
 {  
     public AzureBlobSetings(string storageAccount,  
                                    string storageKey,  
                                    string containerName)  
     {  
         if (string.IsNullOrEmpty(storageAccount))  
             throw new ArgumentNullException("StorageAccount");  
  
         if (string.IsNullOrEmpty(storageKey))  
             throw new ArgumentNullException("StorageKey");  
  
         if (string.IsNullOrEmpty(containerName))  
             throw new ArgumentNullException("ContainerName");  
  
         this.StorageAccount = storageAccount;  
         this.StorageKey = storageKey;  
         this.ContainerName = containerName;  
     }  
  
     public string StorageAccount { get; }  
     public string StorageKey { get; }  
     public string ContainerName { get; }  
 }  

یک کلاس برای تنظیم کردن blob item اضافه کنید:

public class AzureBlobItem  
  {  
      public AzureBlobItem(IListBlobItem item)  
      {  
          this.Item = item;  
      }  
  
      public IListBlobItem Item { get; }  
  
      public bool IsBlockBlob => Item.GetType() == typeof(CloudBlockBlob);  
      public bool IsPageBlob => Item.GetType() == typeof(CloudPageBlob);  
      public bool IsDirectory => Item.GetType() == typeof(CloudBlobDirectory);  
  
      public string BlobName => IsBlockBlob ? ((CloudBlockBlob)Item).Name :  
                                IsPageBlob ? ((CloudPageBlob)Item).Name :  
                                IsDirectory ? ((CloudBlobDirectory)Item).Prefix :  
                                "";  
  
      public string Folder => BlobName.Contains("/") ?  
                       BlobName.Substring(0, BlobName.LastIndexOf("/")) : "";  
  
      public string Name => BlobName.Contains("/") ?  
                       BlobName.Substring(BlobName.LastIndexOf("/") + 1) : BlobName;  
  }  

یک کلاس برای دسترسی به ذخیره سازی اضافه کنید. برای دسترسی به ذخیره سازی یک private helper methods را اضافه کنید.

  private async Task< CloudBlobContainer > GetContainerAsync()  
        {  
            //Account  
            CloudStorageAccount storageAccount = new CloudStorageAccount(  
         new StorageCredentials(settings.StorageAccount, settings.StorageKey), false);  
   
            //Client  
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();  
   
            //Container  
            CloudBlobContainer blobContainer =  
blobClient.GetContainerReference(settings.ContainerName);  
            await blobContainer.CreateIfNotExistsAsync();  
   
            return blobContainer;  
        }  
   
        private async Task< CloudBlockBlob > GetBlockBlobAsync(string blobName)  
        {  
            //Container  
            CloudBlobContainer blobContainer = await GetContainerAsync();  
   
            //Blob  
            CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(blobName);  
   
            return blockBlob;  
        }  
   
        private async Task< List< AzureBlobItem > > GetBlobListAsync(
bool useFlatListing = true)
        {
            //Container
            CloudBlobContainer blobContainer = await GetContainerAsync();

            //List
            var list = new List< AzureBlobItem >();
            BlobContinuationToken token = null;
            do
            {
                BlobResultSegment resultSegment =
                    await blobContainer.ListBlobsSegmentedAsync("", useFlatListing,
new BlobListingDetails(), null, token, null, null);
                token = resultSegment.ContinuationToken;

                foreach (IListBlobItem item in resultSegment.Results)
                {
                    list.Add(new AzureBlobItem(item));
                }
            } while (token != null);

            return list.OrderBy(i = > i.Folder).ThenBy(i = > i.Name).ToList();
        }

می توانیم اکنون برای upload و download (موارد blob items) از public methods ها استفاده کنیم:

public async Task UploadAsync(string blobName, string filePath)  
      {  
          //Blob  
          CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);  
  
          //Upload  
          using (var fileStream = System.IO.File.Open(filePath, FileMode.Open))  
          {  
              fileStream.Position = 0;  
              await blockBlob.UploadFromStreamAsync(fileStream);  
          }  
      }  
  
      public async Task UploadAsync(string blobName, Stream stream)  
      {  
          //Blob  
          CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);  
  
          //Upload  
          stream.Position = 0;  
          await blockBlob.UploadFromStreamAsync(stream);  
      }  
  
      public async Task< MemoryStream > DownloadAsync(string blobName)  
      {  
          //Blob  
          CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);  
  
          //Download  
          using (var stream = new MemoryStream())  
          {  
              await blockBlob.DownloadToStreamAsync(stream);  
              return stream;  
          }  
      }  
  
      public async Task DownloadAsync(string blobName, string path)  
      {  
          //Blob  
          CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);  
  
          //Download  
          await blockBlob.DownloadToFileAsync(path, FileMode.Create);  
      }  

متدی برای گرفتن لیستی از blob items را اضافه می کنیم:

public async Task< List< AzureBlobItem > > ListAsync()
   {
       return await GetBlobListAsync();
   }

   public async Task< List< string > > ListFoldersAsync()
   {
       var list = await GetBlobListAsync();
       return list.Where(i = > !string.IsNullOrEmpty(i.Folder))
                  .Select(i = > i.Folder)
                  .Distinct()
                  .OrderBy(i = > i)
                  .ToList();
   }

تزریق(Inject) و استفاده از storage helper:

public class HomeController : Controller  
  {  
      private readonly IAzureBlobStorage blobStorage;  
  
      public HomeController(IAzureBlobStorage blobStorage)  
      {  
          this.blobStorage = blobStorage;  
      }  

Note

این کدها دارای یک کنترلر با اکشن هایی برای listing ، downloading و uploading است.
در ASP.NET Core Web Application، configure services:

public void ConfigureServices(  
        IServiceCollection services)  
    {  
        services.AddScoped< IAzureBlobStorage>(factory =>  
        {  
            return new AzureBlobStorage(new AzureBlobSetings(  
                storageAccount: Configuration["Blob_StorageAccount"],  
                storageKey: Configuration["Blob_StorageKey"],  
                containerName: Configuration["Blob_ContainerName"]));  
        });  
  
        services.AddMvc();  
    }  

Discussion

کد نمونه نیاز به تنظیم یک Azure account، blob storage accountو container دارد.
شما می توانید Source Code از لینک زیر دانلود کنید:

https://github.com/TahirNaushad/Fiver.Azure.Blob

شما دانشجویان محترم می توانید فایل مربوط به این آموزش را در پایین دانلود نمایید

1397/03/03 2549 1656
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...