Visual C# .NET을 사용하여 ASP.NET에서 웹 서버에 파일을 업로드하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 323246 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 Visual C# .NET을 사용하여 웹 서버에 파일을 업로드하는 방법을 단계별로 설명합니다. 이 문서에서는 Microsoft ASP.NET 파일(WebForm1.aspx) 및 해당 관련 코드 숨김 파일(WebForm1.aspx.cs)을 만들어서 Data라는 디렉터리에 파일을 업로드합니다.


ASP.NET 응용 프로그램 만들기

Microsoft Visual Studio .NET에서 새 응용 프로그램을 만들어 웹 서버에 파일을 업로드하려면 다음과 같이 하십시오.
  1. Microsoft Visual Studio .NET을 시작합니다.
  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.
  3. 새 프로젝트 대화 상자의 프로젝트 형식에서 Visual C# 프로젝트를 누른 다음 템플릿에서 ASP.NET 웹 응용 프로그램을 누릅니다.
  4. 위치 상자에 URL을 입력하여 프로젝트를 만듭니다. 이 예에서 http://localhost/CSharpUpload를 입력하면 CSharpUpload라는 기본 프로젝트 이름이 만들어집니다. WebForm1.aspx 파일은 Visual Studio .NET의 디자이너 보기에 로드됩니다.

Data 디렉터리 만들기

응용 프로그램을 만든 후에는 업로드한 파일을 저장할 Data 디렉터리를 만듭니다. 또한 이 디렉터리를 만든 후에 ASPNET 작업자 계정에 대한 쓰기 권한을 설정해야 합니다.
  1. Visual Studio .NET의 솔루션 탐색기 창에서 CSharpUpload를 마우스 오른쪽 단추로 누르고 추가를 누른 다음 새 폴더를 누릅니다. 기본적으로 NewFolder1이라는 이름의 폴더가 새로 만들어집니다.
  2. 폴더 이름을 Data로 바꾸려면 NewFolder1을 마우스 오른쪽 단추로 누르고 이름 바꾸기를 누른 다음 Data를 입력합니다.
  3. Windows 탐색기를 시작한 다음 2단계에서 만든 Data 파일 시스템 폴더를 찾습니다. 기본적으로 이 폴더는 아래 폴더에 있습니다.
    C:\Inetpub\wwwroot\CSharpUpload\Data
  4. 보안 설정을 변경하여 Data 디렉터리에 대한 쓰기 권한을 부여하려면 Data를 마우스 오른쪽 단추로 누른 다음 속성을 누릅니다.
  5. Data 등록 정보 대화 상자에서 보안 탭을 누른 다음 추가를 누릅니다.
  6. 사용자 또는 그룹을(를) 선택하십시오. 대화 상자에서 ASPNET 계정을 누른 다음 추가를 누릅니다. 확인을 눌러 사용자 또는 그룹을(를) 선택하십시오. 대화 상자를 닫습니다.
  7. aspnet_wp account(computername\ASPNET) 계정을 클릭한 후 다음 사용 권한에 대해 허용 확인란을 선택합니다.

    • 읽기 및 실행
    • 폴더 내용 보기
    • 읽기
    • Write

    그 밖의 다른 허용 확인란과 거부 확인란의 선택은 모두 취소합니다.
  8. 확인을 눌러 Data 등록 정보 대화 상자를 닫습니다. Data 디렉터리 사용 권한이 성공적으로 수정되어 사용자가 업로드한 파일이 저장됩니다.

WebForm1.aspx 페이지 수정

사용자가 파일을 업로드할 수 있도록 WebForm1.aspx 파일의 HTML 코드를 수정하려면 다음과 같이 하십시오.
  1. 앞에서 연 Visual Studio .NET의 인스턴스로 돌아옵니다. WebForm1.aspx가 디자이너 창에서 열립니다.
  2. WebForm1.aspx 페이지의 HTML 소스를 보려면 디자이너 창에서 WebForm1.aspx를 마우스 오른쪽 단추로 누른 다음 HTML 소스 보기를 누릅니다.
  3. <form> 태그가 포함되어 있는 다음 HTML 코드를 찾습니다.
    <form id="Form1" method="post" runat="server">
    					
  4. 다음과 같이 <form> 태그에 enctype="multipart/form-data" 이름-값 특성을 추가합니다.
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server">
    					
  5. 여는 <form> 태그 뒤에 다음 코드를 추가합니다.
    <INPUT type=file id=File1 name=File1 runat="server" />
    <br>
    <input type="submit" id="Submit1" value="Upload" runat="server" />
    					
  6. <form> 태그가 아래와 같은지 확인합니다.
    <form id="Form1" method="post" enctype="multipart/form-data" runat="server">
    <INPUT type=file id=File1 name=File1 runat="server" />
    <br>
    <input type="submit" id="Submit1" value="Upload" runat="server" />
    </form>
    					

