<a href="download.asp?file=<%=file_name%>">무조건 다운로드 받게 하기</a>


-- download.asp

<body onload="window.close();">
<%
    file = Request("file")
    '파일 이름

    Response.ContentType = "application/unknown"
    'ContentType 를 선언합니다.

    Response.AddHeader "Content-Disposition","attachment; filename=" & file
    '헤더값이 첨부파일을 선언합니다.

    Set objStream = Server.CreateObject("ADODB.Stream")
    'Stream 을 이용합니다.

    objStream.Open
    '무엇이든 Set 으로 정의했으면 열어야 겠지요^^

    objStream.Type = 1

    objStream.LoadFromFile "절대경로"& file
    '절대경로 입니다.

    download = objStream.Read
    Response.BinaryWrite download
    '이게 보통 Response.Redirect 로 파일로 연결시켜주는 부분을 대신하여 사용된 것입니다.
 
    Set objstream = nothing
    '초기화시키구요.
%>

반응형

<%
' ---------------------------------------------------
' 프로그램명    : 일반함수 모음
' 프로그램설명  : 공통적으로 사용할 수 있는 함수 모음
' ---------------------------------------------------

' 시스템 날짜(문자열 8자리, YYYYMMDD )
SYSDATE = Year(now) & right("0"&Month(now),2) & right("0"&Day(now),2)      ' 날짜(YY
YYMMDD)

' 시스템 날짜(문자열 12자리, YYYYMMDDhhmm )
SYSDATE12 = Year(now) & right("0"&Month(now),2) & right("0"&Day(now),2) & right("0"& Hour(now),2) & right("0"&Minute(now),2)      ' 날짜(YYYYMMDDhhmm)

'yyyymmddhhmm 문자열을 yyyy/mm/dd hh:mm 문자열로 바꾼다.
Private Function gs_FormatDTime(psDTime)
        if IsNull(psDTime) OR Len(psDTime)=0 then
                gs_FormatDTime=""
        elseif Len(psDTime)=12 then
                gs_FormatDTime = Left(psDTime,4) & "/" & Mid(psDTime,5,2) & "/" & mid(psDTime,7,2) & " " & mid(psDTime,9,2) & ":" & right(psDTime,2)
        else
                gs_formatDTime = psDTime
        end if
End Function

'yyyymmdd 문자열을 yyyy/mm/dd 문자열로 바꾼다.
'yyyymm 문자열을 yyyy/mm 문자열로 바꾼다.
Private Function gs_FormatDate(psDate)
        if IsNull(psDate) OR Len(psDate)=0 then
                gs_FormatDate=""
        elseif Len(psDate)=6 then
                gs_FormatDate = Left(psDate,4) & "/" & Right(psDate,2)
        elseif Len(psDate)=8 then
                gs_FormatDate = Left(psDate,4) & "/" & Mid(psDate,5,2) & "/" & Right(psDate,2)
        else
                gs_formatDate = psDate
        end if
End Function

'yyyy/mm/dd 문자열을 yyyymmdd 문자열로 바꾼다.
'yyyy/mm 문자열을 yyyymm 문자열로 바꾼다.
Private Function gs_Yymmdd(psDate)
        if Len(psDate)=10 then
                gs_Yymmdd = Left(psDate,4) & Mid(psDate,6,2) & Right(psDate,2)
        elseif Len(psDate)=7 then
                gs_Yymmdd = Left(psDate,4) & Right(psDate,2)
        else
                gs_Yymmdd = psDate
        end if
End Function

'yyyymm문자열을 yyyy/mm문자열로 바꾼다.
Private function gs_yyyymm(psdate)
    if len(psdate)=6 then
       gs_yyyymm = left(psdate,4) & "/" & Mid(psdate,5,2)
    elseif len(psdate)=8 then
       gs_yyyymm = left(psdate,4) & "/" & Mid(psdate, 5,2)
    end if
end function

'YYYYMMDD 문자열을 YYYY-MM-DD 문자열로 바꾼다.
'YYYYMM 문자열을 YYYY-MM 문자열로 바꾼다.
'YYYYMMDDhhmm 문자열을 YYYY-MM-DD hh:mm로 바꾼다.

Private Function FormatDate(psDate)
        if IsNull(psDate) OR Len(psDate)=0 then
                FormatDate=""
        elseif Len(psDate)=6 then
                FormatDate = Left(psDate,4) & "-" & Right(psDate,2)
        elseif Len(psDate)=8 then
                FormatDate = Left(psDate,4) & "-" & Mid(psDate,5,2) & "-" & Right(psDate,2)
  elseif Len(psDate)=12 then
                FormatDate = Left(psDate,4) & "-" & Mid(psDate,5,2) & "-" & mid(psDate,7,2) & " " & mid(psDate,9,2) & ":" & right(psDate,2)
  else
                FormatDate = psDate
        end if
End Function

'날짜문자열을 정하는 길이(Ln)만큼 리턴해준다.
'리턴형식 YYYY-MM-DD
Private Function FormatDateLen(psDate, ln)
        if IsNull(psDate) OR Len(psDate)=0 then
                FormatDateLen=""
        elseif ln="6" and Len(psDate)>=6 then
                FormatDateLen = Left(psDate,4) & "-" & Mid(psDate,5,2)
        elseif ln="8" and Len(psDate)>=8 then
                FormatDateLen = Left(psDate,4) & "-" & Mid(psDate,5,2) & "-" & Mid(psDate,7,2)
  elseif ln="12" and Len(psDate)>=12 then
                FormatDateLen = Left(psDate,4) & "-" & Mid(psDate,5,2) & "-" & mid(psDate,7,2) & " " & mid(psDate,9,2) & ":" & right(psDate,2)
  else
                FormatDateLen = psDate
        end if
End Function

