특정 폴더에 있는 이미지를 웹 화면에 출력해야 하는데, 그 폴더를 웹 가상 디렉토리로 만들기가 힘든 상황이 있을 수가 있다. 아무래도 웹 가상 디렉토리로 노출되는 것은 보안에 문제가 있을 수 있다는 것을 의미하고, 그 폴더가 이미지 외에도 많은 내부 자료들이 들어있는 공용 스토리지라면 가상 디렉토리로 만드는 것은 좋지 않은 선택이다.
이럴 때, 이미지 파일을 읽어서 웹 화면에 출력해줄 수 있는 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 Esposito의 Image Generation Service for ASP.NET 1.1를 참조하기 바란다.
그리고, 위 샘플 코드는 파일 경로가 GET 파라미터로 완전히 보이기 때문에 그냥 사용하면 안된다. 적어도 파일 명 앞의 경로는 Config 파일에 두는 방법을 사용하길 바란다.
'asp.net' 카테고리의 다른 글
[Article]Cookie-less Session in ASP.NET (ASP.NET에서 쿠키 없는 세션 사용하기) (2) | 2007.11.22 |
---|---|
[Etc]IIS 7.0 (2) | 2007.02.15 |
[HowTo]Web Deployment Project (0) | 2006.10.01 |
[HowTo]ASP.NET Master Page에서 자바스크립트로 Content Page의 컨트롤 제어(C#) (4) | 2006.09.18 |
[Tip]ASP.NET 2.0에서 웹 파트를 프로그래밍 방식으로 페이지에 추가하기(C#) (0) | 2006.06.21 |