Azure Blob 저장소
Azure Storage 소개
Azure Storage는 클라우드 기반의 데이터 저장소입니다. 이를 사용하여 다양한 데이터를 저장하고 관리할 수 있습니다. Azure Storage는 다음과 같은 기능을 제공합니다.
Blob Storage
Blob Storage는 대용량의 비정형 데이터를 저장하는 데 사용됩니다. Blob은 Binary Large OBjects의 약어로, 사진, 비디오, 오디오 파일 등과 같이 큰 파일을 저장할 수 있습니다.
Table Storage
Table Storage는 대량의 정형화된 데이터를 저장하는 데 사용됩니다. 이는 SQL 서버와 같은 관계형 데이터베이스보다 더 큰 스케일과 더 높은 처리량을 처리할 수 있습니다.
Queue Storage
Queue Storage는 메시지를 처리하고 분산 시스템 간에 통신할 때 사용됩니다. 이를 사용하여 메시지를 보내고 받을 수 있습니다.
File Storage
File Storage는 서버 메시지 블록(SMB) 프로토콜을 사용하여 파일 공유를 제공합니다. 이를 사용하여 여러 가지 응용 프로그램에서 동일한 파일을 공유할 수 있습니다.
Azure Storage는 데이터의 보안 및 가용성을 위해 다양한 기능을 제공합니다. 이를 사용하여 데이터를 보호하고, 장애 대비 및 복원력을 높일 수 있습니다. 또한 이를 사용하여 대용량 데이터를 처리하고 저장하는 데 필요한 인프라를 유지하고 관리할 필요가 없습니다.
Azure Blob Storage
Azure Blob Storage는 대용량의 비정형 데이터를 저장하는 데 사용됩니다. 이를 사용하여 사진, 비디오, 오디오 파일 등과 같은 대형 파일을 저장할 수 있습니다. Azure Blob Storage는 다음과 같은 장점을 제공합니다.
스케일링
Azure Blob Storage는 데이터의 크기와 수에 관계없이 수평 확장이 가능합니다. 이를 통해 처리량을 늘리거나 줄일 수 있습니다.
가용성
Azure Blob Storage는 지역 간 복제 및 가용성 영역을 통해 데이터의 가용성을 보장합니다. 이를 통해 장애 대비 및 복원력을 높일 수 있습니다.
보안
Azure Blob Storage는 데이터의 보안을 위한 다양한 기능을 제공합니다. 이를 사용하여 데이터를 암호화하고, 액세스 권한을 관리하고, 액세스 로그를 검사할 수 있습니다.
비용 효율적
Azure Blob Storage는 데이터의 크기와 수에 따라 유연한 비용 모델을 제공합니다. 이를 사용하여 데이터 저장 및 처리에 대한 비용을 최소화할 수 있습니다.
Azure Blob Storage는 REST API를 통해 다양한 클라이언트에서 액세스할 수 있습니다. 또한 .NET, Java, Node.js, Python 등 다양한 프로그래밍 언어에서도 지원됩니다.
Azure Blob Storage는 대용량 파일을 저장하고 처리하는 데 매우 유용한 서비스입니다. 이를 사용하여 대규모 파일을 효율적으로 관리하고, 데이터의 가용성과 보안을 보장할 수 있습니다.
Blob Types
- Block Blob
- Append Blob
Azure Blob Storage 사용 절차
Azure Portal에서 Azure Blob Storage를 사용하기 위한 절차는 다음과 같습니다.
Azure Portal에 로그인합니다.
좌측 상단의
리소스 만들기
버튼을 클릭합니다.검색 창에서
Blob Storage
를 입력하고, 검색 결과 중Blob Storage
를 선택합니다.Blob Storage
의만들기
버튼을 클릭합니다.기본 정보
탭에서구독
,리소스 그룹
,스토리지 계정 이름
,위치
를 설정합니다.고급
탭에서재해 복구
를 선택합니다.구성
탭에서액세스 등록 정보
에서공용 액세스 레벨
을 설정합니다. Blob Storage의 액세스를 제한하려면Blob
에서자체 서명된 URL
을 선택합니다.구성
탭에서암호화
를 설정합니다. Blob Storage에 저장되는 데이터를 암호화할 경우,암호화
옵션을 선택하고암호화 종류
를 설정합니다.태그
탭에서태그
를 추가합니다.검토 + 만들기
탭에서 설정한 정보를 확인하고,만들기
버튼을 클릭합니다.
이후, 만든 Blob Storage에 접근하여 파일을 업로드 및 관리하는 등의 작업을 할 수 있습니다. 예를 들어, Azure Portal의 Blob Storage 화면에서 컨테이너를 생성하여 Blob을 그룹화하고, 업로드 버튼을 클릭하여 Blob을 업로드할 수 있습니다. 또한, 접근 정책 탭에서 Blob Storage에 대한 액세스 권한을 설정할 수 있습니다.
Azure.Storage.Blobs NuGet 패키지
Azure.Storage.Blobs는 Microsoft Azure에서 호스팅되는 Blob Storage 서비스를 사용하여 데이터를 저장하고 검색하는 데 사용되는 .NET용 패키지입니다. Blob Storage 서비스는 대규모 비정형 데이터를 저장할 수 있는 클라우드 데이터 스토리지입니다. 이 서비스를 사용하면 데이터를 저장할 때 간단한 메타데이터 및 URL을 쉽게 추가할 수 있으며, 필요할 때 언제든지 검색할 수 있습니다.
Azure.Storage.Blobs 패키지를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
- Blob 저장소에서 블록 또는 페이지 blob 업로드 및 다운로드
- Blob 저장소에서 블록 또는 페이지 blob 삭제 및 업데이트
- Blob 저장소에서 blob 메타데이터 추가 및 업데이트
- Blob 저장소에서 blob 권한 설정
Azure.Storage.Blobs 패키지는 .NET Standard 2.0 이상을 대상으로 하므로 .NET Core, .NET Framework 및 Xamarin 앱 등 다양한 플랫폼에서 사용할 수 있습니다. 이 패키지를 사용하면 Azure Blob Storage와 간편하게 통신하며, Blob Storage를 사용하는 애플리케이션을 개발하기 위한 필수 도구입니다.
Microsoft.Extensions.Azure NuGet 패키지
Microsoft.Extensions.Azure는 Azure Storage, Service Bus, Event Hubs, Cosmos DB 등 Azure 서비스를 사용하기 위한 .NET Core/ASP.NET Core용 패키지를 제공합니다.
이 패키지는 일반적으로 Azure.Storage.Blobs
, Azure.Messaging.ServiceBus
, Azure.Messaging.EventHubs
, Azure.Cosmos
등 다른 Azure NuGet 패키지들과 함께 사용됩니다.
패키지를 설치하면 다음과 같은 네임스페이스를 사용할 수 있습니다.
Microsoft.Extensions.Azure
Microsoft.Extensions.Azure.Storage
또한, IServiceCollection
인터페이스에 AddAzureClients
메서드를 추가하고, 다음과 같이 ConfigureServices
에서 사용할 수 있습니다.
using Microsoft.Extensions.Azure;
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
services.AddAzureClients(builder =>
{
builder.AddBlobServiceClient(Configuration.GetConnectionString("BlobStorage"));
builder.AddQueueServiceClient(Configuration.GetConnectionString("QueueStorage"));
});
}
이렇게 하면 IBlobServiceClient 및 IQueueServiceClient 등의 인터페이스를 DI로 주입 받을 수 있습니다.
using Azure.Storage.Blobs;
using Azure.Storage.Queues;
public class MyService : IMyService
{
private readonly IBlobServiceClient _blobClient;
private readonly IQueueServiceClient _queueClient;
public MyService(IBlobServiceClient blobClient, IQueueServiceClient queueClient)
{
_blobClient = blobClient;
_queueClient = queueClient;
}
public async Task DoSomethingAsync()
{
var containerClient = _blobClient.GetBlobContainerClient("mycontainer");
var blobClient = containerClient.GetBlobClient("myblob");
await blobClient.UploadAsync(new MemoryStream(Encoding.UTF8.GetBytes("Hello, Azure!")), true);
var queueClient = _queueClient.GetQueueClient("myqueue");
await queueClient.SendMessageAsync("Hello, Azure!");
}
}
위의 코드에서 _blobClient
및 _queueClient
는 각각 IBlobServiceClient
및 IQueueServiceClient
의 구현체입니다. 이 구현체를 사용하여 Azure Blob Storage 및 Azure Queue Storage에 대한 작업을 수행할 수 있습니다.
ASP.NET Core에서 Blob Storage 사용하기
ASP.NET Core MVC 프로젝트를 생성한 후, 다음 단계를 따라 Azure Blob Storage에 대한 사용을 위한 절차를 진행할 수 있습니다.
Visual Studio에서
VisualAcademy
이름의 새로운 ASP.NET Core Empty 프로젝트를 생성합니다.Services
폴더를 생성하고,IBlobStorageService.cs
파일을 만듭니다.
using Microsoft.AspNetCore.Http;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace VisualAcademy.Services
{
public interface IBlobStorageService
{
Task UploadFileAsync(IFormFile file, string fileName);
Task<byte[]> DownloadFileAsync(string fileName);
Task<IEnumerable<string>> GetAllFileNamesAsync();
Task<bool> DeleteFileAsync(string fileName);
Task UpdateFileAsync(IFormFile file, string fileName);
}
}
Services
폴더에BlobStorageService.cs
파일을 만듭니다.
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Microsoft.AspNetCore.Http;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace VisualAcademy.Services
{
public class BlobStorageService : IBlobStorageService
{
private readonly BlobServiceClient _blobServiceClient;
private readonly string _containerName;
public BlobStorageService(string connectionString, string containerName)
{
_blobServiceClient = new BlobServiceClient(connectionString);
_containerName = containerName;
}
public async Task UploadFileAsync(IFormFile file, string fileName)
{
var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
var blobClient = containerClient.GetBlobClient(fileName);
using var stream = file.OpenReadStream();
await blobClient.UploadAsync(stream, new BlobUploadOptions
{
HttpHeaders = new BlobHttpHeaders { ContentType = file.ContentType }
});
}
public async Task<byte[]> DownloadFileAsync(string fileName)
{
var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
var blobClient = containerClient.GetBlobClient(fileName);
var response = await blobClient.DownloadAsync();
using var streamReader = new MemoryStream();
await response.Value.Content.CopyToAsync(streamReader);
return streamReader.ToArray();
}
public async Task<IEnumerable<string>> GetAllFileNamesAsync()
{
var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
var blobItems = containerClient.GetBlobsAsync();
var fileNames = new List<string>();
await foreach (var blobItem in blobItems)
{
fileNames.Add(blobItem.Name);
}
return fileNames;
}
public async Task<bool> DeleteFileAsync(string fileName)
{
var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
var blobClient = containerClient.GetBlobClient(fileName);
var response = await blobClient.DeleteIfExistsAsync();
return response.Value;
}
public async Task UpdateFileAsync(IFormFile file, string fileName)
{
await DeleteFileAsync(fileName);
await UploadFileAsync(file, fileName);
}
}
}
appsettings.json
파일을 열고, Blob Storage 계정 정보를 추가합니다.
{
"ConnectionStrings": {
"BlobStorageConnection": "YourConnectionString"
},
"BlobStorageContainerName": "YourContainerName"
}
Program.cs(Startup.cs) 파일에 등록하기
BlobStorageService
클래스를 DI 컨테이너에 등록합니다.ConfigureServices
메서드에 다음 코드를 추가합니다.
services.AddScoped<IBlobStorageService>(provider =>
{
var connectionString = Configuration.GetConnectionString("BlobStorageConnection");
var containerName = Configuration.GetValue<string>("BlobStorageContainerName");
return new BlobStorageService(connectionString, containerName);
});
Startup.cs 파일의 전체 샘플 코드는 다음과 같습니다. Program.cs 파일에 옮기는 것은 어렵지 않기에 .NET 전체 버전을 위한 Startup.cs 파일 코드를 보여드립니다.
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using VisualAcademy.Data;
using VisualAcademy.Services;
namespace VisualAcademy
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddControllersWithViews();
services.AddScoped<IBlobStorageService, BlobStorageService>(sp =>
{
var connectionString = Configuration.GetConnectionString("AzureBlobStorageConnectionString");
var containerName = Configuration["AzureBlobStorage:ContainerName"];
return new BlobStorageService(connectionString, containerName);
});
services.AddRazorPages();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
}
}
BlobStorageController.cs
파일의 전체 내용은 다음과 같습니다.
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using VisualAcademy.Services;
using System.Threading.Tasks;
public class BlobStorageController : Controller
{
private readonly IBlobStorageService _blobStorageService;
public BlobStorageController(IBlobStorageService blobStorageService)
{
_blobStorageService = blobStorageService;
}
[HttpGet]
public async Task<IActionResult> Index()
{
var fileNames = await _blobStorageService.GetAllFileNamesAsync();
return View(fileNames);
}
[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile file)
{
if (file != null && file.Length > 0)
{
await _blobStorageService.UploadFileAsync(file, file.FileName);
}
return RedirectToAction(nameof(Index));
}
[HttpPost]
public async Task<IActionResult> DeleteFile(string fileName)
{
await _blobStorageService.DeleteFileAsync(fileName);
return RedirectToAction(nameof(Index));
}
public async Task<IActionResult> DownloadFile(string fileName)
{
var fileBytes = await _blobStorageService.DownloadFileAsync(fileName);
return File(fileBytes, "application/octet-stream", fileName);
}
}
뷰 페이지에서는 다음과 같은 코드를 테스트할 수 있습니다.
@model IEnumerable<string>
<h1>Files in Blob Storage</h1>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file" required />
<button type="submit">Upload</button>
</form>
<table>
<thead>
<tr>
<th>File Name</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach (var fileName in Model)
{
<tr>
<td>@fileName</td>
<td>
<a href="@Url.Action("DownloadFile", "BlobStorage", new { fileName })">Download</a>
<form method="post" onsubmit="return confirm('Are you sure you want to delete this file?')">
<input type="hidden" name="fileName" value="@fileName" />
<button type="submit">Delete</button>
</form>
</td>
</tr>
}
</tbody>
</table>
Blazor Server에서 Azure Blob Storage에 파일 업로드
Blazor Server에서 Azure Blob Storage에 파일을 업로드하는 절차는 크게 다음과 같은 단계를 거칩니다.
- Azure Blob Storage 계정 만들기
- Blazor Server 프로젝트에 필요한 NuGet 패키지 설치
- Azure Blob Storage 연결 문자열 가져오기
- Azure Blob Storage 클라이언트 초기화
- 파일 업로드 폼 만들기
- 파일 업로드 처리기 만들기
자세한 설명을 아래에서 확인해보세요.
1. Azure Blob Storage 계정 만들기
Azure Portal에 로그인하고 새로 만들기 버튼을 클릭하여 Storage Account를 만듭니다.
Resource group을 선택하고 Storage account 이름을 지정합니다. 필수 특성에서
BlobStorage
를 선택합니다.가격 책정 계층 및 기타 옵션을 선택합니다.
"배포 검토 + 만들기" 버튼을 클릭하여 Storage Account를 만듭니다.
2. Blob Container 만들기
Storage account를 선택하고
Blob containers
를 선택합니다.-
- Container 버튼을 클릭합니다.
Container 이름을 입력합니다. 대소문자를 구분하는 이름을 지정합니다.
Public access level
을Blob
으로 선택합니다.
3. NuGet 패키지 설치
프로젝트에 다음 패키지를 추가합니다.
Azure.Storage.Blobs
Microsoft.Extensions.Azure
추가한 패키지들이 충분히 설치되었는지 확인합니다.
4. Azure Blob Storage 연결 문자열 가져오기
Azure Portal에서 만든 Storage Account를 선택합니다.
왼쪽 메뉴에서 Access keys 를 선택합니다.
key1
의 값을 복사하여 연결 문자열을 가져옵니다.
5. Azure Blob Storage 서비스 등록하기
프로그램 시작 시 (예:
Program.cs
) Azure Blob Storage 서비스를 등록합니다.using Azure.Storage.Blobs; using Microsoft.Extensions.DependencyInjection; var builder = WebApplication.CreateBuilder(args); builder.Services.AddSingleton(x => new BlobServiceClient(Configuration["BlobStorageConnectionString"])); var app = builder.Build();
Blazor Server 컴포넌트에서 업로드 테스트
Azure Blob Storage에 파일을 업로드하는 절차를 마쳤다면, 이제는 Blazor Server의 Razor Component에서 파일 업로드를 구현해 보도록 하겠습니다.
- Razor Component에서 파일 선택 창 만들기
Razor Component에서는 브라우저의 파일 선택 창을 만들어서 사용자가 파일을 선택할 수 있도록 합니다. 이를 위해서 Blazor Server에서는 InputFile 컴포넌트를 제공합니다.
@page "/upload"
@using System.IO
@using Microsoft.AspNetCore.Components.Forms
@inject IFileUploadService UploadService
<h3>파일 업로드</h3>
<InputFile OnChange="OnFileSelect"></InputFile>
<button @onclick="UploadFile">파일 업로드</button>
@if (IsUploading)
{
<p>파일 업로드 중...</p>
}
@if (IsUploaded)
{
<p>파일 업로드 완료!</p>
}
- 선택한 파일을 메모리에 읽기
파일 선택 창에서 파일을 선택하면 InputFile 컴포넌트는 OnChanged 이벤트를 발생시킵니다. 이 이벤트를 핸들러 함수인 OnFileSelect에서 처리합니다. 여기서는 파일 선택 창에서 선택된 파일을 메모리에 읽어들입니다.
private async Task OnFileSelect(InputFileChangeEventArgs e)
{
IsUploading = false;
IsUploaded = false;
var file = e.File;
if (file != null)
{
var stream = file.OpenReadStream();
var buffer = new byte[file.Size];
await stream.ReadAsync(buffer, 0, (int)file.Size);
SelectedFile = buffer;
}
}
- 메모리에 있는 파일을 Azure Blob Storage에 업로드하기
OnFileSelect에서 선택한 파일을 메모리에 읽어들인 후, UploadFile 함수에서 이를 Azure Blob Storage에 업로드합니다.
private async Task UploadFile()
{
IsUploading = true;
if (SelectedFile != null && SelectedFile.Length > 0)
{
await UploadService.UploadAsync(ContainerName, BlobName, SelectedFile);
IsUploading = false;
IsUploaded = true;
}
}
- 파일 업로드 완료 여부 표시하기
파일 업로드 요청 후, 브라우저에서 서버로의 응답을 기다리는 동안 UI를 차단하지 않도록, Blazor에서 제공하는 Task 및 async/await 패턴을 사용하여 파일 업로드를 비동기적으로 처리합니다.
InputFile 컴포넌트를 사용하여 파일을 업로드하면, IFileListEntry 객체로 나타납니다. 이 객체에는 파일 이름, 크기 및 스트림을 읽기 위한 메서드가 포함되어 있습니다.
UploadFile 메서드가 호출될 때, IFileListEntry 객체에서 스트림을 읽고, BlobClient를 사용하여 Blob Storage에 업로드합니다. 파일 업로드가 완료되면, UploadCompleted 속성을 true로 설정하여 UI에서 파일 업로드가 완료되었음을 표시합니다.
@using Azure.Storage.Blobs
@inject IConfiguration Configuration
<h3>파일 업로드</h3>
<EditForm Model="@uploadModel" OnValidSubmit="@UploadFile">
<DataAnnotationsValidator />
<ValidationSummary />
<div class="form-group">
<label for="fileInput">파일 선택</label>
<InputFile class="form-control-file" id="fileInput" OnChange="@HandleFileSelection" />
</div>
<button type="submit" class="btn btn-primary">업로드</button>
</EditForm>
@if (uploadCompleted)
{
<p>파일 업로드가 완료되었습니다.</p>
}
private async Task UploadFile()
{
var connectionString = Configuration.GetConnectionString("BlobStorageConnectionString");
var blobServiceClient = new BlobServiceClient(connectionString);
var containerClient = blobServiceClient.GetBlobContainerClient("test-container");
var blobClient = containerClient.GetBlobClient(uploadModel.FileName);
using var stream = uploadModel.File.OpenReadStream();
await blobClient.UploadAsync(stream);
uploadCompleted = true;
}
Blazor Server는 SignalR을 사용하여 UI 업데이트를 처리합니다. UploadCompleted 속성이 변경되면, Blazor Server에서 자동으로 UI를 업데이트합니다.따라서 파일 업로드가 완료되면, UI에서 파일 업로드가 완료되었음을 표시합니다.
ASP.NET Core와 Azure Blob Storage를 활용한 파일 업로드 및 다운로드 가이드
이 가이드에서는 ASP.NET Core와 Azure Blob Storage를 이용하여 파일을 업로드하고 다운로드하는 방법에 대해 자세히 설명합니다. Azure Blob Storage는 대규모 데이터를 저장하고 관리할 수 있는 클라우드 기반 스토리지 서비스입니다. ASP.NET Core는 이러한 서비스와의 통합을 지원하며, 사용자가 효율적으로 파일을 관리할 수 있게 해줍니다.
필수 구성 요소
- Azure 계정 및 Blob Storage 계정
- ASP.NET Core 3.1 이상
- Azure.Storage.Blobs NuGet 패키지
Azure Blob Storage 설정
- Azure Portal에서 Blob Storage 계정을 생성합니다.
- 생성된 계정에 대한 연결 문자열을 찾아 복사합니다. 이 문자열은 ASP.NET Core 애플리케이션에서 Azure Blob Storage에 연결하는 데 사용됩니다.
ASP.NET Core 프로젝트 설정
Azure.Storage.Blobs
NuGet 패키지를 설치합니다.appsettings.json
파일에 Azure Blob Storage 계정의 연결 정보를 추가합니다.{ "AppKeys": { "AzureStorageAccount": "YOUR_STORAGE_ACCOUNT_NAME", "AzureStorageAccessKey": "YOUR_STORAGE_ACCESS_KEY" } }
파일 업로드 및 다운로드 컨트롤러 구현
전체 소스 코드: FileUploadController.cs
using Azure.Storage.Blobs;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System.IO;
using System.Threading.Tasks;
namespace VisualAcademy.Codes;
[ApiController]
[Route("[controller]")]
public class FileUploadController(
IWebHostEnvironment environment,
IConfiguration configuration) : ControllerBase
{
private readonly string _containerName = "files";
[HttpGet("uploadfiles")]
public async Task<IActionResult> UploadFiles()
{
var localPath = Path.Combine(environment.WebRootPath, "files");
await UploadFilesToBlobAsync(localPath);
return Ok("Files uploaded successfully.");
}
[HttpGet("downloadfiles")]
public async Task<IActionResult> DownloadFiles()
{
var localPath = Path.Combine(environment.WebRootPath, "files");
await DownloadFilesFromBlobAsync(localPath);
return Ok("Files downloaded successfully.");
}
private async Task UploadFilesToBlobAsync(string localPath)
{
var connectionString = $"DefaultEndpointsProtocol=https;AccountName=" +
$"{configuration["AppKeys:AzureStorageAccount"]};AccountKey=" +
$"{configuration["AppKeys:AzureStorageAccessKey"]};" +
$"EndpointSuffix=core.windows.net";
var blobServiceClient = new BlobServiceClient(connectionString);
var containerClient = blobServiceClient.GetBlobContainerClient(_containerName);
await containerClient.CreateIfNotExistsAsync();
foreach (var filePath in Directory.GetFiles(localPath, "*", SearchOption.AllDirectories))
{
var relativePath = Path.GetRelativePath(localPath, filePath);
var blobClient = containerClient.GetBlobClient(relativePath);
if (await blobClient.ExistsAsync()) // 동일한 파일이 존재하면 건너뜀
continue;
using var fileStream = System.IO.File.OpenRead(filePath);
await blobClient.UploadAsync(fileStream, overwrite: false);
}
}
private async Task DownloadFilesFromBlobAsync(string localPath)
{
var connectionString = $"DefaultEndpointsProtocol=https;AccountName=" +
$"{configuration["AppKeys:AzureStorageAccount"]};AccountKey=" +
$"{configuration["AppKeys:AzureStorageAccessKey"]};" +
$"EndpointSuffix=core.windows.net";
var blobServiceClient = new BlobServiceClient(connectionString);
var containerClient = blobServiceClient.GetBlobContainerClient(_containerName);
await foreach (var blobItem in containerClient.GetBlobsAsync())
{
var blobClient = containerClient.GetBlobClient(blobItem.Name);
var downloadPath = Path.Combine(localPath, blobItem.Name);
// 해당 디렉터리 생성
var directoryName = Path.GetDirectoryName(downloadPath);
if (directoryName == null)
{
throw new InvalidOperationException("The directory name cannot be null.");
}
if (!Directory.Exists(directoryName))
{
Directory.CreateDirectory(directoryName);
}
if (System.IO.File.Exists(downloadPath)) // 로컬에 이미 동일한 파일이 존재하면 건너뜀
continue;
// 파일 다운로드
var response = await blobClient.DownloadAsync();
using (var fileStream = System.IO.File.Create(downloadPath))
{
await response.Value.Content.CopyToAsync(fileStream);
}
}
}
}
FileUploadController
클래스를 사용하여 파일 업로드 및 다운로드 기능을 구현합니다.
1. 파일 업로드 기능
UploadFiles
메서드는 지정된 로컬 경로에서 파일을 읽어 Azure Blob Storage로 업로드합니다.
[HttpGet("uploadfiles")]
public async Task<IActionResult> UploadFiles()
{
var localPath = Path.Combine(environment.WebRootPath, "files");
await UploadFilesToBlobAsync(localPath);
return Ok("Files uploaded successfully.");
}
private async Task UploadFilesToBlobAsync(string localPath)
{
// ... [코드 내용] ...
}
업로드 과정
- Blob Storage 클라이언트를 초기화합니다.
- 지정된 로컬 디렉터리에서 파일을 읽습니다.
- 각 파일을 Blob Storage에 업로드합니다.
2. 파일 다운로드 기능
DownloadFiles
메서드는 Azure Blob Storage에서 파일을 다운로드하여 지정된 로컬 경로에 저장합니다.
[HttpGet("downloadfiles")]
public async Task<IActionResult> DownloadFiles()
{
var localPath = Path.Combine(environment.WebRootPath, "files");
await DownloadFilesFromBlobAsync(localPath);
return Ok("Files downloaded successfully.");
}
private async Task DownloadFilesFromBlobAsync(string localPath)
{
// ... [코드 내용] ...
}
다운로드 과정
- Blob Storage 클라이언트를 초기화합니다.
- Blob Storage에서 파일 목록을 가져옵니다.
- 각 파일을 로컬 경로로 다운로드합니다.
예외 처리 및 안정성
- 널 참조 및 파일 충돌을 관리합니다.
- 적절한 예외 처리를 통해 안정성을 강화합니다.
결론
ASP.NET Core와 Azure Blob Storage를 활용하면 대용량 파일 처리 및 관리를 효율적으로 수행할 수 있습니다. 이 가이드를 통해 기본적인 업로드 및 다운로드 기능 구현 방법을 이해하고, 이를 기반으로 더 복잡한 시나리오에 대응할 수 있습니다.