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 만들어 웹 서비스 자원을 어떻게 사용하는지를 알아보겠다.
'Web Platform' 카테고리의 다른 글
웹서비스(Web Service)를 이용한 파일 업로드(3) ( Web Site 만들기 ) (0) | 2009.06.29 |
---|---|
웹서비스(Web Service)를 이용한 파일 업로드(2) (DLL 만들기) (0) | 2009.06.29 |
Web.config 파일에서 appSettings, connectionStrings을 관리(2) (0) | 2009.06.29 |
Web.config 파일에서 appSettings, connectionStrings을 관리(1) (0) | 2009.06.29 |
IsPostBack속성, 페이지 이벤트 주기 (0) | 2009.06.29 |