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

 

먼저 D:\SaveImage 아까 웹 서비스를 만들 때 저장 폴더를 설정했는데 그 경로로 upload 라는 가상 디렉토리를 설정한다. 이 설정은 http://local.image.co.kr 에 설정해야 한다.

 

이제 웹 사이트를 만들어보자

 

 

새 프로젝트에서 ASP.NET 웹 응용프로그램을 선택 후 UploadTestWeb이름을 생성하자.

 

FileUpload.aspx 생성하기

이 파일은 업로드를 테스트 하는 .aspx 파일이다.

 

FileUpload.aspx

<br /><br /><br />

   

   

    새이름으로 : <asp:FileUpload ID="files" runat="server" /> <asp:Button ID="Upload" runat="server" Text="업로드" OnClick="Upload_OnClick" />

    <br /><br />

   

    업로드이름으로 : <asp:FileUpload ID="files2" runat="server" /> <asp:Button ID="Upload2" runat="server" Text="업로드" OnClick="Upload2_OnClick" />

   

    <br /><br /><br />

 

 

    <img src="http://local.images.co.kr/upload/hi2/01.png" border=1 /> 01.png - <asp:Button ID="btnDel" runat="server" Text="삭제" OnClick="btnDel_OnClick" />

       

    <br /><br /><br />

   

    <img src="http://local.images.co.kr/upload/hi2/02.png" border=1 /> 02.png - <asp:Button ID="btnDel2" runat="server" Text="삭제" OnClick="btnDel2_OnClick" />

 

    <br /><br /><br />

   

    <img src="http://local.images.co.kr/upload/hi2/03.png" border=1 /> 03.png - <asp:Button ID="btnDel3" runat="server" Text="삭제" OnClick="btnDel3_OnClick" />

 

   

    <br /><br /><br />

    <br /><br /><br />

    <br /><br /><br />

 

    다중 업로드(새이름)<br />

    <asp:FileUpload ID="file1" runat="server" /><br />

    <asp:FileUpload ID="file2" runat="server" /><br />

    <asp:FileUpload ID="file3" runat="server" /> <asp:Button ID="Upload3" runat="server" Text="업로드" OnClick="Upload3_OnClick" />

 

 

    <br /><br /><br />

 

    다중 업로드(기존이름)<br />

    <asp:FileUpload ID="file4" runat="server" /><br />

    <asp:FileUpload ID="file5" runat="server" /><br />

    <asp:FileUpload ID="file6" runat="server" /> <asp:Button ID="Upload4" runat="server" Text="업로드" OnClick="Upload4_OnClick" />

 

 

    <br /><br /><br />

소스 중간의 이미지 출력 부분은 이미지가 잘 업로드가 되었는지를 보기 위해서 이다.

 

새 이름으로 업로드 하기

#region 다중 새이름으로 업로드

/// <summary>

/// 다중 새이름으로 업로드

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void Upload3_OnClick(object sender, EventArgs e)

{

    List<System.Web.UI.WebControls.FileUpload> listFile = new List<System.Web.UI.WebControls.FileUpload>();

    listFile.Add(file1);

    listFile.Add(file2);

    listFile.Add(file3);

 

    SiteUpload sUpload = new SiteUpload();

 

    string statusMessage = sUpload.SatausMessage(sUpload.MultiNewFileUpload(listFile, "HI2")[2][0]);

 

    Response.Write(statusMessage);

 

}

#endregion

위에서 설정한 아이디와 키 값이 맞지 않으면 에러가 발생한다. 따로 try catch문을 설정하지 않아 에러로 보이니 설정 값을 서로 잘 맞춰야 한다.

 

기존 이름으로 덮어 씌우기

#region 기존 이름 덮어씌우기

/// <summary>

/// 기존 이름 덮어씌우기

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void Upload2_OnClick(object sender, EventArgs e)

{

    SiteUpload sUpload = new SiteUpload();

 

    Response.Write("Len : " + files2.PostedFile.ContentLength + "<br />");

 

    /*

    상태 변수

    READY : 준비

    NOEXT : 지원되지 않는 확장자

    NOFNM : 잘못된 파일명

    FAILD : 서버에서 실패

    SUCES : 성공

    NOSEL : 파일선택안함

     */

    string statusMessage = sUpload.SatausMessage(sUpload.SameFileUpload(files2, "HI2")[0]);

 

 

    Response.Write(statusMessage);

}

#endregion

 

다중 새 이름으로 업로드

#region 다중 새이름으로 업로드

/// <summary>

/// 다중 새이름으로 업로드

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void Upload3_OnClick(object sender, EventArgs e)

