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