[devpia에서 발췌]

 

.NET에서는 Thumbnail 만들기가 참 쉽네요.
simple한 thumbnail 만들기 클래스를 만들어 봅니다.

미리 말씀드리면 제가 thumbnail 만드는 거 알려드리는데요 저도 하나 도움받고 싶은 게 있습니다.
이 글 맨 아래에 질문드리니 아시는 분께서 한번 현답을 주셨으면 합니다... 
여기에 질문을 함께 올린다는 게 좀 애매합니다만 그래도 내용상 연결이 되어서 불가피하게 올립니다.
많은 이해 바랍니다.


Thumbnail 이미지를 만들기 위해서는 다음 사항이 결정되어야 합니다.

   1) 원본 이미지 ( 즉 파일명)
  2) thumbnail 이미지 파일명 및 저장 경로
  3) thumbnail 이미지 포맷(즉, gif 냐, jpg 냐 등..)
   4) thumbnail 이미지 사이즈 (즉, 넓이와 높이)


또한 주의사항은,
   1) thumbnail 이미지 파일이 올라갈 경로에는 웹사용자의 쓰기 권한이 할당되어야 합니다.
   2) 경로는 로컬경로로 지정하여야 Bitmap.Save 함수(아래 참조)가 작동합니다.
       단 화면에 출력할때는 웹 경로(http://www..  형식)으로 바꾸어주어야 다른 컴퓨터 브라우저로도 볼수 있습니다.
   3) thumbnail 이미지 포맷과 실제적인 thumbnail 이미지 파일의 확장자가 맞아야 합니다.
       예를 들어 이미지 포맷을 gif로 하길 원한다면 실제 thumbnail 이미지 파일 확장자도 XXX.gif 로 끝나야 합니다.

대충 이정도면 간단한 thumbnail 이미지를 만들 수 있을 것입니다.


[예제]

   - 파일명:  test.aspx,  test.aspx.cs
   - 원본 이미지 파일명 :  d:/root/file/source.jpg
   - thumbnail 이미지 파일명 및 경로 : d:/root/file/thumb.gif
   - thumbnail 이미지 포맷 : gif  ( ImageFormat.Gif 프로퍼티 활용)
   - thumbnail 이미지 사이즈 : 넓이:40px, 높이 40px

--------------------------------------
[1] test.aspx
--------------------------------------
test.aspx에서 화면에 이미지를 받을 수 있는 웹서버컨트롤을 만들어 id를 다음과 같이 지정합니다.

protected System.Web.UI.WebControls.Image ImgThumbnail;  //thumbnail 이미지 출력 컨트롤
protected System.Web.UI.WebControls.Image ImgSrc; //원본 이미지 출력 컨트롤

--------------------------------------
[2] test.aspx.cs
--------------------------------------

1) Tyumbnail 이미지 파일 생성 클래스 

     아래와 같이 thumbnail 만드는 클래스를 작성합니다.

namespace localhost
{

      public class ThumbnailMaker
      {
            //**** Callback 함수 ****
            public bool ThumbnailCallback()
            {
                  return false;
            }

             //**** Thumbnail 이미지 만들기 함수 ****
             //  width : thumbnail 이미지 폭
          //  height: thumbnail 이미지 높이
          //  srcurl: 원본 이미지 경로
          //  thmburl: thumbnail 이미지 경로
          //  imgfmt: thumbnail 이미지 포맷
          public void saveThumbnailImage(int width,int height,string srcurl,string thmburl,ImageFormat imgfmt)
             {
                    //원본 이미지 파일 생성
               System.Drawing.Bitmap img = new Bitmap(srcurl);

                    //Callback 함수 생성
               System.Drawing.Image.GetThumbnailImageAbort myCallback =
                    new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);

                    //Thumbnail 이미지 생성
               System.Drawing.Image tt = img.GetThumbnailImage(width, height, myCallback, IntPtr.Zero);
    
                    //thumbnail 이미지 저장
               tt.Save(thmburl, imgfmt );
             }
     }
    
     .....

}


  2) Page_Load 함수내에 다음과 같이 작성합니다.

      private void Page_Load(object sender, System.EventArgs e)
      {
              //원본 이미지 및 thumbnail 이미지 파일명 및 경로 지정
          string srcurl = "d:/root/file/source.jpg";
              string thumbmailurl = "d:/root/file/thumb.gif";

              // thumbnail 이미지 생성
          // thumbnail 이미지 사이즈, 원본 및 thumbnail 이미지 경로, 이미지 타입 지정
          ThumbnailMaker maker = new ThumbnailMaker();
             maker.saveThumbnailImage(70,60,srcurl,thumbmailurl,ImageFormat.Gif);

             // 이미지 화면 출력
          ImgSrc.ImageUrl = "http://www.test.com/file/source.jpg";
             ImgThumbnail.ImageUrl = "http://www.test.com/file/thumb.gif";
    }


getThumbnailImage 함수에 대해서는 msdn 을 참조하세요.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdrawingimageclassgetthumbnailimagetopic.asp

신고
document.write("");
Posted by 사우람

 

string upDir = Request.MapPath("/") + "\\upload\\original\\";

string fileName = "test.gif"

 

 

System.Drawing.Image rImg;
rImg = System.Drawing.Image.FromFile(upDir + fileName);
rImg = rImg.GetThumbnailImage(120,120,null,IntPtr.Zero);
string thumFileUrl = Request.MapPath("/") + "\\upload\\sample\\" + fileName;
rImg.Save(thumFileUrl,System.Drawing.Imaging.ImageFormat.Jpeg);

 

-------------------------------------

 

 

줄이는 이미지 사이즈는

120 x 120 정도의 싸이즈가 최적이며

아주 많이 깨져서 사용할만하지 않음.

신고
document.write("");
Posted by 사우람

<첨부파일명입니다. 아래와 같은이름으로 저장하세요 >
template.cs
csharpN11.stx

csharp.acp

