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 Platform' 카테고리의 다른 글
HTML 특수문자 사용하기 (0) | 2009.06.29 |
---|---|
웹서비스(Web Service)를 이용한 파일 업로드(3) ( Web Site 만들기 ) (0) | 2009.06.29 |
웹서비스(Web Service)를 이용한 파일 업로드(1) (0) | 2009.06.29 |
Web.config 파일에서 appSettings, connectionStrings을 관리(2) (0) | 2009.06.29 |
Web.config 파일에서 appSettings, connectionStrings을 관리(1) (0) | 2009.06.29 |