개발새발

C# Blob 파일 업로드와 다운로드, 파일 삭제 코드 구현 본문

개발/Back

C# Blob 파일 업로드와 다운로드, 파일 삭제 코드 구현

allkites 2024. 4. 18. 12:30

 

Blob에 파일 업로드, 다운로드, 파일 삭제하는 코드입니다.

Type은 Blob Containers에서도 특정 Blob에 접근하기 위해 사용한 식별자로 생략가능합니다. 

 

1. BlobStorageConnection의 경우 appsettings.json에 blob connection을 작성

2. BlobRepository 별도의 레파지토리를 만들어서 작성해서 startup.cs에 등록

3. 코드

using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using System;
using System.IO;
using System.Threading.Tasks;
using Azure;

namespace Site.BlobRepository
{
    public interface IBlobRepository
    {
        Task<string> UploadBlob(IFormFile file, string type);
        Task<Stream> DownloadBlob(string file, string type);
        Task<bool> DeleteBlob(string file, string type);
    }
    public class BlobRepository : IBlobRepository
    {
        private readonly BlobServiceClient _blob;

        public BlobRepository(IConfiguration configuration)
        {
            _blob = new BlobServiceClient(configuration.GetConnectionString("BlobStorageConnection"));
        }
        public async Task<string> UploadBlob(IFormFile file, string type)
        {
            BlobContainerClient containerClient = _blob.GetBlobContainerClient(type);
            string blobName = $"{blob 내 파일명 있을 경우 작성, 없으면 생략}/{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
            string blobPath = $"{blobName}";
            BlobClient blobClient = containerClient.GetBlobClient(blobPath);

            using (Stream stream = file.OpenReadStream())
            {
                await blobClient.UploadAsync(stream, new BlobUploadOptions
                {
                    HttpHeaders = new BlobHttpHeaders { ContentType = file.ContentType }
                });
            }

            return blobClient.Uri.ToString();
        }


        public async Task<Stream> DownloadBlob(string file, string type)
        {
            string blobPath = $"{Path.GetFileName(file)}";

            BlobContainerClient containerClient = _blob.GetBlobContainerClient(type);
            BlobClient blobClient = containerClient.GetBlobClient(blobPath);

            BlobDownloadInfo blobDownloadInfo = await blobClient.DownloadAsync();
            return blobDownloadInfo.Content;
        }


        public async Task<bool> DeleteBlob(string file, string type)
        {
            try
            {
                string blobPath = $"{Path.GetFileName(file)}";
                BlobContainerClient containerClient = _blob.GetBlobContainerClient(type);
                BlobClient blobClient = containerClient.GetBlobClient(blobPath);

                await blobClient.DeleteAsync();
                return true;
            }
            catch (RequestFailedException)
            {
                return false;
            }
        }
    }
}
Comments