Web Service를 이용한 파일 업로드 ( DLL )

 

DLL 만들기

웹사이트에서만 사용하지 않고 Console App, Win App, ASP.NET에서 모두 이용하기 위해

클래스 라이브러리 프로젝트로 DLL을 만들 것이다.

 

 

새 프로젝트에 클래스 라이브러리를 선택하자

 

이제 프로젝트에서 웹 서비스의 자원을 사용해야 하는데 어떻게 사용해야 할까?

웹 서비스의 자원을 사용하는 것을 다음과 같다.

 

 

DLL 이나 EXE 프로젝트에서 웹서비스 사용하기

 

우리가 DLL이나 Exe에서 사용할 시 WDSL 규약에 맞게 코딩을 해주어야 한다.

이 부분은 Visual Studio에서 제공을 해준다.

 

Visual Studio 명령 프롬프트에서

wsdl /l:CS <webservice URL>을 하면 명령 프롬프트 폴더데 .cs파일 자동적으로 생성이 된다.

이것을 프로젝트에 추가하면 된다.

 

참조에는 System.Web.Service, System.Web를 추가

using System.IO;를 추가

 

wsdl 명령어에 대해 자세히 알고 싶다면 wsdl /? 하면 자세한 도움말이 나온다.

 

아까 Web Service를 만든 경로를 입력하자.

wsdl /l:CS http://local.images.co.kr/SvcFileUpload.asmx

  

 

생성된 SvcFileUpload.cs 파일을 프로젝트에 추가하면 이제부터 웹 서비스의 자원을 사용할 수 있다.

 

이제 변수와 메소드를 만들어보자

변수는 다음과 같다.

#region 변수

/// <summary>

/// 아이디 변수

/// </summary>

private string id = string.Empty;

/// <summary>

/// 아이디 세팅

/// </summary>

public string Id

{

    get { return id; }

    set { id = value; }

}

 

/// <summary>

/// 키 변수

/// </summary>

private string kno = string.Empty;

/// <summary>

/// 키 세팅

/// </summary>

public string Kno

{

    get { return kno; }

    set { kno = value; }

}

 

/// <summary>

/// 최대 업로드 용량

/// </summary>

private int maxLength = 102400 * 5; // 5MB

/// <summary>

/// 최대 업로드 용량

/// </summary>

public int MaxLength

{

    get { return maxLength; }

    set { maxLength = value; }

}

 

/// <summary>

/// 지원 확장자

/// </summary>

//private string[] ext = {"GIF", "PNG", "JPG", "JEPG", "BMP" };

public List<string> listExt = new List<string>();

 

/// <summary>

/// 상태 변수

/// READY : 준비

/// NOEXT : 지원되지 않는 확장자

/// NOFNM : 잘못된 파일명

/// FAILD : 서버에서 실패

/// SUCES : 성공

/// NOSEL : 파일선택안함

/// </summary>

private string RTN_STATUS = string.Empty;

 

#endregion

 

생성자에서는 역시나 초기화를 했다.

#region 생성자

/// <summary>

/// 생성자

/// </summary>

public SiteUpload()

{

    // 기본 세팅

    Id = " website1";

    Kno = " website1111";

 

    // 지원되는 파일 확장자

    listExt.Add("GIF");

    listExt.Add("PNG");

    listExt.Add("JPG");

    listExt.Add("JEPG");

    listExt.Add("BMP");

   

    // 초기 상태

    RTN_STATUS = "READY";

}

#endregion

 

DLL에서 사용할 메소드는 다음과 같다.

1.     디렉토리 생성

2.     새 파일로 저장

3.     기존 파일로 저장

4.     다중 새 파일로 저장

5.     다중 기존 파일로 저장

6.     파일 삭제

7.     상태 메시지

 

디렉토리 생성

#region 디렉토리 생성

/// <summary>

/// 디렉토리 생성

/// </summary>

/// <param name="dir">생성할 디렉토리</param>

/// <param name="id">사이트아이디</param>

/// <param name="kno">사이트키</param>

public void CreateDirectory(string dir, string id, string kno)

{

    // 웹서비스 자원 사용하기

    SvcFileUpload sfile = new SvcFileUpload();

    sfile.CreateDirectory(dir, id, kno);

}

#endregion

 

새 파일로 저장

#region 새 파일로 저장

/// <summary>

/// 새 파일 저장 - 같은 파일일 경우 새 이름으로 저장한다.

/// [0] 상태값

/// [1] 파일명

/// </summary>

/// <param name="files">FileUpload컨트롤</param>

/// <param name="dir">저장경로</param>

/// <returns></returns>

public List<string> NewFileUpload(System.Web.UI.WebControls.FileUpload files, string dir)