{

    List<System.Web.UI.WebControls.FileUpload> listFile = new List<System.Web.UI.WebControls.FileUpload>();

    listFile.Add(file1);

    listFile.Add(file2);

    listFile.Add(file3);

 

    SiteUpload sUpload = new SiteUpload();

 

    string statusMessage = sUpload.SatausMessage(sUpload.MultiNewFileUpload(listFile, "HI2")[2][0]);

 

    Response.Write(statusMessage);

 

}

#endregion

 

다중 기존 이름으로 덮어씌우기

#region 다중 기존이름으로 덮어씌우기

/// <summary>

/// 다중 기존이름으로 덮어씌우기

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void Upload4_OnClick(object sender, EventArgs e)

{

    List<System.Web.UI.WebControls.FileUpload> listFile = new List<System.Web.UI.WebControls.FileUpload>();

    listFile.Add(file4);

    listFile.Add(file5);

    listFile.Add(file6);

 

    SiteUpload sUpload = new SiteUpload();

 

    string statusMessage = sUpload.SatausMessage(sUpload.MultiSameFileUpload(listFile, "HI2")[2][0]);

 

    Response.Write(statusMessage);

}

#endregion

 

파일 삭제

#region 파일 삭제

/// <summary>

/// 파일 삭제

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void btnDel_OnClick(object sender, EventArgs e)

{

    /*

    상태 변수

    FAILD : 서버에서 실패

    SUCES : 성공

     */

    SiteUpload sUpload = new SiteUpload();

 

    string statusMessage = sUpload.SatausMessage(sUpload.DeleteFile("HI2", "01.png"));

 

    Response.Write(statusMessage);

 

}

 

 

/// <summary>

/// 파일 삭제

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void btnDel2_OnClick(object sender, EventArgs e)

{

    /*

    상태 변수

    FAILD : 서버에서 실패

    SUCES : 성공

     */

    SiteUpload sUpload = new SiteUpload();

 

    string statusMessage = sUpload.SatausMessage(sUpload.DeleteFile("HI2", "02.png"));

 

    Response.Write(statusMessage);

 

}

 

/// <summary>

/// 파일 삭제

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void btnDel3_OnClick(object sender, EventArgs e)

{

    /*

    상태 변수

    FAILD : 서버에서 실패

    SUCES : 성공

     */

    SiteUpload sUpload = new SiteUpload();

 

    string statusMessage = sUpload.SatausMessage(sUpload.DeleteFile("HI2", "03.png"));

 

    Response.Write(statusMessage);

 

}

#endregion

 

이렇게 해서 웹 서비스를 통해 업로드 하는 과정을 모두 완료했다.

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을 만들자.

 

 

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

 

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

 

준비하기