'날짜문자열을 정하는 길이(Ln)만큼 리턴해준다.
'리턴형식 YYYY.MM.DD
Private Function gDotDateLen(psDate, ln)
        if IsNull(psDate) OR Len(psDate)=0 then
                gDotDateLen=""
        elseif ln="6" and Len(psDate)>=6 then
                gDotDateLen = Left(psDate,4) & "." & Mid(psDate,5,2)
        elseif ln="8" and Len(psDate)>=8 then
                gDotDateLen = Left(psDate,4) & "." & Mid(psDate,5,2) & "." & Mid(psDate,7,2)
  elseif ln="12" and Len(psDate)>=12 then
                gDotDateLen = Left(psDate,4) & "." & Mid(psDate,5,2) & "." & mid(psDate,7,2) & " " & mid(psDate,9,2) & ":" & right(psDate,2)
  else
                gDotDateLen = psDate
        end if
End Function


'숫자 123456789 를 123,456,789 문자열로 바꾼다. (고정소수점)
Private Function gs_FormatNumber(plNum,piPoint)
        if isnull(plNum) then
                plNum = 0
        else
                plNum = ccur(plNum)
        end if
        if plNum=0 then
                gs_FormatNumber = 0
        elseif Len(plNum)=0 OR IsNull(plNum) then
                gs_FormatNumber = ""
        else
                gs_FormatNumber = FormatNumber(plNum,piPoint)
        end if
End Function

'숫자 123456789 를 123,456,789 문자열로 바꾼다. (변동소수점)
Private Function gs_FormatNumber1(plNum)
        if isnull(plNum) then
                plNum = 0
        else
                plNum = ccur(plNum)
        end if
        if plNum=0 then
                gs_FormatNumber1 = 0
        elseif Len(plNum)=0 OR IsNull(plNum) then
                gs_FormatNumber1 = ""
        else
                dInt = int(plNum)
                gs_FormatNumber1 = FormatNumber(dInt,0)
                if (plNum-dInt) > 0 then gs_FormatNumber1 = gs_FormatNumber1 & cstr(plNum-dInt)
        end if
End Function

'1-9숫자를 01-09 문자열로 바꾼다.
Private Function gs_Add0(piNum)
   if piNum < 10 then
        gs_Add0 = "0" & cstr(piNum)
   else
        gs_Add0 = cstr(piNum)
   end if
End Function

'-----------------------------------------------------
'        잘라낸 문자의 왼쪽을 리턴
' - szInput : 문자텍스트의 원본
' - nLen    : 화면에 보여질 문자Byte 수
'-----------------------------------------------------
Function gf_LeftAtDb(szInput,nLen)
   Dim nCnt
   Dim szLeft

   szInput = Trim(szInput)
   if isNull(szInput) or isEmpty(szInput) then
      gf_LeftAtDb = ""
   else
      For nCnt = 1 To Len(szInput)
         szLeft = Mid(szInput,1,nCnt)
         If gf_LenAtDb(szLeft) > nLen Then
            szLeft = Mid(szInput,1,nCnt-1)
            szleft = szleft & "..."
            Exit For
         End If
      Next
      gf_LeftAtDb = szLeft
   end if
End Function

' ----------------------------------------
' 한글/영문을 체크해서
' 한글은 2Byte씩 영문은 1Byte씩 증가한다.
' ----------------------------------------
Function gf_LenAtDb(szAllText)
        Dim nLen
        Dim nCnt
        Dim szEach

        nLen = 0
        szAllText = Trim(szAllText)
        For nCnt = 1 To Len(szAllText)

                szEach = Mid(szAllText,nCnt,1)
                If 0 <= Asc(szEach) And Asc(szEach) <= 255 Then
                        nLen = nLen + 1             '한글이 아닌 경우
                Else
                        nLen = nLen + 2             '한글인 경우
                End If
        Next

        gf_LenAtDb = nLen
End Function


' ===  IP Address 의 정확성 여부 =============================
' 입력예 : 65.26.102.160
' 출력 : "0" - IP가 입력되지 않음
'        "1"  - 정상적인 IP
'        기타메세지-에러상황에 대한 메세지
' ============================================================
Function gf_IpCheck(IpAddr)
  if (request("IpAddr")) = "" then
     gf_IpCheck =  "0"
     Exit Function
  end if

  arr_ip = Split(request("IpAddr") , ".")

  if UBound(arr_ip) <> 3 then
     gf_IpCheck = "IP Address 형식오류"
     Exit Function
  end if
  If arr_ip(0)="" or arr_ip(1)="" or arr_ip(2)="" or arr_ip(3)="" then
     gf_IpCheck="outOfRange"
     Exit Function
  end if
  if arr_ip(0) < 1 or arr_ip(0) > 255 or _
     arr_ip(1) < 1 or arr_ip(1) > 255 or _
     arr_ip(2) < 1 or arr_ip(2) > 255 or _
     arr_ip(3) < 1 or arr_ip(3) > 255 then

     gf_IpCheck = "IP Address의 숫자범위를 벋어났습니다."
     Exit Function
  end if

  gf_IpCheck = "1"
End Function


' DB 입력용 text 변환
Function gf_insConvStr(CheckValue)
  CheckValue = Replace(CheckValue, "'", "''")
  CheckValue = Replace(CheckValue, chr(34), "&quot;")
  gf_insConvStr = CheckValue
End Function

' 데이터 출력시 html Tag 효과 막기
Function gf_viewConvStr(CheckValue)
  CheckValue = Replace(CheckValue, "<", "&lt;" )
  CheckValue = Replace(CheckValue,  ">", "&gt;")
  CheckValue = Replace(CheckValue,  "|", "&#124;")
'  CheckValue = Replace(CheckValue,  chr(13), "<br>")
  gf_viewConvStr = CheckValue
End Function


'============================================================================
' * Check Function
'============================================================================