다운받은 파일은 Edit+ 폴더에 넣어두시면 됩니다.

 

▧ EditPlus 에서 C# 사용

문서 템플릿 구성

##########0*

추가 버튼클릭

파일제목 : C#
파일 경로:C:\Program Files\EditPlus 2\template.cs
(template.cs 파일은 자기에 맞게 수정해서 사용.)

설정및 구문강조

##########1*

추가버튼 클릭

설명 : C#
파일확장자 : cs
구문파일 : C:\Program Files\EditPlus 2\csharpN11.stx
자동완성 : C:\Program Files\EditPlus 2\csharp.acp
( 자동완성기능은 권장하지 않는다. 사용하지 않을려면 빈칸그대로 둔다.
)

자동줄바꿈

##########2*

탭 : 4 들여쓰기 : 4
탭대신 공백삽입 체크, 자동 들여쓰기 체크
자동들여쓰기 열기 : {
자동들여쓰기 닫기 : }
문장끝 부호 : ;

컴파일 설정

##########3*

추가버튼클릭

프로그램 선택

명령 : C:\WINNT\Microsoft.NET\Framework\v1.0.3705\csc.exe
인수 : 파일이름
디렉토리 : 파일디렉토리
출력내용캡쳐 체크, 열려진 파일 저장 체크

실행 등록

추가버튼클릭

프로그램선택

명령 : 빈칸
인수 : 확장자를뺀파일이름
디렉토리 : 파일디렉터리

CMD 등록
( 컴파일후 실행할때 편하게 하기위해 등록합니다.)

추가버튼클릭

프로그램선택

명령 : C:\WINNT\system32\CMD.EXE
디렉토리 : 파일디렉터리

----------------------------------------------------------------------------------

이것저것 귀찮으면 2.12 이상 버전을 쓰면 된다.
위의 설정은 2.11 이하 버전을 사용할때 설정법이다.

신고
document.write("");
Posted by 사우람

11. [ASP.NET]파일업로드의 구현

 

 

//중복된 파일을 체크해서 새로운이름으로 생성하는 메서드
private string GetUniqueFileName(string strPath,string fn)
{
 //파일이름,확장자를 잘라내는 로직
 int idxDot=fn.LastIndexOf(".");
 string strName=fn.Substring(0,idxDot);//파일명
 string strExt=fn.Substring(idxDot+1);//확장자..

 //같은이름이 있다고 가정하고 루프를 돌면서 확인..
 bool bExist=true;
 int cnt=0;

 while(bExist)
 {
  if(File.Exists(Path.Combine(strPath,fn)))
  {
   cnt++;
   fn=strName+"("+cnt+")."+strExt;
  }
  else
  {
   bExist=false;
  }//if의 끝      
 }//while의 끝..

 //새롭게 생성된 서버측경로+파일명을 리턴한다. 
 return Path.Combine(strPath,fn);
}

//파일업로드 메서드
private void btnFileUp_Click(object sender, System.EventArgs e)
{
 //파일업로드를 한경우라면..
 if(File1.PostedFile != null)
 {
  try
  {
   //클라이언트의 전체경로를 받는다.
   string wholePath=File1.PostedFile.FileName;
   //파일명만 가져온다.
   string filename=Path.GetFileName(wholePath);
   //서버측 물리적인 경로를 지정한다.
   //string serverLoc=Path.Combine(dirPath,"Data");
   //string serverFileLoc=Path.Combine(serverLoc,filename);
   //만약, 팝폴더 기능처럼..현재 내가 방문하고 있는 폴더위치에 파일을 업로드할 경우는 아래의 코드를 이용한다.
   string serverFileLoc=GetUniqueFileName(strPath,filename);
   //Response.Write(serverFileLoc);
   //실제파일을 업로드합니다.
   File1.PostedFile.SaveAs(serverFileLoc);
   //현재페이지의 하위폴더에 파일이 들어갈것이므로 현재페이지를 새로고침할 필요가 없습니다.
   //만약 현재위치에 파일이 올라가는 경우는 현재페이지를 갱신해야할것이다. 다음과 같다.
   Response.Redirect("WebForm1.aspx?Folder="+virPath);
  }
  catch(Exception ex)
  {
   lblErrorMsg.Text="오류발생 : "+ex.ToString();
  }
 }
 else
 {
  lblErrorMsg.Text="찾아보기를 통하여 업로드할 파일을 선택하세요....";
 }
}
 }

신고
document.write("");
Posted by 사우람

ASP.NET 멀티 파일 저장하기

1. Introduction

서버 컨트롤로 간단하게 만들어진 예제이다. 개념적으로 정리 되어야 할 부분이 있다.
우리가  input type="file"  이 HtmlInputFile 컨트롤을 이용하여 멀티파일 페이지를 구현하고자 한다면
두개의 방법을 나누어 알아볼수 있다.

1. 파일 추가-->추가때마다 디스크에 저장-->모두 업로드
2. 파일 추가-->추가때마다 메모리에 저장-->모두 업로드

이렇게 파일로 저장해 놓고 파일 이름을 기억해 놓는방법 1번과 메모리에 저장하는 2번..
이렇게 2개의 방법이 있는것이다. 여기서 소개할 방법은 바로 2번의 방법을 사용하여 구
현한 폼을 보게 될 것이다. 웹application 성능상으로 보나 효율성으로 보나 추천하는 방법은
1번의 방법이다. 하지만 2번의 방법은 나름대로의 발상이 독특하다고 생각되어서 2번의
방법을 강좌로 택하게 되었다.

2. 준비하기

먼저 웹 IIS파일을 만들고 아래의 디자인처럼 컨트롤을 얹어보자.



- ListBox컨트롤  1개
- HtmlInputFile    1개
- Button             3개
- Label               1개

 

3. 주요 CODE 살펴보기

Step 1. 단일파일 메모리에 저장하기

static public ArrayList hif = new ArrayList();//Static파일 생성

