
그럼 위 내용을 바탕으로 **“.NET MVC5에서 OneDrive API로 파일 업로드 구현하기”**라는 주제로 블로그 형식으로 정리해드리겠습니다.
아래 글은 단계별 설명, 코드, 이미지 삽입 위치 안내까지 포함하여 작성했습니다.
.NET MVC5에서 OneDrive API로 파일 업로드 구현하기
Microsoft OneDrive는 단순한 클라우드 저장소를 넘어, API를 통해 다양한 자동화와 서비스 연계가 가능한 플랫폼입니다. 이번 글에서는 .NET MVC5 프로젝트에서 Microsoft Graph API를 활용해 OneDrive에 파일을 업로드하는 기능을 구현하는 방법을 단계별로 설명합니다.
1. 전체 흐름
이번 구현은 다음 흐름으로 진행됩니다.
- Azure AD 앱 등록 → Microsoft Graph API 사용 권한 부여
- OAuth 2.0 인증 → Access Token 발급
- MVC5에서 파일 업로드 UI 구현
- Microsoft Graph API 호출 → OneDrive에 저장
2. 사전 준비 – Azure AD 앱 등록
OneDrive API를 사용하려면 먼저 **Azure Active Directory(Azure AD)**에서 애플리케이션을 등록해야 합니다.
Azure Portal에 접속 → Azure Active Directory
앱 등록 → 새 등록 클릭
- 이름: MyOneDriveUploader
- 지원되는 계정 유형: "모든 조직 디렉터리 및 개인 Microsoft 계정"
- 리디렉션 URI:
https://localhost:44300/onedrive/callback(MVC5 프로젝트 주소 기준)
등록 완료 후 애플리케이션(클라이언트) ID, 디렉터리(테넌트) ID 메모
인증서 및 비밀 → 새 클라이언트 비밀 생성 후 값 메모
API 권한 → Microsoft Graph → Files.ReadWrite,
offline_access권한 추가 후 "관리자 동의" 클릭
📌 이 과정이 끝나야 API 호출이 정상적으로 동작합니다.
3. MVC5 프로젝트 구성
3-1. NuGet 패키지 설치
Install-Package Microsoft.Identity.Client
Install-Package Newtonsoft.Json
3-2. 컨트롤러 구현 – OneDriveController.cs
using Microsoft.Identity.Client;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
namespace MyMvcApp.Controllers
{
public class OneDriveController : Controller
{
// Azure 앱 등록 값
private const string clientId = "클라이언트ID";
private const string tenantId = "테넌트ID";
private const string clientSecret = "클라이언트비밀";
private const string redirectUri = "https://localhost:44300/onedrive/callback";
private const string scope = "offline_access Files.ReadWrite";
public ActionResult Index()
{
return View();
}
public ActionResult Login()
{
var url = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize" +
$"?client_id={clientId}" +
$"&response_type=code" +
$"&redirect_uri={HttpUtility.UrlEncode(redirectUri)}" +
$"&response_mode=query" +
$"&scope={HttpUtility.UrlEncode(scope)}";
return Redirect(url);
}
public async Task<ActionResult> Callback(string code)
{
if (string.IsNullOrEmpty(code))
return Content("인증 코드가 없습니다.");
var token = await GetTokenAsync(code);
Session["AccessToken"] = token;
return RedirectToAction("Upload");
}
public ActionResult Upload()
{
return View();
}
[HttpPost]
public async Task<ActionResult> Upload(HttpPostedFileBase file)
{
if (file != null && file.ContentLength > 0)
{
var token = Session["AccessToken"]?.ToString();
if (string.IsNullOrEmpty(token))
return RedirectToAction("Login");
var uploadResult = await UploadFileToOneDrive(file, token);
return Content(uploadResult);
}
return Content("파일이 없습니다.");
}
private async Task<string> GetTokenAsync(string code)
{
using (var client = new HttpClient())
{
var values = new[]
{
new KeyValuePair<string,string>("client_id", clientId),
new KeyValuePair<string,string>("scope", scope),
new KeyValuePair<string,string>("code", code),
new KeyValuePair<string,string>("redirect_uri", redirectUri),
new KeyValuePair<string,string>("grant_type", "authorization_code"),
new KeyValuePair<string,string>("client_secret", clientSecret),
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync($"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token", content);
var json = await response.Content.ReadAsStringAsync();
var obj = JObject.Parse(json);
return obj["access_token"]?.ToString();
}
}
private async Task<string> UploadFileToOneDrive(HttpPostedFileBase file, string accessToken)
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var fileName = Path.GetFileName(file.FileName);
var url = $"https://graph.microsoft.com/v1.0/me/drive/root:/{fileName}:/content";
using (var stream = file.InputStream)
{
var content = new StreamContent(stream);
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
var response = await client.PutAsync(url, content);
return await response.Content.ReadAsStringAsync();
}
}
}
}
}
3-3. 뷰 구성
Index.cshtml
@{
ViewBag.Title = "OneDrive 업로드";
}
<h2>OneDrive 로그인</h2>
<a href="@Url.Action("Login", "OneDrive")">로그인 및 업로드 시작</a>
Upload.cshtml
@{
ViewBag.Title = "파일 업로드";
}
<h2>OneDrive로 파일 업로드</h2>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">업로드</button>
</form>
4. 동작 시나리오
/OneDrive/Index페이지 접속 → 로그인 버튼 클릭- Microsoft 로그인 페이지로 이동 → 권한 허용
- Callback 액션에서 인증 코드 → Access Token 발급
/Upload페이지에서 파일 업로드 시 OneDrive API 호출- 업로드된 파일은 OneDrive 루트 폴더에 저장됨
5. 응용 및 확장
- 자동 백업: 사용자 로그인 없이 서버 스케줄러(Cron, Windows Task)에서 업로드
- 폴더 지정 업로드:
/me/drive/root:/BackupFolder/파일명:/content형태로 경로 변경 - 대용량 파일 업로드: Microsoft Graph의 Chunked Upload API 사용
6. 마무리
이번 글에서는 MVC5 환경에서 Microsoft Graph API를 이용해 OneDrive로 파일 업로드하는 방법을 살펴보았습니다.
이 방식을 사용하면 단순한 사용자 파일 업로드뿐 아니라, ERP, 백업 시스템, 데이터 분석 결과 저장 등 다양한 업무 자동화에 OneDrive를 활용할 수 있습니다.
'WEB - PHP, JQuery, Bootstrap' 카테고리의 다른 글
| CodeIgniter 4 + Shield 설치부터 Cafe24 웹호스팅 배포 (1) | 2025.10.07 |
|---|---|
| 가독성 높은 JavaScript Array 순회 방법 TOP 4 (2) | 2024.11.11 |
| JavaScript 정밀 연산 라이브러리 TOP 4: big.js, bignumber.js, decimal.js, math.js (5) | 2024.09.24 |
| JavaScript에서 부동소수점 연산 오류 해결 방법 (decimal.js) (2) | 2024.09.23 |
| .NET Core에서 MemoryCache를 활용한 Backend 캐시 구현 가이드 (2) | 2024.09.13 |