1.     웹사이트 만들기 ( : http://local.images.co.kr )

2.     호스트 파일에 등록 : 127.0.0.1      local.images.co.kr

3.     Visual Studio -> 파일 -> 새로 만들기 -> 새 웹사이트

4.     HTTP 선택 후 http://local.images.co.kr 을 입력 후 언어는 Visual C# 선택 후 확인

5.     웹 사이트로 프로젝트 생성 완료

 

이제 웹서비스를 생성할 준비가 완료 되었다.

 

웹 서비스 만들기

1.     프로젝트에서 새 항목 추가를 클릭

2.     템플릿에서 웹 서비스 선택 후 이름은 SvcFileUpload.asmx로 생성

 

이제 웹 서비스가 완성되었다.

기본 적으로 HelloWorld() 메소드가 추가되고

이 메소드는 http://local.images.co.kr/SvcFileUpload.asmx 에서 확인 할 수 있다.

 

 

파일 업로드를 위한 웹 서비스 계획

현재 만들어진 웹 서비스가 있는 사이트를 업로드용 파일 서버로 사용할 경우로 가정한다.

1.     간단하게 아이디와 키 값을 부여

2.     아이디와 키 값이 일치 할 경우 디렉토리 생성 및 파일 업로드

3.     아이디와 키 값이 일치 할 경우 디렉토리 삭제 및 파일 삭제

 

웹 서비스에 필요한 변수

1.     아이디와 키 값 저장 변수

2.     아이디와 키 값 비교 변수

3.     저장 할 경로의 디렉토리 변수

 

웹 서비스에 필요한 메소드

1.     아이디와 키 값 비교 메소드

2.     디렉토리 생성 메소드

3.     파일 여부 체크 메소드

4.     파일 저장 메소드 새 이름으로 저장

5.     파일 저장 메소드 기존 파일 덮어 씌우기

6.     파일 삭제 메소드

 

구조는 웹사이트에서 DLL을 참조해서 웹서비스의 메소드를 호출하여 처리하는 것이다.

 

그럼 이제부터 SvcFileUpload.asmx 을 만들어 보겠다.

 

/// <summary>

/// SvcFileUpload의 요약 설명입니다.

/// </summary>

[WebService(Namespace = "http://local.images.co.kr", Name = "SvcFileUpload", Description = "파일 업로드를 처리")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class SvcFileUpload : System.Web.Services.WebService

{

XML Web Service를 위한 기본 네임스페이스를 설정하고 XML Web Service의 명을 정하는 것이다.

 

여러 사이트에서 하나의 업로드 서버를 사용할 수 있으므로 사이트 마다 아이디와 키를 부여하고업로드 서버 저장 경로 변수 설정

/// <summary>

/// 사이트키

/// </summary>

private Dictionary<string, string> site = new Dictionary<string, string>();

/// <summary>

/// 저장할 경로 변수

/// </summary>

private string saveDir = string.Empty;

 

/// <summary>

/// 아이디, 키값 비교 변수

/// </summary>

private bool equValue = false;

 

생성자에서 위의 변수 초기화

/// <summary>

/// 생성자

/// </summary>

public SvcFileUpload () {

 

    //디자인된 구성 요소를 사용하는 경우 다음 줄의 주석 처리를 제거합니다.

    //InitializeComponent();

 

    // 저장할 기본 경로 ( 루트 )

    saveDir = "D:\\SaveImage";

    // Key : 사이트 아이디, Value : 사이트 키 번호

    site.Add("website1", "website1111");

}

 

SvcFileUpload 웹서비스는 다음과 같이 8가지의 메소드로 구성이 된다.

1.     아이디와 키 번호 체크

2.     저장 경로 반환

3.     디렉토리 생성

4.     파일 여부 체크

5.     새로운 파일명을 생성 ( 파일명 중복 방지 )

6.     파일명이 같을 경우 같은 이름으로 저장

7.     파일명이 같을 경우 새 파일명으로 저장

8.     파일 삭제

 

아이디와 키 번호 체크 메소드

/// <summary>

/// 아이디와 키번호 체크

/// </summary>

/// <param name="id"></param>

/// <param name="kno"></param>

/// <returns></returns>

[WebMethod(Description = "아이디와 키번호 체크")]

private bool EqualsIdKno(string id, string kno)

{

    string sno = site[id];

 

    if (sno == kno)

        equValue = true;

    else

        equValue = false;

 

    return equValue;

}

 

저장 경로 반환

/// <summary>dkdle

/// 저장 경로 반환

/// </summary>

/// <returns></returns>

[WebMethod(Description = "저장 경로를 반환")]

public string ReturnDirectory()

{

    return saveDir;

}

 

디렉토리 생성

/// <summary>

/// 디렉토리를 생성

/// </summary>

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

[WebMethod(Description = "디렉토리를 생성")]

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

{

    bool createDir = false;

 

    if (EqualsIdKno(id, kno))

    {

        string strDir = string.Empty;

 

        strDir = ReturnDirectory() + "\\" + dir;

 

        //디렉토리 생성

        if (!Directory.Exists(strDir))

        {

            Directory.CreateDirectory(strDir);

        }

        createDir = true;

    }

    else

    {

        createDir = false;

    }

 

    return createDir;

}

 

파일 여부 체크

/// <summary>

/// 파일 여부 체크

/// </summary>

/// <param name="fname">저장폴더와 함께 파일명</param>

/// <returns></returns>

[WebMethod(Description = "파일 여부 체크")]

public bool EqualsFile(string fname)

{

    string strFile = ReturnDirectory() + "\\" + fname;

   

    return File.Exists(strFile);

}

 

새로운 파일명 생성

/// <summary>

/// 새로운 파일명 생성

/// </summary>

/// <param name="folderPath"></param>

/// <param name="filename"></param>

/// <returns></returns>

private string GetAvailablePathname(string folderPath, string filename)

{

    int invalidChar = 0;

    do

    {

        // 파일명에서 사용할 수 없는 문자가 들어 있는 배열을 가져온다.

        invalidChar = filename.IndexOfAny(Path.GetInvalidFileNameChars());

 

        // 사용할 수 없는 문자 제거

        if (invalidChar != -1)

            filename = filename.Remove(invalidChar, 1);

    }

    while (invalidChar != -1);

 

 

    string fullPath = Path.Combine(folderPath, filename);

    string filenameWithoutExtention = Path.GetFileNameWithoutExtension(filename);

    string extension = Path.GetExtension(filename);

 

 

 

    while (File.Exists(fullPath))

    {

        Regex rg = new Regex(@".*\((?<Num>\d*)\)");

        Match mt = rg.Match(fullPath);

 

        if (mt.Success)

        {

            string numberOfCopy = mt.Groups["Num"].Value;

            int nextNumberOfCopy = int.Parse(numberOfCopy) + 1;

            int posStart = fullPath.LastIndexOf("(" + numberOfCopy + ")");

 

            fullPath = string.Format("{0}({1}){2}", fullPath.Substring(0, posStart), nextNumberOfCopy, extension);

        }

        else

        {

            fullPath = folderPath + filenameWithoutExtention + " (2)" + extension;

        }

    }

    return fullPath;

}

웹 사이트 검색을 통해 이 부분을 다른 분이 작성한 코드를 사용했다.

이 코드의 내용은 다음의 주소에 자세히 나와 있다.

http://chaoskcuf.com/entry/C-파일명이-중복일--자동으로-이름을-생성하는-코드

 

파일명이 같을 경우 같은 이름으로 저장

/// <summary>

/// 파일을 저장 - 파일이 있을 경우 같은 이름으로 저장

/// </summary>

/// <param name="httpFile"></param>

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

/// <param name="id"></param>

/// <param name="kno"></param>

/// <returns></returns>

[WebMethod(Description = "파일을 저장 - 파일이 있을 경우 같은 이름으로 저장")]

public string SameFileSaveFile(byte[] fileInfo, string dir, string fileName, string id, string kno)

{

    string checkSave = string.Empty;

    string filePath = string.Empty;

 

    // 아이디와 키 값 비교

    if (EqualsIdKno(id, kno))

    {

        // 저장할 경로

        string dirpath = ReturnDirectory() + "\\" + dir + "\\";

        filePath = dirpath + fileName;

           

        if (CreateDirectory(dir, id, kno))

        {

            try

            {

                //파일처리

                using (MemoryStream ms = new MemoryStream(fileInfo))

                {

                    using (FileStream fs = new FileStream(filePath, FileMode.Create))

                    {

                        ms.WriteTo(fs);

 

                        ms.Close();

                        fs.Close();

                    }

                }

                checkSave = fileName; // 파일명

            }

            catch

            {

                checkSave = "";

            }

        }

        else

        {

            checkSave = "";

        }

    }

    return checkSave;

}

 

파일명이 같을 경우 새 파일명으로 저장

/// <summary>

/// 파일을 저장 - 파일이 있을 경우 새이름으로

/// </summary>

/// <param name="httpFile"></param>

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

/// <param name="id"></param>

/// <param name="kno"></param>

/// <returns></returns>

[WebMethod(Description = "파일을 저장 - 파일이 있을 경우 새 이름으로")]

public string NewFileSaveFile(byte[] fileInfo, string dir, string fileName, string id, string kno)

{

    string checkSave = string.Empty;

    string filePath = string.Empty;

 

    // 아이디와 키 값 비교

    if (EqualsIdKno(id, kno))

    {

        // 저장할 경로

        string dirpath = ReturnDirectory() + "\\" + dir + "\\";

 

        if (CreateDirectory(dir, id, kno))

        {

            try

            {

                // 중복되지 않는 파일명 생성

                filePath = GetAvailablePathname(dirpath, fileName);

 

                //파일처리

                using (MemoryStream ms = new MemoryStream(fileInfo))

                {

                    using (FileStream fs = new FileStream(filePath, FileMode.Create))

                    {

                        ms.WriteTo(fs);

 

                        ms.Close();

                        fs.Close();

                    }

                }

                int fnLen = filePath.Length;

                int fnStart = filePath.LastIndexOf('\\') + 1;

 

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

            }

            catch

            {

                checkSave = "";

            }

        }

        else

        {

            checkSave = "";

        }

    }

 

    return checkSave;

}

 

파일 삭제

/// <summary>

/// 파일을 삭제한다.

/// </summary>

/// <param name="DirPath">디렉토리 절대경로</param>

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

/// <returns></returns>

[WebMethod(Description = "파일을 삭제한다.")]

public bool DeleteFile(string dir, string filename, string id, string kno)

{

    bool checkDel = false;

   

    // 아이디와 키 값 비교

    if (EqualsIdKno(id, kno))

    {

        try

        {

            string strDir = string.Empty;

 

            strDir = ReturnDirectory() + "\\" + dir + "\\";

 

            //파일삭제

            if (File.Exists(strDir + filename))

            {

                File.Delete(strDir + filename);

            }

            checkDel = true;

        }

        catch

        {

            checkDel = false;

        }

    }

    else

        checkDel = false;

 

    return checkDel;

}

 

위의 소스에서 아이디와 키값이 일치 하지 않으면 디렉토리 생성이나 파일 업로드 그리도 삭제 모두 되지 않는 것을 볼 수 있다.

 

이와 같이 파일 업로드에 필요한 대부분의 메소드를 생성했다.

 

다음 장에서는 DLL 만들어 웹 서비스 자원을 어떻게 사용하는지를 알아보겠다.

+ Recent posts