'권한'에 해당되는 글 1건

  1. 2011.07.26 파일 업로드 기능 구현

파일 업로드 기능 구현


게시판 등에서 파일 업로드 서비스를 제공해야 할 경우가 있습니다.
다양한 기능이 필요하다면 파일 업로드 컴포넌트를 이용해야 하겠지만,
간단한 정도의 파일 업로드는 ASP.NET 의 기본 컨트롤을 이용해서도 가능합니다.

* 파일이 업로드될 경로 설정 및 권한 설정
1. 솔루션 탐색기의 프로젝트명 위에서 마우스 오른쪽 버튼 [Add]-[New Folder]를 선택합니다.
2. 새로 만들어진 폴더의 이름을 적당하게 지정합니다. 저는 "Upload"로 하겠습니다.
3. 윈도우 탐색기에서 실제 프로젝트 소스 폴더로 이동하여 2단계에서 생성한 폴더를 찾습니다. 
4. Upload 폴더에서 마우스 오른쪽 버튼을 클릭하여 [속성]-[보안]-[편집]-[추가] 메뉴로 들어갑니다.
   (Windows XP에서는 [속성]-[보안]-[추가] 메뉴 입니다.)

5. 사용자 또는 그룹 선택 팝업 창에서 왼쪽 하단의 [고급] 버튼을 클릭합니다.
6. 우측 중간의 [지금 찾기] 버튼을 클릭합니다.
7. 하단의 검색 결과에서 ASPNET 사용자를 선택한 후 [확인], [확인]을 클릭하여 보안 탭에 ASP.NET 사용자 추가를 완료합니다.
8. 추가된 ASP.NET 사용자 선택 후 하단의 ASP.NET Machine Account의 사용 권한 란에서

읽기 및 실행 / 폴더 내용 보기 / 읽기 / 쓰기
권한만 체크한 후 [확인], [확인]을 클릭하여 Upload 폴더에 대한 설정을 완료합니다.


* 파일 업로드 폼 디자인
업로드 기능을 구현할 aspx 페이지에 다음과 같이 폼 영역과 파일업로드 컨트롤, 버튼 컨트롤을 추가합니다.

<form runat="server" method="post" enctype="multipart/form-data">
    <asp:FileUpload ID="File1" runat="server" />
    <asp:Button ID="btnSubmit" runat="server" Text="업로드버튼" />
</form>


method="get" 으로 할 경우 넘겨지는 파라미터 값들이 주소표시줄에 노출되기 때문에 보안적인 측면에서 바람직하지 않습니다. 보통 화면ID나 검색조건 등의 일반적인 파라미터를 넘길 때에 사용합니다. 또한 get 방식은 4096byte의 길이 제한이 있습니다.
method="post" 는 입력 길이 제한이 없으며 입력 내용이 주소표시줄에 노출되지 않습니다.
하지만 두 방식 모두 전송가능한 데이터양에 한계가 있으므로
enctype="multipart/form-data" 속성을 이용하여 이미지나 대용량의 파일을 전송할 수 있도록 해주어야 합니다.


* 파일 업로드 기능 구현
작성한 aspx 파일을 디자인 모드에서 열고 btnSubmit 버튼을 더블클릭하여 aspx.cs(비하인드 코드)에 버튼 클릭 이벤트가 추가되도록 합니다.
이렇게 하면 <asp:Button ID="btnSubmit" runat="server" Text="업로드버튼" />는 
<asp:Button ID="btnSubmit" runat="server" Text="업로드버튼" onclick="btnSubmit_Click" /> 가 되고, aspx.cs 소스에는 다음과 같은 코드가 추가됩니다.

protected void btnSubmit_Click(object sender, EventArgs e)
{
}


이 자동생성된 btnSubmit_Click 함수 안에 다음과 같이 작성하여 줍니다.

protected void btnSubmit_Click(object sender, EventArgs e)
{

    //파일업로드 컨트롤에 데이터가 있는지 확인
    //File1.PostedFile.ContentLength는 업로드될 파일의 사이즈(byte)
    //File1.PostedFile.FileName은 업로드될 파일의 전체 로컬 경로
    //File1.PostedFile.ContentType은 업로드될 파일의 타입

    if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength > 0))
    {
        //파일의 전체 경로에서 순수 파일명만 가져옵니다.
        string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
        //(실제서버의 Upload폴더 + 파일명) 조합으로 파일이 서버에 저장될 위치를 지정합니다.
        string SaveLocation = Server.MapPath("Upload") + "\\" + fn;
        try
        {
            File1.PostedFile.SaveAs(SaveLocation);
            Response.Write("정상적으로 파일이 업로드되었습니다.");
        }
        catch (Exception ex)
        {
            Response.Write("Error: " + ex.Message);
        }
    }
    else
    {
        Response.Write("파일을 선택하여 주십시오.");
    }
}



* 테스트
Visual Studio에서 F5를 눌러 프로젝트를 실행시킨 후 파일 업로드 기능이 정상적으로 작동하는지 테스트합니다.
화면에 "정상적으로 파일이 업로드되었습니다."라는 메세지가 나타나면
실제 프로젝트 Upload 폴더로 이동하여 파일이 업로드 되었는지 확인합니다.


* 4MB 이상 파일 업로드 하기
위와 같은 소스로 작성했을 경우 업로드 가능한 파일의 크기는 4MB(4,096kilobyte)까지 입니다.
만일 4MB 이상의 파일을 업로드 해야 할 경우 프로젝트의 web.config에서 속성을 지정해주어야 합니다.
web.config 파일을 열어서 httpRuntime 를 검색해보고 없다면 <configuration><system.web> 밑에 다음과 같은 소스를 추가해줍니다. 

 <httpRuntime executionTimeout="3600"
                maxRequestLength="8192"
                    useFullyQualifiedRedirectUrl="false"
                    minFreeThreads="8"
                    minLocalRequestFreeThreads="4"
                    appRequestQueueLimit="100"
                    />


다른 속성들은 직접 검색해보도록 하고(....) 주목할 것은 maxRequestLength입니다.
최대 업로드 사이즈를 kilobyte 단위로 입력해주면 됩니다.
저는 8MB까지 허용하기 위해서 1024 * 8 = 8192 KB를 지정해줬습니다.

다시 프로젝트를 실행시키면 지정된 크기까지의 파일이 업로드 되는 것을 확인할 수 있습니다.

 


* UpdatePanel 안에서의 FileUpload 사용

파일 업로드 컨트롤은 UpdatePanel 안에서는 정상적으로 작동되지 않습니다. 
Ajax 등의 처리를 위해서 부득이하게 UpdatePanel에 포함되어야 한다면 다음과 같은 소스를 추가하여 Submit 버튼에 PostBackTrigger를 지정하여 줍니다. 

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <Triggers>
        <asp:PostBackTrigger ControlID="btnSubmit" />
    </Triggers>

</asp:UpdatePanel>




수고하셨습니다 :D




참조 : http://support.microsoft.com/kb/323246/ko

 

* 2012-09-18 수정 : 본문 내용 중 파일 사이즈를 byte 단위로 지정한다는 부분이 있었는데 kilobyte로 수정했습니다 저런 실수를 하다니 i _ i ...

prev 1 next