...
...
...
#region 2. 파일 추가하기
        private void AddFile_Click(object sender, System.EventArgs e)
        {
            if (Page.IsPostBack == true)
            {
                //넘어온 파일 객체를 메모리에 저장해둔다.
                hif.Add(FindFile);
                ListBox1.Items.Add(FindFile.PostedFile.FileName);
            }
        }
#endregion

생성자 부분에 넘어온 HtmlInputFile 객체를 담아두는 ArrayList를 생성한다.

Step 2. 메모리의 파일 모두저장하기

#region 4. 파일을 모두 저장한다.
private void Button1_Click(object sender, System.EventArgs e)
{
    string baseLocation = Request.MapPath("attachments\\");//저장 폴더
    string status = "";//상태를 저장
            
    //만약 파일이 없다면..
    if(ListBox1.Items.Count == 0)
    {
        Label1.Text = "파일을 추가해주세요";
        return;
    }
    else
    {
        foreach(System.Web.UI.HtmlControls.HtmlInputFile HIF in hif)
        {
            try
            {
                string fn =
System.IO.Path.GetFileName(HIF.PostedFile.FileName);
                HIF.PostedFile.SaveAs(baseLocation + fn);
                filesUploaded++;
                status += fn + "
";
            }
            catch(Exception err)
            {
                Label1.Text = "파일을 저장하는데 에러가 발생하였습니다. " +
baseLocation +  "
" + err.ToString();
                return;
            }
        }
        if(filesUploaded == hif.Count)
        {
 
            Label1.Text = "모두 " +  filesUploaded + " 개의 파일이 업로드 되
습니다.
" + status;
        }
        hif.Clear();
        ListBox1.Items.Clear();
    }
}
#endregion

정리

앞서 소개한데로 멀티 파일을 저장하는데 결코 좋은 방법은 아니라는것을 말해 주고 싶다.하지만
이예제를 응용하여 객체를 저장하여 사용하는 방법을 다루고자 할때 좋은 예제가 될것이다.

 

 작성자 : HOONS(박경훈)
 
 이메일 : tajopkh@hanmail.net
 
 홈페이지 : http://www.hoonsbara.com 

신고
document.write("");
Posted by 사우람

ASP.NET에서 크기 조정된 이미지 출력하기(1) (1) : 이미지 목록 보여주기

##########0*

필자는 어떠한 디렉터리에 있는 이미지들을 리스트로 출력하는 것에 대해서 질문을 받은 적이 있다. 필자는 이미지들을 간단히 리스트로 출력을 할 수 있었다. 하지만 폴더 안의 이미지들이 서로 다른 크기로 되어있기 때문에 이를 그대로 출력하면 보기가 않좋게 된다. 따라서 이번 기사에서는 이미지들의 크기를 특정 크기로 제한하여 출력하는 것에 대해서 다룰 것이다.

이 문제를 해결하기 위해서 필자는 특정 크기보다 이미지의 크기가 더 클 경우 이를 축소시키기로 하였다. 우리가 해야할 것은 두가지이다. 먼저 폴더 안의 이미지들을 리스트로 보여주는 것이고 두번째는 이미지의 크기를 제한하는 것이다. 이번장에서는 이미지들을 리스트로 보여주는 것에 대해서 보겠다.

폴더안의 파일 가져오기

닷넷 프레임웍은 웹 서버의 파일 시스템을 다룰수 있는 다양한 클래스들을 제공한다. 그 중에서 특히 Directory와 File 클래스는 매우 유용한 클래스이다. 예로 여러분이 새로운 텍스트 파일을 하나 만든다면 File.CreateText() 메서드를 사용하면 된다.

폴더 안의 파일들을 가져오려고 한다면 Directory.GetFiles() 메서드를 사용한다. 이 메서드는 폴더 경로와 함께 사용하여 파일의 경로를 문자 배열로 반환한다. 여러분은 이 메서드를 두가지 방식으로 사용할 수 있다.

filesInDirectory = Directory.GetFiles(directoryPath)

directoryPath의 파일 경로들은 문자 배열로 반환된다. 만약 여러분이 특정 확장자를 가진 파일만 가져오고자 한다면 다음과 같이 두번째 파라미터를 추가해주면 된다.

filesInDirectory = Directory.GetFiles(directoryPath, searchPattern)

searchPattern은 와일드카드 심볼을 사용한다. 예를 들어 여러분이 C:\SomeDir 폴더의 텍스트 파일만 가져오고 싶다면 다음과 같이 하면 된다.

string[] textFiles = Directory.GetFiles("C:\SomDir", "*.txt")

폴더안의 이미지 파일들의 목록을 가져왔으니 이제 남은 것은 웹 페이지에 뿌려주는 일이다. 모든 이미지들을 출력하기 위해서 다음과 같은 코드를 사용하였다. (폴더안에는 이미지 파일만 있기 때문에 패턴을 사용하지는 않았다.)