{

    string filename = string.Empty;

    string ext = string.Empty;

 

    int fileLength = files.PostedFile.ContentLength;

    int fnStart = -1;

    int fnLen = 0;

   

    // 리턴변수

    List<string> Rtn = new List<string>();

    Rtn.Add(string.Empty); //[0] : 상태값

    Rtn.Add(string.Empty); //[1] : 파일명

 

   

    filename = files.PostedFile.FileName;

    fnLen = filename.Length;

    fnStart = filename.LastIndexOf('\\') + 1;

   

    // 파일 유무 체크

    if (fnLen > 0)

    {

        if (fnStart > 0 && (fnLen - fnStart) > 0)

        {

            Stream strm;

 

            // 파일명만 추출하기

            int extStart = -1;

            int extLen = 0;

            bool chkExt = false;

 

            filename = filename.Substring(fnStart, fnLen - fnStart); // 파일명

 

            // 파일명에서 확장자 추출하기

            extLen = filename.Length;

            extStart = filename.LastIndexOf('.') + 1;

            if (extStart > 0 && (extLen - extStart) > 0)

                ext = filename.Substring(extStart, extLen - extStart); // 확장자

 

            // 확장자 체크

            foreach (string s in listExt)

                if (ext.ToUpper() == s)

                    chkExt = true;

 

            if (chkExt)

            {

                byte[] send = new byte[fileLength];

 

                strm = files.PostedFile.InputStream;

                strm.Read(send, 0, fileLength);

 

                // 웹서비스 자원 사용하기

                SvcFileUpload sfile = new SvcFileUpload();

                // 파일명만 넘겨주세요.

                filename = sfile.NewFileSaveFile(send, dir, filename, Id, Kno);

 

                strm.Close();

 

                if (!filename.Equals(string.Empty))

                    RTN_STATUS = "SUCES";

                else

                    RTN_STATUS = "FAILD";

            }

            else

                RTN_STATUS = "NOEXT";

        }

        else

            RTN_STATUS = "NOFNM";

    }

    else

        RTN_STATUS = "NOSEL";

 

    Rtn[0] = RTN_STATUS;

    Rtn[1] = filename;

 

    return Rtn;

}

#endregion

엄청난 if ;; 급하게 만드느라 생각을 많이 못하고 붙이다 보니 이렇게 많은 if문이 생겼네요.

 

기존파일명으로 파일 저장

#region 기존파일명으로 파일 저장

/// <summary>

/// 기존파일명으로 파일 저장 : 같은 이름일 경우 덮어씌운다.

/// [0] 상태값

/// [1] 파일명

/// </summary>

/// <param name="files">FileUpload컨트롤</param>

/// <param name="dir">저장경로</param>

/// <returns></returns>

public List<string> SameFileUpload(System.Web.UI.WebControls.FileUpload files, string dir)

{

    string filename = string.Empty;

    string ext = string.Empty;

 

    int fileLength = files.PostedFile.ContentLength;

    int fnStart = -1;

    int fnLen = 0;

 

    // 리턴변수

    List<string> Rtn = new List<string>();

    Rtn.Add(string.Empty); //[0] : 상태값

    Rtn.Add(string.Empty); //[1] : 파일명

 

    filename = files.PostedFile.FileName;

    fnLen = filename.Length;

    fnStart = filename.LastIndexOf('\\') + 1;

 

    // 파일 유무 체크

    if (fnLen > 0)

    {

        if (fnStart > 0 && (fnLen - fnStart) > 0)

        {

           

 

            // 파일명만 추출하기

            int extStart = -1;

            int extLen = 0;

            bool chkExt = false;

 

            filename = filename.Substring(fnStart, fnLen - fnStart); // 파일명

 

            // 파일명에서 확장자 추출하기

            extLen = filename.Length;

            extStart = filename.LastIndexOf('.') + 1;

            if (extStart > 0 && (extLen - extStart) > 0)

                ext = filename.Substring(extStart, extLen - extStart); // 확장자

 

            // 확장자 체크

            foreach (string s in listExt)

                if (ext.ToUpper() == s)

                    chkExt = true;

 

            if (chkExt)

            {

                Stream strm;

                byte[] send = new byte[fileLength];

 

                strm = files.PostedFile.InputStream;

                strm.Read(send, 0, fileLength);

 

                // 웹서비스 자원 사용하기

                SvcFileUpload sfile = new SvcFileUpload();

                // 파일명만 넘겨주세요.

                filename = sfile.SameFileSaveFile(send, dir, filename, Id, Kno);

 

                strm.Close();

 

                if (!filename.Equals(string.Empty))

                    RTN_STATUS = "SUCES";

                else

                    RTN_STATUS = "FAILD";

            }

            else

                RTN_STATUS = "NOEXT";

        }

        else

            RTN_STATUS = "NOFNM";

    }

    else

        RTN_STATUS = "NOSEL";

 

    Rtn[0] = RTN_STATUS;

    Rtn[1] = filename;

 

    return Rtn;

}

#endregion

마찬가리로 많은 if문을 볼 수 있습니다. ^^;;

 

다중 새 파일로 저장

#region 다중 새 파일로 저장

/// <summary>

/// 다중 새 파일 저장 - 같은 파일일 경우 새 이름으로 저장한다.

/// [2][0] 전체 상태값

/// </summary>

/// <param name="files"></param>

/// <param name="dir"></param>

/// <returns></returns>

public List<List<string>> MultiNewFileUpload(List<System.Web.UI.WebControls.FileUpload> files, string dir)

