asp.net2006.11.19 01:19


특정 폴더에 있는 이미지를 웹 화면에 출력해야 하는데, 그 폴더를 웹 가상 디렉토리로 만들기가 힘든 상황이 있을 수가 있다. 아무래도 웹 가상 디렉토리로 노출되는 것은 보안에 문제가 있을 수 있다는 것을 의미하고, 그 폴더가 이미지 외에도 많은 내부 자료들이 들어있는 공용 스토리지라면 가상 디렉토리로 만드는 것은 좋지 않은 선택이다.

이럴 때, 이미지 파일을 읽어서 웹 화면에 출력해줄 수 있는 ASPX 웹 페이지 코드를 소개한다. 아래 코드는 서버의 파일명을 파라미터로 받아서, 그 파일을 이미지 형태로 웹 화면에 출력하는 코드이다.

일단, ASPX 페이지에는 아무런 HTML 코드가 없어야 한다. 아래와 같이 ASPX 페이지 지시자만 놔두고 모두 삭제하도록 한다.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

비하인드 코드는 다음과 같다. 아래 코드는 Page_Load 이벤트 핸들러에 두면 된다.

System.Byte[] arrBytes = null; //파일을 바이트로 읽기 위한 변수를 선언
string fileName = null; //파일명을 받을 변수 선언

try
{
  Response.ContentType = "image/jpeg" //Content Type을 반드시 image/jpeg 혹은 image/gif 등의 image 유형으로 지정해야 한다.
  fileName = Request["FileName"];

  if (!String.IsNullOrEmpty(fileName)) //파일명이 전달되지 않았을 때의 분기
  {
   arrBytes = new System.Byte[1000000]; //바이트를 넉넉하게 지정하자. 이 크기가 파일보다 작다면 에러가 발생한다.
   System.IO.FileStream fs = null; //파일을 읽기 위해 파일스트림 선언
   string filePath = fileName;
   string defaultFilePath = "c:\\camels.jpg" //파일이 존재하지 않을 때 사용할 이미지
   if (System.IO.File.Exists(filePath))
   {
     fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
   }
   else
   {
     fs = new System.IO.FileStream(defaultFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
   }

   fs.Read(arrBytes, 0, 1000000);
   fs.Flush();
   fs.Close(); //파일스트림객체는 사용한 후에 반드시 해제해야 한다.

   Response.Clear();
   Response.OutputStream.Write(arrBytes, 0, arrBytes.Length); //웹 Response에 파일을 직접 쓴다. 이로써 이미지가 출력된다.
  }
  else
  {
   throw new Exception("파일명이 지정되지 않았습니다");
  }
}
catch (Exception ex)
{
  Response.Write(ex.ToString());
}


이 ASPX 페이지는 다음과 같이 사용하면 된다.

<img src="default.aspx?FileName=C;\\Camels.jpg"/>


사실, 이렇게 이미지를 웹 페이지로 출력하는 방법은 그렇게 좋은 방법은 아니다. 사실은 HttpHandler를 사용하는 것이 더 좋다. HttpHandler를 사용하는 방법은 Dino EspositoImage Generation Service for ASP.NET 1.1를 참조하기 바란다.

그리고, 위 샘플 코드는 파일 경로가 GET 파라미터로 완전히 보이기 때문에 그냥 사용하면 안된다. 적어도 파일 명 앞의 경로는 Config 파일에 두는 방법을 사용하길 바란다.

Posted by kkongchi

댓글을 달아 주세요

  1. 이 토픽을 말씀하시고 싶으신 거죠? ^^

    웹 다운로드
    웹 응용 프로그램에서 보다 효율적인 ASP.NET 파일 다운로드 구축

    ; http://www.microsoft.com/korea/msdn/msdnmag/issues/06/09/WebDownloads/default.aspx

    2006.11.20 23:47 [ ADDR : EDIT/ DEL : REPLY ]
    • 오예!
      바로 그겁니다..ㅎㅎㅎ
      닷넷1.X에서는 header가 무조건 UTF-8로 고정되서 긴 한글이름 파일명이 깨진다던지 문제가 많았는데 2.0에서는 아주 좋아졌더군요

      2006.11.21 02:20 [ ADDR : EDIT/ DEL ]
  2. 예전 사이트 개발할적에 이런 유사한 코드를 쓴적이 있군요. 스토리지의 파일을 첨부파일로 내려보낼적에 index값으로 파일이름을 저장한다음 DB에서 실제 파일이름을 다시금 구해와서 해당 파일을 내려보낼적에 강제로 이름변환을 해서 내려보냈던 기억이... ^^

    2006.11.21 17:19 [ ADDR : EDIT/ DEL : REPLY ]
    • 네 저도 index나 guid로 서버에 저장되는 파일이름을 만드는 것을 선호하는데, 간혹 백업이나 관리 등등의 이유로 실제 파일 이름으로 서버에 저장되는 것을 선호하는 고객들도 있더군요..

      2006.11.22 10:56 [ ADDR : EDIT/ DEL ]
  3. 아. 닷넷 개발자셧군요~ ^^

    2007.01.25 11:52 [ ADDR : EDIT/ DEL : REPLY ]
  4. ㅎㅎ 자주 들를께요~ 좋은글 많이 쓰세요~
    아 참고로 저는 자바개발자입니다.
    지금은 게임서버만들고 있네요.~

    2007.01.26 10:02 [ ADDR : EDIT/ DEL : REPLY ]