foreach(string s in Directory.GetFiles(ImageDirectoryPath)
{
   ...
}

그럼 foreach 블럭 안에는 어떠한 것이 들어가야 하는가? 루프가 실행되면서 문자 s 에는 파일의 물리적 경로가 들어가게 된다. 따라서 이미지를 보여주는 태그인 src 태그를 동적으로 생성하면 된다.

foreach(string s in Directory.GetFiles(ImageDirectoryPath)
{
   html = "<a href='/ImageDirectoryPath/"+Path.GetFileName(s)+"'>"+
	 "<img src='ImageDirectoryPath/"+Path.GetFileName(s)+"'>"+
	 "</a>";
}

Path.GetFileName() 메서드는 파일의 경로에서 파일 이름을 추출하는 역할을 한다. 문자 변수 s 에는 "C:\Images\Files.gif" 같은 형식으로 들어가 있다는 것을 명심하자. 그리고 추출한 파일이름을 사용하여 img 태그를 완성하였다.

이제 이를 웹 페이지에 출력을 하도록 하자. 필자는 여기서 DataList 컨트롤을 사용하였다. 데이터리스트 컨트롤에 보여주기 위해서는 문자 변수 html 값들을 배열 같은 것에 저장할 필요가 있다. 따라서 아래의 코드에서는 문자 변수 html 값을 ArrayList pics에 추가하는 코드를 볼 수 있다. 아래는 전체 코드이다.

##########1*
[HTML 부분]

##########2*
[코드 부분]

먼저 주의할 사항이 있는데 코드 부분에서 반드시 System.IO 네임스페이스를 추가해주어야 한다. 그래야만 Directory, File 클래스를 사용할 수 있다. 그리고 ArrayList 안의 내용을 출력하기 위해서 데이터리스트 컨트롤의 ItemTemplate 안에 바인딩 구문을 추가하였다.

이를 실행한 결과는 다음과 같다.

##########3*

결과를 보면 여러 이미지의 크기가 들쭉날쭉 한것을 볼 수 있다. 별로 보기에는 안좋다. 따라서 다음장에서는 동적으로 이 이미지들의 크기를 조정하는 것에 대해서 보도록 하겠다.



제공 : 코리아인터넷닷컴, a 2003년 02월 26일

ASP.NET에서 크기 조정된 이미지 출력하기(2) (2) : 동적으로 이미지 크기 조정

##########4*

저번장에서 우리는 어떻게 이미지들을 리스트처럼 웹페이지에 뿌려주는지에 대해서 보았다. 하지만 이미들의 크기가 다양해서 결과는 눈에 보기 좋은 형태가 아니었다. 따라서 이번장에서는 닷넷 프레임웍의 Image 클래스를 사용하여 동적으로 이미지 크기를 조정하는 것에 대해서 보겠다.

너비와 높이 정하기

먼저 해야될 것은 모든 이미지에 적용할 너비와 높이를 정하는 것이다. 데이터리스트 컨트롤에서 3 컬럼씩 보여주도록 하였기 때문에 필자는 이미지의 크기가 200 픽셀을 넘지 않도록 하였다. 또한 높이도 200 픽셀을 넘지 않도록 하였다.

이제 출력될 이미지의 크기를 결정하였으니 실제 이미지의 크기를 이에 맞추어 조정하도록 하자. 그러기 위해서 필자는 Image 클래스를 사용할 것이다. 다음의 코드는 특정 파일에서 새로운 Image 클래스의 인스턴스를 생성하는 구문이다.

Image myImage = Image.FromFile(이미지 파일의 물리적 경로);

Image 클래스의 인스턴스를 생성하면 우리는 Height, Width 속성을 사용하여 이미지의 너비와 높이를 구할 수 있다. 아래의 코드는 저번장에서 보았던 코드에 Image 클래스를 사용하여 너비와 높이를 조정하는 코드를 추가한 코드이다.

##########5*
##########6*

위의 코드를 보면 각각의 이미지의 너비와 높이를 구하고 한계치인 200 픽셀을 넘는지 검사한다. 200 픽셀보다 작다면 실제 이미지 크기 그대로 보여준다. 만약 200 픽셀을 넘는다면 실제 너비, 높이 값과 한계치 너비, 높이 값의 차이(델타값)를 구한다. 이 값은 이미지를 얼마나 조정해야 되는지를 결정하는 값이다.

예를 들어 너비 500 픽셀, 높이 300 픽셀짜리의 이미지가 있다고 하자. 그렇다면 너비의 델타값은 300 픽셀이 나오고 높이의 델타값은 100 픽셀이 된다. 너비의 델타값이 높이의 델타값보다 크기 때문에 한계 너비값을 이미지의 너비값으로 나눈값(200/500)을 사용하여 너비를 조정하게 되면 200 픽셀에 맞추어지게 된다. 이미지의 높이 값도 동시에 조정이 된다. 따라서 이 이미지는 조정후 너비 200 픽셀에 높이 120 픽셀의 값을 가진다. 다음은 실행한 결과이다.

##########7*

이번장에서는 동적으로 이미지의 크기를 조정하는 것에 대해서 알아보았다. 하지만 이번에 다룬 내용을 사용하면 이미지의 크기는 온전한 크기를 가지게 되어 그 크기를 다 다운을 받아야 된다. 다음장에서는 실제 이미의 크기까지 조정하는 것에 대해서 보도록 하겠다.



제공 : 코리아인터넷닷컴, a 2003년 02월 27일

ASP.NET에서 크기 조정된 이미지 출력하기(3) (3) : Image 클래스의 GetThumbnailImage 메서드

##########8*

저번 장에서 우리는 어떻게 폴더안의 이미지를 리스트로 불려들여서 크기를 조정하는지 보았다. 저번장 마지막에서 잠깐 언급했지만 저번장의 방식은 실제 이미지의 크기를 조정하는 것이 아니었다. 단지 img 태그를 사용하여 조정할 뿐이다. 예로 가로세로 400 픽셀짜리의 100kb 크기의 이미지가 있다면 저번장의 방식으로는 다음과 같이 줄이게 된다.

<img src="BigFile.gif" width="200" height="200"/>

그러면 브라우져에서는 가로 세로 200 픽셀로 보여지게 되지만 실제 파일의 크기는 그대로이다. 이것은 100kb 이미지 파일을 그대로 웹서버에서 다운을 받아서 브라우져에서 크기를 조정한다는 것이다. 실제 200 픽셀짜리 이미지라면 100kb 보다는 작을 것이다. 기사에서는 Image.GetThumbnailImage() 메서드를 사용하여 실제적으로 이미지 크기를 조정하는 것에 대해서 것이다.

페이지에 이미지 출력

이번에는 이미지의 경로를 담은 쿼리스트링을 통해서 ASP.NET 웹페이지에 이미지를 보여주는 방식을 사용할 것이다. 여러분이 웹서버에 있는 /images/SomeImage.jpg 라는 이미지를 ShowImage.aspx 페이지에서 호출한다고 하면 다음과 같이 태그를 작성한다.

<img src="ShowImage.aspx?img=/images/SomeImage.jpg"/>

이러한 방식을 사용하기 위해 System.Drawing 네임스페이스의 Image 클래스를 사용할 것이다. 클래스에는 save() 메서드가 있는데 이미지를 저장할 스트림, 이미지의 포맷 두가지 인자를 가진다. 다행히도 Response 개체는 OutputStream 속성을 가지고 있다.

다음의 코드를 보도록 하자.

<%@Import Namespace="System.Drawing.Imaging" %>

<script language="VB" runat="server">

  Sub Page_Load(sender as Object, e as EventArgs)

 

    '섬네일 이미지를 만들기 위한 이미지 이름을 얻는다.

    Dim imageUrl as String = Request.QueryString("img")

   

    '이미지 경로에는 /,\ 문자가 있으면 안된다.

    If imageUrl.IndexOf("/") >= 0 Or imageUrl.IndexOf("\") >= 0 then

      '/,\ 문자를 찾았을 경우

      Response.End()

    End If

   

    '이미지를 경로를 추가

    imageUrl = "/images/" & imageUrl

   

    '이미지를 얻는다.   

    Dim fullSizeImg as System.Drawing.Image

    fullSizeImg = System.Drawing.Image.FromFile(Server.MapPath(imageUrl))

   

    '이미지의 ContentType "image/gif"로하고 출력한다.

    Response.ContentType = "image/gif"

    fullSizeImg.Save(Response.OutputStream, ImageFormat.Gif) 

  End Sub

</script>

여기서 보아야 것은 Image 클래스를 사용하는 부분이다. 그전에 Page_Load 이벤트 핸들러부터 보도록 하자. 먼저 쿼리스트링을 읽어들여서 이미지 경로를 저장한다. 그리고 경로에는 어떠한 "/", "\" 문자도 있지 않도록 한다. 문자를 검사한 Image 클래스를 생성하여 이미지 경로의 이미지를 지정하고 이를 "image/gif" 형식으로 웹페이지에 보여주게 한다.

GetThumbnailImage 메서드 사용

Image 클래스는 동적으로 이미지를 조정하여 즉시 그려내는 GetThumbnailImage() 메서드를 가지고 있다. 이것은 여러분이 100kb 짜리 가로 세로 400 픽셀 이미지를 GetThumbnailImage 메서드를 사용하여 가로 세로 50 픽셀짜리 만든다면 크기는 아마도 25kb 정도가 될것이다.

GetThumbnailImage 메서드는 Image 클래스에 포함되어 있다. Image 클래스의 인스턴스에서 메서드를 호출할때 이미지는 지정한 크기로 축소되며 축소된 이미지의 다른 Image 인스턴스가 반환된다. GetThumbnailImage 메서드는 다음과 같은 형태를 가지고 있다.

Public Function GetThumbnailImage( _

   ByVal thumbWidth As Integer, _

   ByVal thumbHeight As Integer, _

   ByVal callback As Image.GetThumbnailImageAbort, _

   ByVal callbackData As IntPtr _

) As Image

thumbWidth thumbHeight 축소된 이미지의 가로 세로 크기를 말한다. 세번째 파라미터는 델리게이트를 필요로 하며 델리게이트는 메서드를 참조하는 참조 타입이다. 여러분이 C C++ 알고 있다면 펑션 포인터랑 비슷하다는 것을 있다. 델리게이트를 작성하려면 여러분은 다음과 같은 코드를 ASP.NET 웹페이지에 넣어야 한다.

Public Function FunctionName as Boolean

  Return False

End Function

그리고나서 GetThumbnailImage 메서드를 호출할 함수나 서브루틴에 다음의 코드를 추가하여야 한다.

Dim dummyCallBack as System.Drawing.Image.GetThumbNailImageAbort

dummyCallBack = New _

      System.Drawing.Image.GetThumbnailImageAbort(AddressOf FunctionName)

GetThumbnailImage 메서드의 마지막 파라미터인 callbackdata 반드시 IntPtr.Zero 값을 넘겨야 한다. 아래의 코드는 GetThumbnailImage 메서드를 사용하는 간단한 예제이다.

Function ThumbnailCallback() as Boolean

  Return False

End Function

 

Sub Page_Load(sender as Object, e as EventArgs)

  'Create the delegate

  Dim dummyCallBack as System.Drawing.Image.GetThumbNailImageAbort

  dummyCallBack = New _

    System.Drawing.Image.GetThumbnailImageAbort(AddressOf ThumbnailCallback)

     

  Dim fullSizeImg as System.Drawing.Image

  fullSizeImg = System.Drawing.Image.FromFile("C:\Images\someImage.gif")

 

  Dim thumbNailImg as System.Drawing.Image

  thumbNailImg = fullSizeImg.GetThumbnailImage(100, 100, _

                                         dummyCallBack, IntPtr.Zero)

 

  ...

End Sub

위의 코드는 Image 클래스의 인스턴스를 생성하고 GetThumbnailImage 메서드를 사용 이미지를 가로 세로 100 픽셀로 줄이는 예이다. 이제 어떻게 섬네일 이미지를 생성하는지 다음장에서 보도록 하자.



제공 : 코리아인터넷닷컴, a 2003 02 28

 

ASP.NET에서 크기 조정된 이미지 출력하기(4) (4) : Thumbnail 이미지 생성

##########9*

저번장에서 우리는 GetThumbnailImage 메서드에 대해서 알아보았다. 이번장에서는 실제 이미지를 축소하여 보여주는 코드를 보도록 하겠다. ShowImage.aspx 페이지에서 이미지를 보여주는데 이 이미지는 ShowThumbnail.aspx 페이지에서 처리되어서 보여지게 된다.

ShowThumbnail.aspx

먼저 이미지를 축소하는 ShowThumbnail.aspx 페이지부터 보도록 하겠다. 필자는 새로운 ASP.NET 웹 프로젝트를 VB.NET 용으로 생성하였다. 그리고 시작 페이지는 ShowImage.aspx 페이지이고 새로운 웹 페이지를 추가하여 이름을 ShowThumbnail.aspx로 하였다. ShowThumbnail.aspx 페이지는 이미지를 축소시켜서 출력시키는 일만 하면되기 때문에 디자인에 추가될 것은 없다. 코드를 보도록 하자.

##########10*

먼저 System.Drawing.Imaging 네임스페이스를 추가한다.

##########11*

델리게이트를 위한 함수를 생성한다.

##########12*

쿼리스트링으로 받아온 h와 w 값을 imageHeight와 imageWidth로 한다음 받아온 이미지 경로에 "/", "\" 문자가 있는지 검사를 한다. 그 아래의 IF문은 가로, 세로값이 명시되어있는지 아닌지에 대한 검사이다. 있다면(줄여야 한다면) GetThumbnailImage 메서드를 호출하여 이미지를 조정하게 된다. 줄일 필요가 없다면 원래 크기 그대로 이미지를 출력한다.

ShowImage.aspx

이제 이미지의 목록을 보여주는 ShowImage.aspx 페이지를 보도록 하자. 첫번째 장에서 우리는 이미지의 목록을 어떻게 보여주는지에 대해서 보았다. 이 페이지도 동일한 방법을 사용하고 있다. 다만 img 태그에서 직접 이미지를 호출하는 대신에 이번 방식에서는 ShowThumbnail.aspx로 이미지 경로를 보내서 조정된 이미지를 출력하게 된다.

##########13*

HTML 섹션이다. 저번장과 동일하게 데이터리스트 컨트롤을 사용한다.

##########14*

Directory, File 클래스를 사용하기 위해서 System.IO 네임스페이스를 참조한다.

##########15*

이미지가 축소되어야할 크기를 정하는 코드로 이 부분은 두번째 장에서 이미 다루었기 때문에 넘어가기로 하겠다.

##########16*

바뀌어진 부분은 이곳이다. img 태그에서 직접 이미지를 호출하던 것을 이미지의 이름을 ShowThumbnail.aspx에 쿼리스트링으로 첨부하여 보내게 된다. 그러면 ShowThumbnail.aspx에서는 이미지의 크기를 조정하여 출력하게 된다.

##########17*

컴파일을 하고 실행한 화면이다. 오른쪽에서 가운데 있는 이미지의 크기를 보았다. 15396 바이트로 되어있다.

##########18*

이미지를 클릭하여 실제 크기의 이미지를 본 화면이다. 크기는 30321 바이트로 되어있다.

지금까지 우리는 어떻게 동적으로 이미지의 크기를 조정하는지에 대해서 알아보았다. 첫번째, 두번째 장에서는 img 태그를 사용하여 이미지의 크기를 브라우져에서 조정하도록 하는 것에 대해서 보았고 세번째, 네번째 장에서는 Image 클래스의 GetThumbnailImage 메서드를 사용하여 실제 이미지의 크기를 조정하여 출력하도록 하였다.



제공 : 코리아인터넷닷컴, a 2003년 03월 03일

신고
document.write("");
Posted by 사우람

Taeyo's ASP.NET

 

 강좌 최초 작성일 : 2005년 07월 29일
 
 강좌 최종 수정일 : 2005년 08월 01일

 

 작성자 : Taeyo(김 태영)
 
 편집자 : Taeyo(김 태영)

 

 강좌 제목 : DataGrid를 간단하게 Excel로 변환하기

강좌 전 태오의 잡담>

세월은 정말로 빠릅니다. 어느덧 사이트를 운영한지도 만 7년이 훌쩍 넘어버렸네요.
7년 4개월째라니... 거 참..

과연 3년 뒤에도 사이트는 존재하고 있을까요? 그랬으면 하는 바램입니다.


저번 강좌에서 여러분은 ASP.NET 페이지가 이미지로 둔갑하는 멋진 액숀을 보셨습니다. 이번 강좌에서는 그 지식을 기반으로 해서, DataGrid의 내용을 아주 쉽게 Excel로 다운로드 시키는 방법에 대해서 알아보고자 합니다.

참고로, 이 글은 http://azamsharp.net/DataGridExport.htm의 컬럼을 참고로 하여 재 작성한 것임을 밝힙니다.

단, 이번 강좌에서 다루는 방법은 아주 단순하고 빠르게 DataGrid의 데이터를 추가적인 변경작업이나 필터링없이 Excel로 단순 출력하고자 하는 경우에만 유용한 방법입니다. 그 외의 추가적인 요구사항이 있을 경우에는 이 방법을 사용할 수 없을 것입니다. 어떤 추가적인 처리가 필요한 경우에는 www.codeproject.com과 같은 사이트에서 ASP.NET에서 엑셀을 제어하는 샘플 소스들을 구해서 그를 응용하여 구현하셔야 할 것입니다. 물론, 그 경우에는 구현이 간단하지도 않겠죠?

하지만, 간단한 수준의 엑셀 출력이라면 그런 복잡한 방법을 사용하지 않고도 가능합니다. 왜냐하면, 최신 Excel 어플리케이션은 HTML 태그를 인식하기 때문입니다. 근데, 말입니다. HTML을 지원하기 시작한 Excel의 버전이 몇 부터인지는 죄송하게도.. 잘 모르겠습니다. ㅜㅜ(아마도 Excel 2002부터가 아닌가 하는데..) 혹시, 아시는 분이 있다면 연락주시면 바로 여기에 추가적으로 기입하도록 하겠습니다.

먼저, 엑셀이 HTML을 지원한다는 것을 확인해보는 것으로 시작해 보도록 하겠습니다. 이를 위해서, 여러분이 매우 자주~ 습관적으로 편하게~ 임시 데이터를 저장하는 장소인 [바탕화면]에 다음과 같은 HTML 태그들을 갖는 html 페이지를 하나 만들어 주세요.

    
<table>
    <tr>
        <td>아이디</td>
        <td>이름</td>
        <td>성별</td>
    </tr>
    <tr>
        <td>taeyo</td>
        <td>김태영</td>
        <td>남</td>
    </tr>
    <tr>
        <td>queeny</td>
        <td>욘쟈</td>
        <td>여</td>
    </tr>
    <tr>
        <td>hyunny</td>
        <td>김영현</td>
        <td>남</td>
    </tr>
    <tr>
        <td>vangelis</td>
        <td>성지용</td>
        <td>남</td>
    </tr>
    <tr>
        <td>dukyoung</td>
        <td>김덕영</td>
        <td>남</td>
    </tr>
</table>

그리고, 이 파일을 test.htm 이라고 저장합니다. ^^ 저장이 되셨다면, 이를 Excel 프로그램을 이용해서 열어보세요 ^^ 그러면, 다음과 같이 멋들어지게 Excel로 말끔하게 열리는 것을 볼 수 있을 것입니다.

##########5*

멋지죠? 여기까지만 설명드려도... 오호라, 이렇다면 그리드의 데이터를 엑셀로 출력하는 것은 정말로 쉽겠구나 하시는 분들이 있죠? 여기 저기서 많이 보이네요.. 하~ 정말이지. 너무 쉬운듯 했네요. 이런 쉬운 내용을 강좌로 올리다니 배신이야 하시는 분들도 조금 보이고.. ㅠㅠ

그렇군요... 그렇다면, 굳이 더 진행을 하지 않아도 될 듯 합니다.


라고 끝을 내면... 허걱!!! 매우 곤란한 지경에 빠질 수 있다는 사실을 압니다. 잠깐의 장난에 대해서도 여러분의 강력한 포스가 느껴지는 군요..

그렇다면, 계속해 보겠습니다. ^^ 방법은 다음과 같습니다. 엑셀이 HTML을 지원하니, DataGrid의 결과 HTML을 얻어서 이를 엑셀로 둔갑시켜 다운로드 시키는 것입니다. 저번 강좌에서 ASP.NET 페이지를 이미지로 둔갑하는 것을 해 보았으니, ASP.NET 페이지를 Excel로 변환하는 것 또한 어렵지 않을 것이라는 것을 아실 것입니다. 문제는 DataGrid의 데이터를 HTML로 얻어내는 것이지요.

하지만, 이 또한 어렵지 않습니다. 왜냐하면, 모든 ASP.NET 서버 컨트롤들은 그 컨트롤이 보유하고 있는 데이터를 기본적으로 HTML로 출력하기 때문입니다. 우리는 DataGrid 컨트롤의 RenderControl()라는 메서드를 이용해서 그러한 데이터를 얻어낼 수가 있습니다. 그리고, 그것을 브라우저를 통해서 화면에 다운로드 시킬 수 있죠.

그렇다면, 소스를 한번 볼까요? 일단, 테스트를 위해서 작성한 웹 폼의 디자인은 다음과 같습니다. DataGrid 컨트롤 하나와 Button 컨트롤 하나죠~ 덜렁~

##########6*

그리고, 제가 작성한 코드 비하인드 코드는 다음과 같습니다.

    
public class GridExportTest : System.Web.UI.Page
{
    protected System.Web.UI.WebControls.DataGrid DataGrid1;
    protected System.Web.UI.WebControls.Button Button1;

    private void Page_Load(object sender, System.EventArgs e)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = "server=.;database=pubs;uid=***;pwd=***";

        SqlCommand cmd = new SqlCommand("Select * from Authors", con);
        SqlDataAdapter a = new SqlDataAdapter(cmd);

        DataSet ds = new DataSet();
        a.Fill(ds);

        DataGrid1.DataSource = ds;
        DataGrid1.DataBind();
    }

    private void Button1_Click(object sender, System.EventArgs e)
    {
        Response.Clear();
        Response.AddHeader("content-disposition", "attachment;filename=DataGrid.xls");
        Response.ContentType = "application/vnd.xls";

        System.IO.StringWriter stringWriter = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
        DataGrid1.RenderControl(htmlWriter);

        Response.Write(stringWrite.ToString());
        Response.End();
    }
}

설명을 일단 간단하게 드리자면, 페이지가 로드될 경우 DataGrid에다가 MS-SQL 서버의 Pubs 데이터베이스에 있는 데이터를 로드 하구요. Excel Download라는 버튼이 눌릴 경우, 포스트백과 동시에 DataGrid의 데이터를 얻어와서 그 것을 엑셀 형식으로 다운로드 시키는 것입니다.

코드를 모두 작성하셨다면, 실행하여 결과를 보도록 하세요 ^^

##########7*

그러면, 위와 같이 엑셀 다운로드 창이 뜨구요. [열기] 버튼을 누르면 뜨거운 열기를 뿜어대며 다음과 같이 Excel 응용 프로그램이 뜨는 것을 보실 수 있을 것입니다.

##########8*

멋지죠? 또한, 간단하죠?

오오.. 뭔가 뜨거운 기운이 느껴집니다.

그렇다면, 이제 코드를 살펴보도록 하겠습니다. 핵심이 되는 코드는 역시나 Button1_Click 이겠죠?

우선, 버튼이 클릭될 경우에는 저번 강좌에서 설명드렸던 것처럼, Response.Clear() 메서드를 통해서 버퍼에 존재할 지 모르는 모든 데이터를 제거합니다. 즉, 이제부터 작성되는 데이터만을 클라이언트의 브라우저로 내려보내기 위해서 기존 버퍼를 말끔히 비우는 것이지요. ^^

그 다음에는, Response.AddHeader("content-disposition", "attachment;filename=DataGrid.xls") 를 통해서 내려보낼 파일의 이름을 DataGrid.xls라고 지정합니다. 반드시 필요한 코드는 아니겠지만, 이렇게 명칭을 주는 것이 파일을 받아보는 사용자 입장에서는 더욱 분간이 쉬울 것입니다. 만일, 이 한 줄의 코드가 없다면 사용자는 aspx 파일 확장자를 갖는 Excel 파일을 보게 될테니까요 ^^

Response.ContentType = "application/vnd.xls"는 현재 내려보낼 데이터의 형식을 지정해 주는 부분입니다. 이 코드를 통해서 지금부터 내려보낼 데이터는 엑셀(Excel) 데이터라는 것을 클라이언트 브라우저가 인식할 수 있게 됩니다. ^^

자. 여기까지의 코드로 엑셀을 내려보내기 위한 환경적인 준비는 모두 된 것 같네요. 그렇다면, 이제부터는 실제로 Excel을 위한 데이터를 내려보낼 차례입니다.

무엇보다 먼저,데이터를 문자열로 기록하기 위한 클래스인 StringWriter의 개체가 필요할 것입니다. System.IO.StringWriter stringWriter = new System.IO.StringWriter()는 이를 위해 StringWriter 개체를 생성하는 코드입니다.

그리고, HTML 관련 문자 및 텍스트를 순차적으로 쓰기 위해 필요한 클래스인 HtmlTextWriter 클래스 인스턴스를 생성합니다. 이는 생성자의 인자로 방금 앞에서 만들어 둔 StringWriter 개체를 사용하게 됩니다.

DataGrid1.RenderControl(htmlWriter)는 DataGrid의 HTML 출력 렌더를 HtmlTextWriter에 기록하는 작업을 수행합니다. 이로써, 우리는 그리드의 출력을 HtmlTextWriter에 저장할 수 있게 됩니다. 이 작업이 핵심이라 볼 수 있겠네요 ^^

이제 마지막으로, DataGrid의 출력결과 HTML을 Response.Write(stringWrite.ToString())를 통해서 문자열로 브라우저의 화면에 출력합니다. 그러면, 이 모든 HTML 데이터는 실제로는 HTML 태그이지만, 엑셀 타입 형식으로 클라이언트에게로 내려가게 될 것입니다. ^^

생각보다 대단히 간단합니다. 원하는 컨트롤의 출력 HTML을 그대로 브라우저를 통해서 내려주면서, 파일의 형식만을 바꿔주면 되는 것이죠. 같은 방식으로 DataGrid의 출력물을 Excel이 아닌 Word 파일로도 내려보낼 수 있습니다. 왜냐하면, Microsoft Word도 HTML을 인식하거든요. ^^

말이 나온 김에 한번 해 볼까요?

기존의 코드에서 Response.AddHeader() 부분과 Response.ContentType을 주는 부분을 Excel이 아닌 Word 로 바꿔주기만 하면 간단하게 해결이 됩니다. ^^ 다음과 같이 말이죠 ^^

    
    private void Button1_Click(object sender, System.EventArgs e)
    {
        Response.Clear();
//     Response.AddHeader("content-disposition", "attachment;filename=DataGrid.xls");
//     Response.ContentType = "application/vnd.xls";

        Response.AddHeader("content-disposition", "attachment;filename=DataGrid.doc");
        Response.ContentType = "application/vnd.word";


        System.IO.StringWriter stringWriter = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
        DataGrid1.RenderControl(htmlWriter);

        Response.Write(stringWrite.ToString());
        Response.End();
    }
}

코드를 모두 작성하셨다면, 실행하여 결과를 보도록 하세요 ^^. 그리드의 출력모습은 동일하겠지만, 버튼을 클릭할 경우 이번에는, 엑셀 다운로드 창이 아닌 워드 다운로드 창이 뜨는 것을 보실 수 있을 것입니다.

##########9*

그리고, [열기] 버튼을 누르면 매우매우 뜨거운 열기를 마구마구 뿜어대며 다음과 같이 워드 응용 프로그램이 실행되어 그리드가 출력되는 것을 보실 수 있을 것입니다.

##########10*

재미있죠???

다시 한번 강조하지만, 이 방법은 DataGrid의 출력 결과를 간단하게 엑셀이나 워드로 Export하고자 하는 경우에만 사용할 수 있습니다. 즉, 매우 제한적인 상황에서만 사용이 가능한 방법이라는 것이죠. 하지만, 그렇다 하더라도 상당히 유용하게 써먹을 수 있을 것입니다. ^^ 의외로 단순 엑셀 출력을 요구하는 경우는 많으니까요 ^^;

그런데, 안타까운 것은 대부분의 경우 프로젝트 시, 클라이언트들은 말입니다. 설계 시에는 단순 출력만 되면 된다고 말했으면서도, 막상 이렇게 만들어주면 더 추가적인 기능을 요구하는 경우가 많다는 것입니다. 쩝... ㅜㅜ 해서, 의외로 엑셀을 더 세밀하게 제어해야 할 필요가 있는 경우도 많을 것입니다. 그 때에는... 어떻게 해야 할까요?

그때는 홧팅을 해야 할 것입니다. ^^
마음을 가라앉히고, http://www.codeproject.com을 살펴주는 센스!!도 필요할 것이구요 ^^

그럼 다음 시간에 또 뵐께요~

 

신고
document.write("");
Posted by 사우람

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace CSharpUpload
{
///


/// Summary description for WebForm1.
///

public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.HtmlControls.HtmlInputFile File1;
protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///

private void InitializeComponent()
{
this.Submit1.ServerClick += new System.EventHandler(this.Submit1_ServerClick);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void Submit1_ServerClick(object sender, System.EventArgs e)
{
if( ( File1.PostedFile != null ) && ( File1.PostedFile.ContentLength > 0 ) )
{
string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
string SaveLocation = Server.MapPath("Data") + "\\" +  fn;
try
{
File1.PostedFile.SaveAs(SaveLocation);
Response.Write("The file has been uploaded.");
}
catch ( Exception ex )
{
Response.Write("Error: " + ex.Message);
}
}
else
{
Response.Write("Please select a file to upload.");
}
}
}
}
 

 

출처 : www.msdn.microsoft.com

신고
document.write("");
Posted by 사우람


티스토리 툴바