Sub Formchk()

 Dim key

 For Each key in Request.Form
     Response.Write key & " = " & "Trim(Request.Form("""& key &""")) " & "<BR>"
 Next

 Response.WRite "<HR>"

 For Each key in Request.Form
     Response.Write key & " = " & Request.Form(key) & "<BR>"
 Next

End Sub

Sub Querychk()

 Dim key

 For Each key in Request.QueryString
     Response.Write key & " = " & "Trim(Request.QueryString("""& key &"""))" & "<BR>"
 Next

 Response.WRite "<HR>"

 For Each key in Request.QueryString
     Response.Write key & " = " & Request.QueryString(key) & "<BR>"
 Next

End Sub

Sub Cookiechk()

 Dim key, dickey

 For Each key in Request.Cookies

  IF Request.Cookies(key).HasKeys Then
  '딕셔너리에 있는 모든 키들을 검색하기 위해 또 다른 For Each 를 사용
    For Each dickey in Request.Cookies(key)
      Response.Write "(" & key & ")(" & dickey & ") = " & Request.Cookies(key)(dickey) & "<BR>"
    Next

  ELSE
  '일반 쿠키
    Response.Write key & " = " & Request.Cookies(key) & "<BR>"

  End IF
 Next

 Response.WRite "<HR>"

 For Each key in Request.Cookies

  IF Request.Cookies(key).HasKeys Then
  '딕셔너리에 있는 모든 키들을 검색하기 위해 또 다른 For Each 를 사용
    For Each dickey in Request.Cookies(key)
      Response.Write  dickey & " = Request.Cookies("""& key &""")("""& dickey &""") " & "<BR>"
    Next

  ELSE
  '일반 쿠키
    Response.Write key & " = Request.Cookies("""& key &""")" & "<BR>"
  End IF
 Next

End Sub

 '----------------- 테이블 칼럼값 + 레코드셋 값 리턴 ------------------------------
 Sub RS_Column(tablename, strConnect)

  Dim oRs, fldTable
  SET oRs = Server.CreateObject("ADODB.Recordset")
  oRs.Open tablename, strConnect, 1

  IF oRs.State = 1 Then
   IF NOT oRs.EOF Then
    For Each fldTable In oRs.Fields
     Response.WRite fldTable.name & " = oRs(""" & fldTable.name & """) " & "<BR>"
    Next
    Response.Write "<HR>"
    For Each fldTable In oRs.Fields
     Response.WRite fldTable.name & " = " & fldTable.value & "<BR>"
    Next
    Response.Write "<HR>"
    For Each fldTable In oRs.Fields
     Response.WRite fldTable.name & " = " & "RS(""" & fldTable.name & """) " & "<BR>"
    Next

   End IF
   oRs.Close
   SET oRs = NOTHING
  End IF

 End Sub


%>  

반응형
쿠키는 Request/Response 객체의 컬렉션으로 서버가 클라이언트 컴퓨터에 저장해 놓은 정보를 말하며 클라
이언트가 서버에 정보를 요청시 자동으로 서버로 보내진다.

[쿠키형식]
보낼 때 --> response.cookies("쿠키이름")="값"
받을 때 --> request.cookies("쿠키이름")

[쿠키속성]
Cookies(쿠키이름).Expires  --> 만료될(자동 소멸) 날자 지정
Cookies(쿠키이름).Domain  --> 지정 도메인에서만 사용
Cookies(쿠키이름).Path  --> 지정 도메인 특정 Path에서만 사용
Cookies(쿠키이름).Haskeys  --> 다중 쿠키인지 리턴

[예제1 - 쿠키보내기]

cookie_send.asp
<%
m_date=now()

response.cookies("last_time")=m_date   '쿠키저장

response.cookies("last_time").expires=#10/10/2001#   '만료기간 지정 (절대)

response.cookies("last_time").expires=m_date+20   '만료기간 지정 (상대)

response.cookies("last_time").domain="www.dhtml.co.kr"   '도메인지정

response.cookies("last_time").path ="/asp"   'asp디렉토리내에서만 사용할수 있음
%>

[예제2 - 쿠키 받기]

cookie_request.asp
<%

last_time=request.cookies("last_time")    '쿠키 가져온다

m_date=now()   ' 쿠키 갱신

response.cookies("last_time")=m_date

if last_time<>"" then ' 쿠키가 있다면

response.write "안녕하세요...지난번 방문은 "& last_time &"이었군요"

end if
%>

------------------------------------------------------
[저장된 쿠키 확인 방법]
Winnt경우 : C:\Winnt\Profiles\Administrator\Cookies
Win98경우 : C:\Windows\Cookies
반응형
첫번째 프레임 페이지 입니다.
<frameset rows='100%,*' cols='*' framespacing='0' frameborder='NO' border='0'>
<frame src='SlideShow.asp?<%IF Trim(request.querystring) = '' Then Response.Write(request.Form) ELSE Response.Write(request.QueryString)%>' name='mainFrame' >
<frame src='about:blank' scrolling='NO' noresize name='hiddenFrame' >
</frameset>

SlideShow.asp라는 파일에서 임의의 이벤트가 발생하면 이 파일의 특정 콤보에 값을 채우는 방법입니다
이 방식을 사용하면 새로고침의 한계를 뛰어 넘을 수 있습니다.

parent.document.frames['hiddenFrame'].document.location='top.asp?mode=CSSpec&ProductCode=' + document.frmSlide.ProductCode.value; 이런 방식으로 숨겨진 프레임 top.asp파일을 호출합니다. 이런식으로 사이트에 hidden 프레임을 만들어 두면 그렇게 멀게만 느껴졌던 디비호출을 마음대로 할 수 있습니다
=>Top.asp만 잘 정의 하면 대부분의 요청을 asp리프레쉬 없이 처리 할 수 있습니다.

// 여기는 Top.asp에 해당하는 내용입니다
mode에 따라서

<script language='javascript>

var TargetDoc= parent.document.frames['mainFrame'].document;
var oOption;
IF Request('mode') = 'CSSpec' THEN
Set adocmd = Server.CreateObject('ADODB.Command')
WITH adocmd
.ActiveConnection = DbConn
.CommandType = adCmdStoredProc
.CommandText = 'IS_CSEnterOrderCounts'
.Parameters.Refresh
.Parameters.Item('@ProductCode').Value= Cint(Request('ProductCode'))
Set RS = .Execute
END WITH
%>
for( key in TargetDoc.frmSlide.CSSpec)
{
TargetDoc.frmSlide.CSSpec.remove(key);
}
<%
Do While Not RS.EOF
%>
oOption = TargetDoc.createElement('OPTION');
oOption.value='<%=Trim(RS('ColorCode')) %>;<%=Trim(RS('SizeCode')) %>';
oOption.text ='<%=Trim(RS('Name') )%>-<%=Trim(RS('Size'))%>';
TargetDoc.frmSlide.CSSpec.add(oOption);
<%
RS.MoveNext
Loop
RS.close()
END IF%>

</script> 
반응형

강제로 다운로드 창 뜨게 하려면 사용하세요.

Response.Expires = 0
Response.Buffer =  True
Response.Clear

On Error Resume Next

filename = Request("filename")
filepath = Server.MapPath(".") & "\Upload\" & filename


Response.ContentType =  "application/unknown"
Response.CacheControl = "public"
Response.AddHeader "Content-Disposition", "attachment;filename=" & filename


'스트림 이용
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1
objStream.LoadFromFile filepath
strFile = objStream.Read
Response.BinaryWrite strFile
Response.Flush
Set objStream = Nothing


'SiteGalaxy이용
set fso = server.CreateObject("SiteGalaxyUpload.FileSystemObject")
  set file = fso.OpenBinaryFile (filepath,1,false)
  Response.BinaryWrite file.ReadAll  
set fso=nothing


'DextDownLoad 이용
Set objDownload = Server.CreateObject("DEXT.FileDownload")
objDownload.Download filepath
Set objDownload = Nothing


If Err Then
 Response.Write Err.number & "<br>" & Err.source & "<br>" & Err.description & "<br>"
 Err.Clear
End If

반응형

강좌 79 - 스트링 함수 3 (ASP 함수)

 

10) Left

문자열의 왼쪽에서 설정하는 길이만큼의 문자들을 반환한다.

구문

Left(string, length)

string : 반환하고자 하는 문자열
length : 왼쪽에서 이동하고자 하는 문자열의 길이

● left.asp

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

<%@ Language=VBScript %>

<%

strTemp = "Hello! Active Server Page~"

Response.Write Left(strTemp, 15)

%>

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


[그림 1-9] left.asp 실행 결과

11) Len

스트링의 문자열의 길이를 반환한다.

구문

Len(string)

● len.asp

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

<%@ Language=VBScript %>

<%

strTemp = "Hello! Active Server Page~"

Response.Write Len(strTemp) & "<BR>"

strTemp = "안녕하세요! ASP입니다."

Response.Write Len(strTemp) & "<BR>"

%>

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


[그림 1-10] len.asp 실행 결과

12) LTrim

스트링의 문자열에서 스트링의 왼쪽 즉 앞에 있는 공백 문자들을 삭제한다.

구문

LTrim(string)

● ltrim.asp

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

<%@ Language=VBScript %>

<%

strTemp = " Hello! Active Server Page~"

Response.Write strTemp & "<BR>"

Response.Write LTrim(strTemp)

%>

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


[그림 1-11] ltrim.asp

공백 문자의 출력 예제에서 공백을 제거한 것과 제거하지 않은 문자의 결과가 동일하게 출력된다. 이것은 HTML이 공백 문자를 지원하지 않기 때문이다. 그러나 코드 상에서의 비교에서는 필요한 요소이니 공백 제거 함수를 적절히 사용하도록 해야하겠다.

13) Mid

스트링의 문자열에서 특정 지점부터 지정된 길이 만큼의 문자열을 반환한다.

구문

Mid(string, start[, length])

● string : 반환하고자 하는 문자열
● start : 문자를 반환할 때의 특정 시작 위치
● length : 선택 인수로서 반환하고자 하는 문자의 길이이다. 생략되면 문자열의 마지막까지 반환한다.

● mid.asp

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

<%@ Language=VBScript %>

<%

strTemp = "Hello! Active Server Page~"

Response.Write Mid(strTemp,5,10) & "<BR>"

Response.Write Mid(strTemp,5) & "<BR>"

%>

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


[그림 1-12] mid.asp 실행 결과

14) Replace

지정한 하위 문자열을 지정한 횟수만큼 다른 하위 문자열로 바꾼 문자열을 반환한다.

구문

Replace(expression, find, replacewith[, start[, count[, compare]]])

● expression : 필수적인 인수로 바꿀 하위 문자열이 들어 있는 문자식이다.
● find : 필수적인 인수로 찾을 하위 문자열이다.
● replacewith : 필수적인 인수로 바꿀 하위 문자열이다.
● start : 선택적인 인수로 expression에서의 하위 문자열 검색을 시작하는 위치이다. 생략하면 1로 간주한다. 반드시 count와 함께 사용해야 한다.
● count : 선택적인 인수로 하위 문자열의 바꾸기 횟수이다. 생략하면 기본값이 -1이 되며 해당하는 문자열을 모두 바꾼다. 반드시 start과 함께 사용해야 한다.
● compare 선택적인 인수로 사용할 하위 문자열 비교 형식을 나타내는 숫자 값이다. 그 값에 대해서는 아래의 표를 참조하라. 생략하면 기본값은 0이되며 이진 비교를 수행한다.

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

상수 값 설명

vbBinaryCompare 0 이진 비교를 실행한다.

vbTextCompare 1 텍스트 비교를 실행한다.

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

● replace.asp

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

<%@ Language=VBScript %>

<%

strTemp ="AAbAAbAABAAB"

Response.Write Replace(strTemp, "b", "O") & "<BR>"

Response.Write replace(strTemp, "b", "O", 3, -1, 1)

%>

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


[그림 1-13] replace.asp 실행 결과



반응형

페이지 결과를 엑셀파일로 저장하고 싶을때...

페이지 상단에 아래와 같은 코드를 넣으면 됩니다.


즉 웹브라우져에게 ContentType 를 엑셀이라고 알려주면 저장하거나 바로 웹브라우져에서 엑셀을 보여주거나

사용자의 설정에 따라 다르게 보여줄겁니다.


 Response.Buffer = False
 Response.Expires=0
 
 FileName = ""


 Response.AddHeader "Content-Disposition","attachment;filename=" & FileName
 Response.ContentType = "application/vnd.ms-excel"  '''= 엑셀로 출력
 Response.CacheControl = "public"


그외


엑셀 : application/vnd.ms-excel

워드 : application/vnd.ms-word

파워포인트 : application/vnd.ms-powerpoint

 

 

덧 : Response.Buffer = False 와 Response.CacheControl = "public" 의 역할은 데이터를 버퍼링 하지 않고

바로 다운로드 창이 떠서 저장하기를 누르면 그때 데이터를 받아오도록 하는 기능입니다.

반응형

'===================================================================
'==    설명 : 문장을 해당 자릿수만큼 <br>이 들어간 문장으로 변환
'==    이름 : MakeBr(Str,Pos)
'==    변수 : Str(String),Pos(Int)
'==    반환 : String
'===================================================================
Function MakeBr(Str,Pos)

    Dim StrLen, TmpStr, i, Midcnt, Start, Surplus
   
    StrLen = len(Str)
   
    If (StrLen Mod Pos) = 0 then
        MidCnt = Fix(StrLen/Pos)
    Else
        MidCnt = Fix(StrLen/Pos) + 1
    End If
   
    for i = 1 to MidCnt
        if i = 1 then
            TmpStr = TmpStr&Mid(Str,i,pos)&"<br>"
        Else
            TmpStr = TmpStr&Mid(Str,((i-1)*Pos)+1,pos)&"<br>"
        End If
    next
   
    MakeBr = TmpStr
End Function


' ##################################################################################
' 검색에서 selected
' ##################################################################################
Function getSelected(search,t)
    if search = t then
        getSelected ="selected"
    end if
End function  

' ##################################################################################
' checked
' ##################################################################################
Function getChecked(tag,y)
    If tag = y then
        getChecked = "checked"
    End if
End function

' ##################################################################################
' 자동링크
' ##################################################################################

  FUNCTION autolink(CONTENT)
 
    DIm Re
    Set re = New RegExp
   
    ' First Pass for http
    re.Pattern = "(\w+):\/\/([^/:]+)(:\d*\b)?([^# \n<]*).*\n"
    re.Pattern = "http://([0-9a-zA-Z./@:~?&=_-]+)"
    re.Global = True
    re.IgnoreCase = True
   
    ' ASP seems to be not supporting .MultiLine method.
    're.MultiLine = True
   
    CONTENT = re.Replace(CONTENT,"<a target=_blank href='http://$1'>http://$1</a>")
   
    ' Second Pass for mail
    re.Pattern = "([_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*)@([0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)"
    autolink = re.Replace(CONTENT,"<a href='mailto:$1@$3'>$1@$3</a>")
 
  END FUNCTION  

' ##################################################################################
' 문자열 체크 (리턴값:boolean)
' ##################################################################################
Function chkStrFlag(Val, chkStr)
    Dim flag, MyPos
   
    If Val = "" then
        flag = false
    Else
        Mypos =Instr(Val,chkStr)
        If MyPos = 0 then
            flag=false
        Else
            flag=true
        End If
    End If
   
    chkStrFlag = flag
End Function


'##################################################################################
'     문자열 체크 (공백이나 NULL값 체크)
'    Val    : 체크 값, r_Val (대체값)
'##################################################################################
Function replaceVal(val, r_Val)
    Dim flag, MyPos
   
    If (val = "") or IsNull(Val) then
        replaceVal = r_Val
    Else
        replaceVal = val
    End If
End Function



'##################################################################################
'     숫자값 자릿수만큼 문자로 변경 (공백이나 NULL값 체크)
'    Val    : 체크 값, chkLen 자릿수 , r_Val(대체값)
'##################################################################################
Function chkLenReplaceVal(val,chkLen, r_Val)
    Dim chkCnt, MyPos
        chkCnt = len(Cstr(val))

    If chkCnt < chkLen then
        chkLenReplaceVal =  val
       
        for i = 1 to (chkLen-chkCnt)
            chkLenReplaceVal = r_Val&chkLenReplaceVal
        next
    Else
        chkLenReplaceVal = val
    End If

End Function



'##################################################################################
'     널값,""값 확인
'    Val    : 체크 값
'    retun 값 : true, false
'##################################################################################
Function chkBlank(val)
    If (val = "") or IsNull(Val) then
        chkBlank = true
    Else
        chkBlank = false
    End If
End Function


'##################################################################################
'     비교값 리턴
'    Val    : 체크 값
'    retun 값 : true, false 또는 대치 문장
'##################################################################################
Function replaceStr(str, chkStr, replaceStr1, replaceStr2)
    If str = chkStr then
        replaceStr = replaceStr1
    Else
        replaceStr = replaceStr2
    End If
End Function


'##################################################################################
'     NULL값 만들기
'    Val    : 값
'    retun 값 : NULL, 문장
'##################################################################################

Function makeNull(str)
    If str="" or IsNull(str) then
        makeNull = "NULL"
    Else
        makeNull = str
    End IF
End Function

'##################################################################################
'     HTML 태그 지우기 (정규식표현)
' 인자 : strHTML:문장, patrn : 패턴 문장
'    retun 값 : String
'##################################################################################

Function stripHTML(strHTML, patrn)
  Dim objRegExp, strOutput
  Set objRegExp = New Regexp

  objRegExp.IgnoreCase = True
  objRegExp.Global = True
  objRegExp.Pattern = patrn

  'objRegExp.Pattern = "<.+?>"   '''' 태그완전히없앰


  strOutput = objRegExp.Replace(strHTML, "")

  stripHTML = strOutput

  Set objRegExp = Nothing
End Function

'##################################################################################
' 문자 잘라내기
'##################################################################################
Function CutString(Str,Length,Patten)
  If Len(Str) > Length Then
    CutString = Left(Str,Length-3) & patten
  Else
    CutString = Str
  End If
End Function



별건 아니구요..그냥 가끔 디버깅시에 쓰는 함수에요
####################################################
Sub DbPrintErrMsg(obj)

Dim errLoop
    For Each errLoop In obj.Errors
        response.write "#############<br>"
        response.write "Error Number: " & errLoop.Number & "<br>"
        response.write "Description: " & errLoop.Description &  "<br>"
        response.write "Source: " & errLoop.Source &  "<br>"
        response.write "SQL State: " & errLoop.SQLState &  "<br>"
        response.write "Native Error: " & errLoop.NativeError & "<br>"
        response.write "#############<br>"
    Next
End Sub

########폼값 확인할때###################
Sub Prt_RequestForm(obj)

Dim item
    For Each item In obj
        response.write "#############<br>"
        response.write item&" : " &obj(item)& "<br>"
        response.write "#############<br>"
    Next
End Sub
ex) Prt_RequestForm(Request.Form), Prt_RequestForm(Request.QueryString),
Prt_RequestForm(UploadForm) 
반응형

1. 자주 사용되는 데이터는 웹 서버에 캐시하라

가. 자주 변경되지 않는 것은 데이터베이스에서 직접 액세스하지 말고 캐쉬하라.
나. 캐쉬 대상 : 콤보 상자 목록, 참조 테이블, DHTML 스크랩, XML(Extensible Markup Language) 문자열, 메뉴 항목과 데이터 원본 이름(DSN), 인터넷 프로토콜(IP) 주소 및 웹 경로를 포함하는 사이트 구성 변수
다. HTML 문서로 저장
라. 자주 사용되는 데이터는 메모리(Application변수나 Session 변수)에 캐쉬한다.
마. 데이터 및 HTML은 웹 서버 디스크에 캐시하십시오

(1) 메모리에 캐시할 데이터가 너무 많은 경우에는 데이터를 텍스트 또는 XML 파일 형식으로 웹 서버의 하드 디스크에 캐시한다.

(2) ADO의 RecordSet의 Save() 및 Open() 함수를 활용하여 디스크에 저장

(3) Scripting.FileSystemObject를 이용하여 파일로 저장

2. 덩치 큰 COM 개체 등은 메모리에 캐쉬하지 마라.

3. 데이터베이스 연결은 응용 프로그램이나 세션 개체에 캐시하지 마라.

4. 세션 개체를 올바르게 사용하라.

가. 웹 서버에 대한 사용자 "Sticking" 현상 발생

나. 세션을 사용하고 있지 않으면 세션 기능을 반드시 해제

        <% @EnableSessionState=False %>

다. 상태의 크기가 4KB 미만으로 작은 경우에는 일반적으로 쿠키, QueryString 변수 및 <input type=hidden>를 사용하는 것이 좋다


5. 스크립트 코드를 COM 개체로 만들어 사용하라.

가. COM 개체는 비즈니스 로직으로부터 표현 로직을 분리할 수 있다.

나. COM 개체는 코드 재사용을 가능케 한다.

다. 작은 양의 ASP는 COM으로 안 만드는 것이 좋다.


6. 최신의 리소스를 얻어 신속하게 해제하라.

가. 다운로드 컴포넌트

나. 신속하게 Close하고 Nothing을 설정하라.


7. 독립 프로세스 실행을 통해 성능과 안정성을 적절히 안배하십시오

가. 낮은 격리 : 모든 IIS 버전에서 지원되며 속도가 가장 빠릅니다

나. 보통 격리 : 독립 프로세스로 실행

다. 높은 격리 : 독립 프로세스로 실행. ASP 작동이 중단되더라도 웹 서버 작동은 유지. 동시 접속자 수가 증가할 경우에만 높은 격리를 사용하는 것이 좋다.

※ ASP 응용 프로그램을 독립 프로세스(보통 또는 높음 격리)로 실행하면 ASP 응용 프로그램은 Windows NT4의 경우 Mtx.exe로 실행, Windows 2000의 경우 DllHost.exe로 실행된다.

※ 권장 사항 : IIS 4.0에서는 ASP의 낮음 격리 수준을, IIS 5.0에서는 ASP의 보통 격리 수준을 사용하고 COM+ 라이브러리 응용 프로그램을 사용하라.


8. Option Explicit를 사용하십시오

가. Option Explicit는 ASP 스크립트의 첫 번째 줄에 사용한다.

나. 모든 변수를 먼저 선언해야 한다. 만약 선언하지 않을 경우 에러가 발생된다.

다. 변수 이름의 오타를 막을 수 있다.

라. 선언된 변수가 선언되지 않은 변수보다 빠르게 실행된다.

(1) 선언되지 않은 변수 : 스크립팅 실행 시간에 필요할 때마다 변수 선언하여 사용

(2) 선언된 변수 : 컴파일 시간 또는 실행 시간에 미리 할당


9. 가급적 전역 변수보다는 함수 내의 지역 변수를 사용하라.


10. 자주 사용되는 데이터를 변수에 저장하라.

가. COM 개체에서 읽어온 데이터

나. Request 변수(Form 및 QueryString 변수)


11. 배열 크기 재정의를 피하라.

가. 배열 크기가 불확실할 때에는 적당하게 크게 잡아라. 약간의 낭비가 오히려 낫다.


12. 응답 버퍼링을 사용하십시오

가. IIS : IIS를 이용한 전체 응용 프로그램의 응답 버퍼링 기능을 설정(권장 사항)

나. 스크립트 : Response.Buffer를 true로 설정, 이것은 HTML이 ASP 스크립트에 나타나기 이전과 Response.COOKIEs 컬렉션을 사용하여 쿠키가 설정되기 이전에 미리 실행되어야 한다.

다. 중간 중간에 버퍼링되 내용을 출력할 때 Response.Flush를 사용한다. 예를 들어, 1,000개의 행으로 구성된 테이블에서 100개의 행을 표시한 후 ASP는 Response.Flush를 호출하여 브라우저에 보낸다. 그러나 대부분 </table> 태그가 나타날 때까지는 대부분의 브라우저에서 테이블 표시를 시작할 수 없으므로 100개씩 테이블을 쪼개서 나타낸다.


13. 인라인 스크립트 및 Response.Write 명령문을 일괄 처리하십시오

가. 여러 개의 인접한 인라인 표현식들을 한 번의 Response.Write 호출로 바꾸라.


14. 실행 시간이 긴 페이지를 만들 때 Response.IsClientConnected를 사용하십시오.

가. False가 반환되면 Response.End를 호출하여 나머지 페이지를 포기한다.

나. IIS 5.0에서는 이러한 절차를 코드화했다. 즉 3초를 지나면 클라이언트가 아직도 연결되어 있는지를 검사하여 클라이언트 연결이 끊어져 있으면 그 즉시 해당 요청을 종료한다.


15. <OBJECT> 태그를 사용하여 개체를 초기화하십시오

가. Server.CreateObject 메서드보다는 <object runat=server id=objname> 태그를 사용하라.

나. <object id=objname> 태그는 개체 이름을 선언만 하고 있다가 호출될 때 비로서 만들어진다.


16. TypeLib 선언을 ADO 및 그 밖의 다른 구성 요소에 사용하십시오

가. IIS 5.0에는 구성 요소의 유형 라이브러리에 대한 바인드 기능이 새로 추가되었다.

나. ADO 상수를 사용할 때에는 다음 명령문을 Global.asa에 넣으라.

        <!-- METADATA NAME=“Microsoft ActiveX Data Objects 2.5 Library”

        TYPE=“TypeLib” UUID=“{00000205-0000-0010-8000-00AA006D2EA4}” -->


17. 서버에 값을 넘기기 전에 클라이언트에서 유효성 검사하라.


18. 루프 형식의 문자열 연결을 피하라.

가. 반복적인 문자열 연결로 인해 제곱 배의 시간이 소요된다. 다음 예의 걸린 시간은 1+2+3+...+N, 즉 N*(N+1)/2이다. 

 
s = “”
 
 For i = Asc(“A”) to Asc(“Z”) 
        s = s & Chr(i)

       Next


나. 이 경우 Response.Write()로 바꾼다.

다. JScript인 경우에는 +=이 효율적이다.

        s=s+"a"는 s+="a"에 비해 비 효율적이다.


19. 브라우저 및 프록시 캐싱을 사용하십시오.

가. response 객체 사용

    <% Response.Expires = 10 %>

    <% Response.ExpiresAbsolute = #May 31,2001 13:30:15# %>

나. <meta>태그 이용

        <META HTTP-EQUIV=“Expires” VALUE=”May 31,2001 13:30:15”>

다. HTTP 프록시에서 캐쉬

    <% Response.CacheControl = “Public” %>

20. 가능하면 Response.Redirect가 아닌 Server.Transfer를 사용하라.(IIS 5.0)

가. 브라우저가 웹 서버에 두 번 왕복 이동한다.

나. Server.Transfer : 이동한 페이지에서 종료된다.

다. Server.Execute : 이동한 페이지에서 종료 후에 원래 페이지로 복귀한다.


21. 디렉터리 URL의 맨 마지막에 슬래시를 추가한다.

가. 슬래시가 생략되면 기본 문서가 아닌 디렉토리를 요청한 후에 기본 문서나 디렉토리 찾아보기를 실행한다.

나. <a href=“http://msdn.microsoft.com”>를 <a href=“http://msdn.microsoft.com/”>로 수정한다.


22. Request.ServerVariables 사용을 피하십시오

가. Request.ServerVariables에 액세스하면 웹 사이트가 서버에게 특수한 요청을 보내어 요청한 변수 뿐만 아니라 모든 서버 변수들을 모은다.

나. Request("Data")을 요청할 경우 Request.COOKIEs, Request.Form, Request.QueryString 또는 Request.ClientCertificate에 들어 있지 않은 항목에 대해서는 Request.ServerVariables를 호출한다.

다. Request.ServerVariables 컬렉션 속도는 다른 컬렉션 속도보다 매우 느리다.


23. 시스템 구성 요소를 최신으로 업그레이드하십시오


24. 성능 테스트를 하라.

가. Microsoft WAS(Web Application Stress) 도구 : 웹 서버를 방문하는 사용자들을 수 백명 또는 수 천명까지 시뮬레이트할 수 있다.

나. WAS는 초당 요청수, 응답 시간 배포, 오류 카운트 등을 파악


25. Stored Procedure를 사용한다. (일반 ASP자체 쿼리보다 최고 30% 성능 향상.)


26. 뷰테이블 사용 시 뷰테이블 자체에서 정렬을 해야 한다. 이미 만들어진 뷰테이블을 이용하여 Asp 코드에서 정렬하면 속도가 크게 떨어진다.


27. Query를 사용할 때 꼭 필요한 컬럼만 명시하여 불러오거나 이용해야 한다. SQL은 아주 정직해서 불러오는 컬럼의 갯수(레코드 수가 동일하다고 가정시)에 비례하여 시간이 걸린다.


28. Recordset 객체보다는 Command 객체를 이용하는 것이 빠르다. 10%정도의 향상을 볼 수 있었다.


29. Recordset 객체 사용시 CursorLocation를 적절한 것을 사용해야 한다. (1, 서버, 3. 클라이언트) 속도의 차이가 클 수 있다. CursorType도 영향을 미친다. 반드시 테스트 필요. 보통은 CursorLocation은 클라이언트에 두는 것이 추세다. 테스트때 클라이언트에 커서를 두었을때 서버에 두었을때보다 속도가 최고 3배이상 빨라지는 것을 경험했다.

30. 1000글자가 넘어가는 문장의 경우는 변수에 담아서 한번에 Response.Write 하는 것보다는 한 줄 한 줄 직접 뿌려주는 것이 빠르다.


31. 사용한 객체는 반드시 Close, Nothing 해준다. 안 해주면 메모리 누수가 일어난다. 웹서버들이 잘 죽는 경우는 반드시 이것을 체크해야 한다.

32. 다중 레코드를 이용할 시에는 Do until, Rs.MoveNext 구문보다는 GetRows() 함수를 이용하는 것이 빠르다.

33. 사용자 Function을 만들어 쓰는 것이 디버깅 등에 좋다.

34. Inlcude를 많이 시키면 속도가 느려진다고 일반적으로 알려져 있지만 실제로는 속도차이가 전혀 없다.

35. 뷰 테이블에 아무리 많은 테이블, 컬럼들을 Join 해도 단일 테이블의 같은 수의 컬럼을 사용하는 속도와 동일하다.

36. 보안 철저

가. 수시로 windows 보안 업데이트

나. 파일 업로드 위치에는 절대로 스크립트 실행 권한을 주지 않는다.

다. asp 스크립트가 주석 처리되지 않도록 한다. 

반응형
<%
Set dbCon = Server.CreateObject("ADODB.Connection")
dbCon.open ("DSN=UID=PWD=")

Set rsTmp = Server.CreateObject("ADODB.Recordset")

' 테이블명
insTb = "test"
' 사용필드
insFd = Array(ex_no, ex_writer, ex_content, ex_wdate)
' 실입력값
insVal = Array(0, "'운영자'", "'SQL 구문 모듈화 연습'", "'2002-12-17'")

' 변환하다 보니 함수를 호출할 때 문자(열)형의 인수에는 반드시 작은따옴표로
' 묶어서 넘겨줘야 SQL구문에서 문자열 인식을 할 수 있을 것 같다는 생각이...

if insSql(insTb, insFd, insVal) then
   response.write ("정상적으로 입력 되었습니다.")
else
   response.write ("정상적으로 입력하지 못하였습니다.")
end if

' 테이블명
delTb = "test"
' 삭제 검색 필드
delFd = Array(ex_no, ex_writer)
' 삭제 검색 값
delVal = Array(0, "'운영자'")
' 삭제 검색 조건
delCon = "AND"

' Delete나 Update에서의 처리 조건을 설정 할 필요가 있을 경우에 있어서
' va AND vb AND vc 혹은 va OR vb OR vb와 같은 단일조건만을 적용한 
' 검색만 가능하다고 보임...
' ((va AND vb) OR vc)는 어떻게 처리하지???
' 우선순위 등의 설정에 대해서 좀 더 고려를 해봐야 할 듯...

if delSql(delTb, delFd, delVal, delCon) then
   response.write ("정상적으로 삭제 되었습니다.")
else
   response.write ("정상적으로 삭제하지 못하였습니다.")
end if

' 테이블명
updTb = "test"
' 업데이트 필드
updSFd = Array(ex_writer)
' 업데이트 값
updSVal = Array("'항아'")
' 업데이트 조건 필드
updDFd = Array(ex_writer)
' 업데이트 조건 값
updDVal = Array("'운영자'")
' 업뎃 검색 조건
updCon = ""

if updSql(updTb, updSFd, updSVal, updDFd, updDVal, updCon) then
   response.write ("정상적으로 업데이트 되었습니다.")
else
   response.write ("정상적으로 업데이트되지 못하였습니다.")
end if

' ------------------------------------------------------------
' Insert Statement
' ------------------------------------------------------------
function insSql(tbName, insFd(), insDat())
   insSql = false ' INSERT구문의 정상적인 처리를 Check하기 위해서...

   ' insFd 와 insDat의 배열 원소 갯수 체크.
   if UBound(insFd) <> UBound(insDat) then
      response.write ("주어진 필드의 수와 입력 데이터의 수가 일치하지 않습니다.")
      exit function
   end if

   ' insFd 구문 작성
	insStr = ""
   for i = LBound(insFd) to UBound(insFd)
      insStr = insStr & insFd(i)
      insStr = insStr & ","
   next i

   ' insStr SQL 구문에서 마지막 Comma(,)를 삭제.
   insStr = RTrim(insStr)   
   if Right(insStr, 1) = "," then
      insStr = Left(insStr, Len(insStr) - 1)
   end if
   
   insStr = "INSERT INTO " & tbName & " (" & insStr & ")"
	
   ' insDat 구문 작성
   valStr = ""
   for i = LBound(insDat) to UBound(insDat)
      valStr = valStr & insDat(i)
      valStr = valStr & ","
   next i

   ' valStr SQL 구문에서 마지막 Comma(,)를 삭제.
   valStr = RTrim(valStr)
   if Right(valStr, 1) = "," then
      valStr = Left(valStr, Len(valStr) - 1)
   end if
  
   valStr = " VALUES(" & valStr & ")"

   dbCon.execute (insStr & valStr)

   insSql = ture ' INSERT구문이 정상적으로 처리가 완료되면... ture!
end function

' ------------------------------------------------------------
' Delete Statement
' ------------------------------------------------------------
function delSql(tbName, delFd(), delVal(), delCon)
   delSql = false

   if UBound(delFd) <> UBound(delVal) then begin
      response.write ("주어진 필드의 수와 입력 데이터의 수가 일치하지 않습니다.")
      exit function
   end if

   delStr = "DELETE FROM " & tbName
   
   posStr = ""
   for i = LBound(delFd) to UBound(delFd)
      posStr = posStr & delFd(i) & "=" & delVal(i)
      posStr = posStr & " " & delCon & " "
   next i
   
   posStr = RTrim(posStr)
   chkLen = Len(" " & delCon & " ")
   if Right(posStr, chkLen) = " " & delCon & " " then
      posStr = Left(posStr, Len(posStr) - chkLen)
   end if
	
   posStr = " WHERE " & posStr
	
   dbCon.execute (delStr & posStr)

   delSql = ture
end function

' ------------------------------------------------------------
' Update Statement 
' ------------------------------------------------------------
function updSql(tbName, setFd(), setVal(), delFd(), delVal(), delCon)
   updSql = false
	
   if (UBound(setFd) <> UBound(setVal)) or (UBound(delFd) <> UBound(delVal)) then
      response.write ("주어진 필드의 수와 입력 데이터의 수가 일치하지 않습니다.")
      exit function
   end if
	
   updStr = "UPDATE " & tbName
	
   setStr = ""
   for i = LBound(setFd) to UBound(setFd)
      setStr = setStr & setFd(i) & "=" & setVal(i)
      setStr = setStr & " ,"
   next i

   setStr = RTrim(setStr)
   if Right(setStr, 1) = "," then
      setStr = Left(setStr, Len(setStr) - 1)
   end if
   
   setStr = " SET " & setStr   

   'if Length(GetTrim(setStr)) <= 10 then setStr = ''
   ' 뭐하는 코드지? 왜 setStr을 체크하지?
   
   posStr = ""
   for i = LBound(delFd) to UBound(delFd)
      posStr = posStr & delFd(i) & "=" & delVal(i)
      posStr = posStr & " " & delCon & " "
   next i
	
   posStr = RTrim(posStr)
   chkLen = Len(" " & delCon & " ")
   if Right(posStr, chkLen) = " " & delCon & " " then
      posStr = Left(posStr, 1, Len(posStr) - chkLen)
   end if
   
   posStr = " WHERE " & posStr
   
   dbCon.execute (updStr + setStr + posStr)

   updSql = ture
end function
%>
반응형

+ Recent posts