|
임프랍니다.
음.. 질문의 요지가 잘 파악이 안되는데요. 자료실의 글 읽기로 들어가셔서 페이지의 소스를 보시면
아시겠지만, 그것 역시 < a> 태그를 사용합니다. 단지, href=~ 로 지정된 링크가 정적인 파일이 아니라
ISAPI dll로 연결된 것이죠.
C++Builder나 델파이의 웹브로커를 이용하면 ISAPI dll에서의 다운로드 동작은 무쟈게 간단합니다.
다음은 실제로 이 게시판에서 사용되고 있는 다운로드 소스의 일부입니다.
몇줄의 소스가 빠졌습니다만 다운로드와는 무관합니다.
try
{
Response->CustomHeaders->Add("content-disposition=attachment; filename=" + DownFileName);
Response->ContentStream = new TFileStream(AttachFilePath, fmOpenRead|fmShareDenyWrite);
Response->ContentStream->Position = 0;
}
__finally
{
Response->SendResponse();
}
이 소스에서의 중요한 점들은 다음과 같습니다.
1. Response 객체의 ContentStream을 열린 스트림 객체로 설정해야 한다.
2. 스트림의 포지션을 0으로 잡아주어야 한다.
3. Response 객체의 SendResponse() 함수를 호출하여 실제 전송을 시작시켜야 한다.
4. try~__finally 처리를 하여 예외발생 여부와 관계없이 전송을 시도하도록 해야 한다.
5. 스트림 객체를 free시켜서는 안된다. SendResponse()는 비동기로 데이터를 전송하기 때문이며, 파괴는
웹브로커 내부에서 자동으로 이루어진다.
6. 첫번째 라인의 헤더를 추가하는 동작은, 웹브라우저가 지원하는 마임타입이라도 브라우저로 하여금
강제로 다운로드를 받도록 하게 하기 위함이다.
(이 헤더를 추가하지 않으면 파일 종류에 따라 브라우저에서 열려고 시도함)
제 게시판은 첨부파일을 물리적인 디스크파일로 저장하므로(파일 그대로 저장한다는 소립니다)
파일스트림을 썼는데, 그 외에 디비에 파일 데이터가 들어있다면 TBlobStream을 쓴다든지 할 수 있습니다.
만약 이미지 데이터 등 특정 타입에 대해서 다운로드 대신 브라우저에서 표시시키려면 첫번째 라인을 빼고
컨텐트 타입 헤더를 이미지 등 원하는 마임 타입으로 설정하면 됩니다.
그럼 이만...
전태균 님이 쓰신 글 :
: 안녕하세요
: 저도 질문하나 있어 이렇게 글을 올립니다
:
: 다름이 아니고 임프님이 만드신 자료실에 보면 isapi로 파일을 다운로드
: 받을 수 있게 제작되어 있던데요 (예 impBoard.dll/CodeRedCleanup.exe?action=download&db=bcb_res&no=70&attno=0) 뭐 이런식으로요
:
: 근데 보통 < a href> 를 이용한 다운로드가 주로 있는데 위와 같은 경우는
: 어떻게 구현을 해야하는지 궁금하군요
: 방법이라던지 구현된 소스를 공개 하실수 있는지 궁금해서요
:
: 지금까지 DB 프로그램을 하다가 요즘 WEB 프로그램을 좀 해야하는데
: 힘이 많이 드네요 ^^;
:
: 요거 답변 받으면 또 질문 올릴께요 답변 꼭 해주세요
|