ASP.NET Core와 Azure Blob Storage를 활용한 파일 업로드 및 다운로드 가이드
추천 자료: ASP.NET Core 인증 및 권한 부여
이 가이드에서는 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를 활용하면 대용량 파일 처리 및 관리를 효율적으로 수행할 수 있습니다. 이 가이드를 통해 기본적인 업로드 및 다운로드 기능 구현 방법을 이해하고, 이를 기반으로 더 복잡한 시나리오에 대응할 수 있습니다.
추천 자료: .NET Blazor에 대해 알아보시겠어요? .NET Blazor 알아보기를 확인해보세요!