{

    string CHK_STATUS = "FAILD";

 

    // 리턴변수

    List<List<string>> Rtn = new List<List<string>>();

 

    List<string> RtnFile = new List<string>();

    List<string> RtnStatus = new List<string>();

    List<string> RtnFullStatus = new List<string>();

    RtnFullStatus.Add(string.Empty);

 

    List<string> svcRtn = new List<string>();

 

    foreach (System.Web.UI.WebControls.FileUpload f in files)

    {

        svcRtn = NewFileUpload(f, dir);

 

        RtnStatus.Add(svcRtn[0]); // 상태값

        RtnFile.Add(svcRtn[1]); // 파일명

    }

 

    foreach (string s in RtnStatus)

    {

        if (s == "SUCES" || s == "NOSEL")

            CHK_STATUS = "SUCES";

    }

    RtnFullStatus[0] = CHK_STATUS;

 

    Rtn.Add(RtnStatus); // 각 업로드 상태

    Rtn.Add(RtnFile); // 각 업로드 파일명

    Rtn.Add(RtnFullStatus); // 전체 상태

 

    return Rtn;

}

#endregion

하나씩 파일 업로드만 있길래 메소드는 나중에 추가하여 다중으로도 업로드를 지원했습니다.

 

다중 기존 파일로 저장

#region 다중 기존 파일로 저장

/// <summary>

/// 다중 기존 파일로 저장 - 같은 이름일 경우 덮어씌운다.

/// [2][0] 전체 상태값

/// </summary>

/// <param name="files"></param>

/// <param name="dir"></param>

/// <returns></returns>

public List<List<string>> MultiSameFileUpload(List<System.Web.UI.WebControls.FileUpload> files, string dir)

{

    string CHK_STATUS = "FAILD";

 

    // 리턴변수

    List<List<string>> Rtn = new List<List<string>>();

 

    List<string> RtnFile = new List<string>();

    List<string> RtnStatus = new List<string>();

    List<string> RtnFullStatus = new List<string>();

    RtnFullStatus.Add(string.Empty);

 

    List<string> svcRtn = new List<string>();

 

    foreach (System.Web.UI.WebControls.FileUpload f in files)

    {

        svcRtn = SameFileUpload(f, dir);

 

        RtnStatus.Add(svcRtn[0]); // 상태값

        RtnFile.Add(svcRtn[1]); // 파일명

    }

 

    foreach (string s in RtnStatus)

    {

        if (s == "SUCES" || s == "NOSEL")

            CHK_STATUS = "SUCES";

    }

    RtnFullStatus[0] = CHK_STATUS;

 

 

    Rtn.Add(RtnStatus); // 각 업로드 상태

    Rtn.Add(RtnFile); // 각 업로드 파일명

    Rtn.Add(RtnFullStatus); // 전체 상태

 

    return Rtn;

}

#endregion

마찬가지의 이유로 추가했습니다.

 

파일 삭제

#region 파일 삭제

/// <summary>

/// 파일 삭제

/// </summary>

/// <param name="dir">디렉토리</param>

/// <param name="filename">파일명</param>

public string DeleteFile(string dir, string filename)

{

    bool delCheck = false;

    string RTN_STATUS = string.Empty;

 

    // 웹서비스 자원 사용하기

    SvcFileUpload sfile = new SvcFileUpload();

    delCheck = sfile.DeleteFile(dir, filename, Id, Kno);

 

    if (delCheck)

        RTN_STATUS = "SUCES";

    else

        RTN_STATUS = "FAILD";

 

    return RTN_STATUS;

}

#endregion

 

상태 메시지

#region 상태 메세지

/// <summary>

/// 상태 메세지

/// </summary>

/// <param name="status">상태코드 5자리</param>

/// <returns></returns>

public string SatausMessage(string status)

{

    /*

    상태 변수

   

    READY : 준비

    NOEXT : 지원되지 않는 확장자

    NOFNM : 잘못된 파일명

    FAILD : 서버에서 실패

   

    SUCES : 성공

    NOSEL : 파일선택안함

     */

    string rtnMessage = string.Empty;

 

    switch (status)

    {

        case "READY":

            rtnMessage = "업로드 대기중입니다.";

            break;

        case "NOEXT":

            rtnMessage = "지원되지 않는 확장자입니다.";

            break;

        case "NOFNM":

            rtnMessage = "파일명이 잘못되었습니다.";

            break;

        case "FAILD":

            rtnMessage = "업로드가 실패했습니다.";

            break;

        case "SUCES":

            rtnMessage = "성공적으로 업로드 되었습니다.";

            break;

        case "NOSEL":

            rtnMessage = "";

            break;

    }

    return rtnMessage;

}

#endregion

업로드의 각 상태 메시지를 리턴해 주는 메소드 입니다. 급하게 만들었다고 생각해주세요;;

 

자 이렇게 해서 DLL에서 필요한 변수 및 메소드를 모두 만들었다.

빌드를 하여 dll을 만들자.

 

 

다음 장에서는 마지막으로 웹 사이트를 통해 파일 업로드 테스트 하는 페이지에 대해 알아 보겠다.

 

+ Recent posts