WebForm1.aspx.cs 코드 숨김 파일에 업로드 코드 추가

업로드한 데이터를 받아들이도록 WebForm1.aspx.cs 코드 숨김 파일을 수정하려면 다음과 같이 하십시오.
  1. 보기 메뉴에서 디자인을 누릅니다.
  2. Upload를 두 번 누릅니다. Visual Studio가 WebForm1.aspx.cs 코드 숨김 파일을 열고 자동으로 다음과 같은 메서드 코드를 생성합니다.
    private void Submit1_ServerClick(object sender, System.EventArgs e)
    {
    
    
    }
  3. WebForm1.cs 파일의 클래스 수준에 다음과 같은 코드가 있는지 확인합니다.
    protected System.Web.UI.HtmlControls.HtmlInputFile File1;
    protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
    						
    이 코드가 파일에 없으면 다음 줄 뒤에 코드를 추가합니다.
    public class WebForm1 : System.Web.UI.Page
    {
    					
  4. 다음 코드를 찾습니다.
    private void Submit1_ServerClick(object sender, System.EventArgs e)
    {
    					
  5. Enter 키를 눌러 빈 줄을 삽입한 후 다음 코드를 추가합니다.
    if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
    {
    	string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
    	string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
    	try
    	{
    		File1.PostedFile.SaveAs(SaveLocation);
    		Response.Write("The file has been uploaded.");
    	}
    	catch(Exception ex)
    	{
    		Response.Write("Error: " + ex.Message);
    		// 참고: Exception.Message는 현재 예외를 설명하는 상세 메시지를 반환합니다. 
    		//보안상 프로덕션 환경에서 최종 사용자에게 Exception.Message를 반환하지 않는 것이 
    		//좋습니다. 일반적인 오류 메시지를 넣을 것을 권장합니다. 
    	}
    }
    else
    {
    	Response.Write("Please select a file to upload.");
    }
    이 코드는 먼저 파일이 업로드되었는지 확인합니다. 파일을 선택하지 않은 경우에는 "Please select a file to upload." 메시지가 나타납니다. 올바른 파일을 업로드한 경우에는 System.IO 네임스페이스를 사용하여 파일 이름이 추출되고 대상이 SaveAs 경로에서 어셈블됩니다. 최종 대상을 알게 되면 File1.PostedFile.SaveAs 메서드를 사용하여 파일이 저장됩니다. 예외가 트래핑되면 예외 메시지가 화면에 표시됩니다.
  6. Submit1 서브루틴이 다음과 같이 표시되는지 확인합니다.
    private void Submit1_ServerClick(object sender, System.EventArgs e)
    {
    	if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
    	{
    		string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
    		string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
    		try
    		{
    			File1.PostedFile.SaveAs(SaveLocation);
    			Response.Write("The file has been uploaded.");
    		}
    		catch(Exception ex)
    		{
    			Response.Write("Error: " + ex.Message);
    			// 참고: Exception.Message는 현재 예외를 설명하는 상세 메시지를 반환합니다. 
    			//보안상 프로덕션 환경에서 최종 사용자에게 Exception.Message를 반환하지 않는 것이 
    			//좋습니다. 일반적인 오류 메시지를 넣을 것을 권장합니다. 
    		}
    	}
    	else
    	{
    		Response.Write("Please select a file to upload.");
    	}
    }

응용 프로그램 테스트

Visual Studio .NET 솔루션을 빌드하고 응용 프로그램을 테스트하려면 다음과 같이 하십시오.
  1. 빌드 메뉴에서 솔루션 빌드를 누릅니다.
  2. 솔루션 탐색기 창에서 WebForm1.aspx를 마우스 오른쪽 단추로 누른 다음 브라우저에서 보기를 누릅니다.
  3. WebForm1.aspx가 브라우저에서 열리면 찾아보기를 누릅니다.
  4. 파일 선택 대화 상자에서 크기가 4MB보다 작은 파일을 선택한 다음 열기를 누릅니다.
  5. 파일을 업로드하려면 Upload를 누릅니다. 파일이 웹 서버에 업로드되고 "The file has been uploaded." 메시지가 나타납니다.
  6. 열려 있는 Windows 탐색기의 인스턴스로 돌아와서 Data 디렉터리를 찾습니다.
  7. 파일이 Data 디렉터리에 업로드되었는지 확인합니다.

큰 파일 업로드

기본적으로 ASP.NET에서는 크기가 4,096KB(또는 4MB) 이하인 파일만 웹 서버에 업로드할 수 있습니다. 이보다 큰 파일을 업로드하려면 Web.config 파일에서 <httpRuntime> 섹션의 maxRequestLength 매개 변수를 변경해야 합니다.

참고 maxRequestLength 특성이 Machine.config 파일에 설정되어 있는 경우 maxRequestLength 값을 초과하는 요청이 게시되면(예: 파일 업로드) 사용자 지정 오류 페이지를 표시할 수 없습니다. 대신, Microsoft Internet Explorer에서 "서버를 찾을 수 없거나 DNS 오류입니다." 오류 메시지를 표시합니다.

이 ASP.NET 응용 프로그램뿐만 아니라 모든 컴퓨터에 대해 이 설정을 변경하려면 Machine.config 파일을 수정해야 합니다.

기본적으로 <httpRuntime> 요소는 Machine.config 파일에서 다음과 같은 매개 변수로 설정되어 있습니다.
<httpRuntime 
executionTimeout="90" 
maxRequestLength="4096"
useFullyQualifiedRedirectUrl="false" 
minFreeThreads="8" 
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100"
/>
				
The Machine.config 파일은 \System Root\Microsoft.NET\Framework\Version Number\CONFIG 디렉터리에 있습니다.


전체 코드 예제

WebForm1.aspx

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="CSharpUpload.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
  <HEAD>
    <title>WebForm1</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name=vs_defaultClientScript content="JavaScript">
    <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">
  </HEAD>
  <body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" enctype="multipart/form-data" runat="server">
<INPUT type=file id=File1 name=File1 runat="server" >
<br>
<input type="submit" id="Submit1" value="Upload" runat="server" NAME="Submit1">
</form>

	
  </body>
</HTML>
				

WebForm1.aspx.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace CSharpUpload
{
	/// <요약>
	/// WebForm1의 요약 설명입니다.
	/// </summary>
	public class WebForm1 : System.Web.UI.Page
	{
		protected System.Web.UI.HtmlControls.HtmlInputFile File1;
		protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
	
		private void Page_Load(object sender, System.EventArgs e)
		{
			// 여기에 페이지를 초기화하는 사용자 코드를 넣습니다.
		}

		#region Web Form Designer generated code
		override protected void OnInit(EventArgs e)
		{
			// 
			// CODEGEN: 이 호출은 ASP.NET Web Form Designer에서 필요로 합니다.
			// 
			InitializeComponent();
			base.OnInit(e);
		}
		
		/// <요약>
		/// Designer를 지원하기 위해 필요한 메서드입니다. 수정하지 마십시오.
		/// 코드 편집기를 사용한 이 메서드의 내용입니다.
		/// </summary>
		private void InitializeComponent()
		{    
			this.Submit1.ServerClick += new System.EventHandler(this.Submit1_ServerClick);
			this.Load += new System.EventHandler(this.Page_Load);

		}
		#endregion

		private void Submit1_ServerClick(object sender, System.EventArgs e)
		{
			if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
			{
				string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
				string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
				try
				{
					File1.PostedFile.SaveAs(SaveLocation);
					Response.Write("The file has been uploaded.");
				}
				catch(Exception ex)
				{
					Response.Write("Error: " + ex.Message);
					// 참고: Exception.Message는 현재 예외를 설명하는 상세 메시지를 반환합니다. 
					//보안상 프로덕션 환경에서 최종 사용자에게 Exception.Message를 반환하지 않는 것이 
					//좋습니다. 일반적인 오류 메시지를 넣을 것을 권장합니다. 
				}
			}
			else
			{
				Response.Write("Please select a file to upload.");
			}
		}
	}
}
	

추가 정보

이론적으로 최대 파일 업로드 크기는 상당히 크지만 ASP.NET에서는 ASP.NET 상태 모니터링 때문에 매우 큰 파일을 업로드할 수 없습니다. ASP.NET 작업자 프로세스에는 2GB의 가상 주소 공간이 있지만 ASP.NET 작업자 프로세스는 상태 모니터링과 메모리 조각화 때문에 1GB가 조금 넘는 공간만 사용합니다.

업로드 프로세스 중 ASP.NET은 사용자가 디스크에 파일을 저장할 수 있도록 메모리에 전체 파일을 로드합니다. 따라서 Machine.config 파일에 있는 processModel 태그의 memoryLimit 특성 때문에 작업자 프로세스가 재활용될 수 있습니다. memoryLimit 특성은 ASP.NET 작업자 프로세스가 자동으로 재활용될 때까지 소모할 수 있는 실제 메모리의 비율을 지정합니다. 재활용을 하면 메모리 누수로 인해 ASP.NET이 작동을 멈추거나 응답하지 않는 현상이 방지됩니다.

또한 업로드할 수 있는 최대 파일 크기에 영향을 미치는 다른 요소도 있습니다. 이러한 요소에는 사용 가능한 메모리, 사용 가능한 하드 디스크 공간, 프로세서 속도 및 현재 네트워크 트래픽이 있습니다. 업로드되는 파일의 일반적인 트래픽을 고려할 때 10~20MB 범위의 최대 파일 크기를 사용하는 것이 좋습니다. 파일을 드물게 업로드하는 경우 최대 파일 크기는 100MB가 될 수 있습니다.

참고 ASP.NET에서 100MB보다 큰 파일도 업로드할 수 있지만 이 문서에서 설명하는 최대 파일 업로드 크기를 따르는 것이 좋습니다. 더욱 정확한 파일 크기를 결정하려면 프로덕션 환경에서 사용할 컴퓨터와 비슷한 컴퓨터에서 스트레스 테스트를 수행하십시오.

파일 업로드 프로세스 중 파일 크기 한도에 도달하면 다음과 같은 오류 메시지가 나타날 수 있습니다.
  • 페이지를 표시할 수 없습니다.
  • 서버 응용 프로그램을 사용할 수 없습니다.
    이벤트 로그에 기록되는 오류 메시지는 다음과 유사합니다.

    메모리 소비가 SizeLimitMB(사용 가능한 RAM의 Percentage%)를 초과하여 aspnet_wp.exe(PID:PIDNumber)가 재생되었습니다.

  • System.OutOfMemoryException 형식의 예외가 Throw되었습니다.
업로드가 매우 느리게 되는 것을 확인할 수도 있습니다. Windows 작업 관리자에서 Aspnet_wp.exe 프로세스를 보면 메모리 변화량이 1~2초마다 64KB씩 변경되었음을 알 수 있습니다. 파일의 크기에 따라 이러한 지연이 발생하면 responseDeadlock 오류 때문에 ASP.NET 작업자 프로세스가 재활용될 수 있습니다.

참조

자세한 내용을 보려면 다음 MSDN(Microsoft Developer Network) 웹 사이트를 방문하십시오.
<httpRuntime> 요소
http://msdn.microsoft.com/ko-kr/library/e1f13641(vs.71).aspx

INPUT 요소 | 개체 입력
http://msdn.microsoft.com/ko-kr/library/ms535260(VS.85).aspx

ENCTYPE 특성 | 속성 입력
http://msdn.microsoft.com/ko-kr/library/ms533745.aspx

HtmlInputFile 클래스
http://msdn.microsoft.com/ko-kr/library/system.web.ui.htmlcontrols.htmlinputfile(vs.71).aspx

HtmlInputFile.PostedFile 속성
http://msdn.microsoft.com/ko-kr/library/system.web.ui.htmlcontrols.htmlinputfile.postedfile(vs.71).aspx
참고 이것은 Microsoft 기술 지원 서비스 내에서 직접 작성한 “빠른 게시” 문서입니다. 여기에 포함된 정보는 발생한 문제에 대해 있는 그대로 제공됩니다. 이 문서는 즉시 참조할 수 있도록 빠르게 작성되어서 표기상의 오류가 포함되어 있을 수 있고 언제든지 예고 없이 수정될 수 있습니다. 기타 고려 사항은사용 약관을 참조하십시오. 정보

속성

기술 자료: 323246 - 마지막 검토: 2013년 7월 2일 화요일 - 수정: 1.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
키워드:?
kbhowtomaster KB323246

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com