ASP(Active Server Page)는 프로그래밍이 쉽고 강력한 기능을 갖춘 동적 웹 사이트를 신속하게 개발할 수 있기 때문에 현재 많은 웹 사이트(특히 인트라넷/엑스트라넷 인트라넷)가 NT+IIS+ASP 모델을 채택하고 있으며 ASP를 표준으로 삼고 있습니다. 현재 웹사이트 개발에 가장 많이 사용되는 스크립트 언어입니다. WEB 서비스에서 파일 업로드 서비스는 매우 일반적인 기능이지만 WIN9X의 PWS는 관련 구성 요소를 제공하지 않으며 NT의 IIS는 Post를 제공합니다. Acceptor 컴포넌트는 사용자의 WWW 접근 권한을 확인하기 때문에 사용이 쉽지 않으며, 관련 컴포넌트를 인터넷에서 다운로드할 수도 있으나 대부분 상용 컴포넌트이고, 다운로드에 사용되는 컴포넌트는 체험판입니다. 시간 또는 기능에 제한이 있습니다. ASP는 표준 OLE/COM 구성 요소를 호출할 수 있으므로 VB/VC/DELPHI와 같은 고급 프로그래밍 도구를 사용하여 자체 요구 사항에 따라 자체 ASP 파일 업로드 구성 요소를 사용자 정의하여 자체 응용 프로그램 시스템 요구 사항을 충족할 수 있습니다.
다음에서는 DELPHI를 사용하여 ASP용 파일 업로드 구성 요소를 개발하는 원리와 구체적인 구현 프로세스에 대해 설명합니다.
1. 파일 업로드 구현 원리
웹 기반 데이터 업로드는 RFC1867 표준을 준수해야 하며, 업로드된 파일 데이터도 예외는 아닙니다. 예를 들어 다음 HTML 페이지 파일(delphiup.htm)을 사용하여 업로드 파일을 선택합니다.
<!-- DelphiUp.htm: 파일 업로드 인터페이스 -->
<html><head><title>파일 업로드</title></head><body>
DELPHI로 작성된 파일 업로드 구성 요소를 사용하여 파일 업로드 구현
<form NAME="UploadForm" ACTION="delphiup.asp" METHOD="POST" ENCTYPE="multipart/form-data">
<p>다른 이름으로 파일 저장: <input TYPE=text NAME="SaveAs">
<p>업로드할 파일을 선택하세요: <input TYPE=file NAME="FileData">
<input type="submit" name="b1" value="업로드 확인"> </p>
</form>
</body></html>
클라이언트가 파일(예: "업로드할 파일의 내용은 여기에 있습니다."라는 내용의 Test.TXT)을 선택하고 키를 누릅니다.
"업로드 확인" 버튼을 눌러 데이터를 제출한 후 서버 측 프로그램에서 수신한 데이터는 다음과 같은 형식을 갖습니다.
--------------------------7cf1d6c47c#13#10
콘텐츠 처리: 양식 데이터 이름="다른 이름으로 저장"#13#10#13#10
새파일이름#13#10
-------------7cf1d6c47c#13#10
내용-처리: 양식-데이터; 이름="FileData"; 파일명="D: est.txt"
콘텐츠 유형: 텍스트/일반#13#10#13#10
업로드할 파일의 내용은 다음과 같습니다. #13#10
-------------7cf1d6c47c#13#10
내용-처리: 양식-데이터 이름="b1"#13#10#13#10
업로드 확인#13#10
-------------7cf1d6c47c--
그 중 "--------------------------------7cf1d6c47c"는 형식에서 각 필드를 구분하는 데 사용되는 구분 기호입니다( 형태);
#13#10은 캐리지 리턴 및 줄 바꿈 문자의 DELPHI 표현입니다. 이런 식으로 생각할 수 있습니다. 각 양식 필드의 정보 설명은 구분 기호와 한 쌍의 캐리지 리턴 및 줄 바꿈으로 시작합니다. #13#10 양식 도메인 이름은 "name=""으로 시작하고 """로 끝납니다. ; 양식 필드 값은 두 쌍의 캐리지 리턴 및 줄 바꿈 문자 #13#10#13#10으로 시작하고 한 쌍의 캐리지 리턴 및 줄 바꿈 문자 #13#10#과 파일 이름으로 끝납니다. "filename=""으로 시작하고 """로 끝납니다. 이러한 플래그를 사용하면 양식 필드의 이름과 값, 업로드할 파일의 이름을 얻을 수 있으므로 파일 데이터를 읽고 저장할 수 있습니다.
2. 파일 업로드 구현 과정
위에서 언급한 데이터 형식을 이해하고 나면 파일 업로드 구성 요소를 직접 작성하는 것이 더 이상 어렵지 않습니다.
(1) ASP 구성요소를 생성하기 위한 프로젝트를 시작합니다.
DELPHI를 사용하여 OLE 자동화 서버를 개발하는 단계에 익숙하지 않은 경우 "Electronics and Computers", Issue 06, 1999의 "DELPHI를 사용하여 ASP용 OLE 자동화 서버 개발" 기사를 참조하십시오.
여기서는 단계를 간략하게 소개합니다.
1. ActiveX 라이브러리 프로젝트 생성
DELPHI에서 File="New... 메뉴를 선택하고 "New Item" 대화 상자의 ActiveX 탭에서 "ActiveX Library"를 선택하면 DELPHI가 자동으로 DLL 프로젝트 PRoject1을 생성합니다.
2. 자동화 구성요소 생성
DELPHI에서 File="New... 메뉴를 선택하고 "New Item" 대화 상자의 ActiveX 탭에서 "Automation Object"를 선택한 다음 "Automation Object Wizard"에 클래스 이름(예: "UploadFile")을 입력합니다. " 대화 상자, 인스턴스화 "다중" 선택 Instance". "OK"를 클릭하면 DELPHI는 자동으로 TLB(Type Library) 파일 Project1_TLB.PAS와 PAS(Unit) 파일 Unit1.PAS를 생성합니다. 형식 라이브러리 디자인 창에서 Project1의 이름을 MyUpload로 바꾸면 파일 업로드 구성 요소의 OLE 등록 코드가 "MyUpload.UploadFile"입니다.
3. ASP 유형 라이브러리 소개
ASP에 내장된 5가지 개체(요청, 응답, 서버, 애플리케이션, 세션)를 사용하려면 ASP 형식 라이브러리가 도입되어야 합니다. 우리는 주로 클라이언트에서 서버로 전달된 데이터를 읽기 위해 Request 객체를 사용합니다.
프로젝트 메뉴에서 "유형 라이브러리 가져오기"를 선택하고 "유형 라이브러리 가져오기" 대화 상자의 "유형 라이브러리" 목록에서 "Microsoft Active Server Pages 개체 라이브러리(버전)"를 선택합니다. 2.0)" (이 옵션을 사용할 수 없는 경우 컴퓨터에 IIS3 이상 또는 PWS4 이상이 설치되어 있고 ASP.DLL이 올바르게 등록되어 있는지 확인하십시오.), D ELPHI는 필요한 ASP 개체 유형 선언이 포함된 TLB 파일 ASPTypeLibrary_TLB.PAS를 자동으로 생성합니다.
4. OnStartPage 및 OnEndPage 프로세스 정의
Server.CreateObject를 사용하여 ASP 페이지에 OLE 개체 인스턴스를 만들면 웹 서버는 OnStartPage 메서드를 호출하고 ASP 응용 프로그램 환경 정보를 개체에 전달합니다. , 이 프로세스 중에 클라이언트 정보를 얻을 수 있습니다. ASP 페이지에서 OLE 개체 인스턴스가 해제되면 웹 서버는 해당 메서드 OnEndPage를 호출하고 이 프로세스 중에 메모리 해제와 같은 종료 작업을 수행할 수 있습니다. 구성 요소에서는 OnStartPage 메서드를 사용해야 합니다.
OnStartPage 메서드는 Unit1.PAS에 정의되어야 합니다. OnStartPage의 함수 프로토타입은 다음과 같습니다.
프로시저 OnStartPage(AScriptingContext: IUnknown);
AScriptingContext 매개 변수는 ASP에서 동일한 이름을 가진 5개의 내장 개체에 해당하는 5개의 특성(요청, 응답, 서버, 응용 프로그램, 세션)을 포함하는 IScriptingContext 유형 변수입니다.
TLB 정의 창(View="Type Library)의 IUploadFile에 OnStartPage 메서드를 추가해야 하며 해당 선언문은 "procedure OnStartPage(AScriptingContext: IUnknown);"입니다.
(2) 클라이언트가 업로드한 데이터 추출
이 작업은 OnStartPage 프로세스에서 수행할 수 있습니다.
AScriptingContext의 Request(type IRequest) 속성에서 TotalBytes(요청 정보 내용 길이) 속성과 BinaryRead 메서드를 사용하여 클라이언트가 업로드한 요청 정보 데이터를 Byte 유형 배열로 읽어온 후 RFC1867에서 정의한 데이터 형식을 사용할 수 있습니다. 데이터를 분석하고 추출하는 표준입니다.
1. 먼저 TUploadFile의 여러 개인 변수를 정의합니다.
유닛 파일 UP01.PAS(Unit1.PAS에 의해 저장됨)에 ASPTypeLibrary_TLB.PAS(사용)에 대한 참조를 추가합니다.
그럼 가입해
사적인
FContentLength: LongInt; //정보 콘텐츠 길이 요청
FContentData: Variant;//콘텐츠 데이터, 요청 정보 콘텐츠를 배열 형식으로 저장합니다.
FFileName, //업로드할 파일 이름
FDelimeter: 문자열; //양식 필드 구분 기호
FScriptingContext: IScriptingContext;//ASP는 컨텍스트 콘텐츠를 처리합니다.
FFileDataStart, //파일 데이터의 시작 위치
FFileDataEnd: LongInt; //파일 데이터의 끝 위치;
2. 클라이언트가 업로드한 요청 정보 데이터를 추출합니다.
//OnStartPage 이벤트에서 ASP 컨텍스트 정보, 요청 정보 콘텐츠, 양식 필드 구분 기호 및 파일 데이터를 가져옵니다.
프로시저 TUploadFile.OnStartPage(AScriptingContext: IUnknown);
var
ARequest: IRequest; //WWW 요청 객체
AOleVariant: OleVariant; //요청 정보 내용의 길이를 기록합니다.
intDelimterLength: 정수;//구분자 길이
longIndex,ALongInt,longPos : LongInt;
ContentData: AnsiString;//요청 정보 내용의 문자열 표현
strTemp: 문자열;
FindEndOfFileData: boolean;//파일 데이터의 끝 위치를 찾았는지 여부
시작하다
//클라이언트가 업로드한 요청 정보 데이터 추출
FScriptingContext := AScriptingContext as IScriptingContext;//ASP 컨텍스트 정보 가져오기
ARequest := FScriptingContext.Request;//WWW 요청 정보 가져오기
FContentLength := ARequest.TotalBytes;//요청 정보 콘텐츠 길이
//요청 정보 내용을 배열 형태로 저장하기 위한 동적 배열을 생성합니다.
FContentData := VarArrayCreate( [0,FContentLength], varByte );
//요청 정보 내용을 배열에 저장
AOleVariant := FContentLength;
FContentData := ARequest.BinaryRead(AOleVariant);//요청 정보 내용 읽기
//쉬운 위치 지정을 위해 요청 정보 내용을 문자열로 변환합니다.
콘텐츠데이터 := ';
longIndex의 경우 := 0에서 FContentLength - 1 do
시작하다
ContentData := ContentData + chr( Byte( FContentData[ longIndex ] ));
FContentData[ longIndex ] = 0이면 break;//0은 콘텐츠의 끝을 나타냅니다.
끝;
3. 구분 기호 가져오기 및 파일 이름 업로드
//양식 필드의 구분 기호를 가져옵니다.
longPos := pos( #13#10,ContentData );//캐리지 리턴 및 줄 바꿈 문자의 위치
FDelimeter := Copy( ContentData,1,longPos-1);//이 위치 앞의 내용은 구분 기호입니다.
//소스 경로로 파일 이름을 가져옵니다. 요청 정보 내용에서 파일 이름은 다음으로 시작합니다.
//filename="path/filename" 형태로 저장
strTemp := 'filename="';//파일 이름은 "filename="" 뒤에 있습니다.
longPos := pos( strTemp, ContentData );//"filename="" 위치 가져오기
longPos <= 0이면
시작하다
F파일이름 := ';
FFileDataStart := -1;
FFileDataEnd := -2;
출구;
끝;
//다음 큰따옴표 """ 앞의 콘텐츠, 즉 소스 경로가 있는 파일 이름을 가져옵니다.
longPos := longPos + length( strTemp );
strTemp := ';
for longIndex := longPos에서 FContentLength로 - 1 do
if ContentData[ longIndex ] <> '"' 그러면
strTemp := strTemp + ContentData[ longIndex ]
그렇지 않으면 휴식;
FFileName := strTemp;
4. 요청 정보 내용에서 파일 데이터의 시작 및 끝 위치를 얻습니다.
//파일 데이터의 시작 위치는 파일 이름 뒤의 첫 번째 #13#10#13#10 이후입니다.
삭제(ContentData, 1, longIndex);
strTemp := #13#10#13#10;
FFileDataStart := longIndex + pos(strTemp, ContentData) + length(strTemp) - 1;
//파일 데이터의 끝 위치는 다음 #13#10과 구분 기호 앞입니다.
//파일 데이터에 잘못된 문자가 포함될 수 있으므로 문자열 위치 지정 기능 POS를 더 이상 사용할 수 없습니다.
//다음 구분 기호의 위치를 찾습니다.
FFileDataEnd := FFileDataStart;
intDelimterLength := 길이( FDelimeter );
FindEndOfFileData := 거짓;
FFileDataEnd <= FContentLength - intDelimterLength do
시작하다
FindEndOfFileData := true;
ALongInt := 0 ~ intDelimterLength - 1 do
if Byte( FDelimeter[ ALongInt + 1 ] ) <>
FContentData[FFileDataEnd + ALongInt] 그런 다음
시작하다
FindEndOfFileData := 거짓;
부서지다;
끝;
FindEndOfFileData이면 중단됩니다.
FFileDataEnd := FFileDataEnd + 1;
끝;
FindEndOfFileData가 아니면 FFileDataEnd := FFileDataStart - 1//구분자를 찾을 수 없습니다.
else FFileDataEnd := FFileDataEnd - 3;//구분자, 앞으로 건너뛰기 #13#10
끝;
(3) ASP 프로그램으로 정보를 전송한다
작업 (2)를 수행한 후 업로드 구성 요소는 요구 사항에 따라 ASP 프로그램에 데이터를 전달할 수 있습니다. 현재 사용 가능한 데이터에는 클라이언트 소스 파일 이름(FFileName, 경로 포함), 파일 크기(FFileDataEnd-FFileDataStart+1)가 포함됩니다.
먼저, TLB 디자인 창에서는 다음 두 가지 GetFileName, GetFileSize 메소드를 선언해야 합니다.
1. 클라이언트 소스 파일 이름(경로 포함)을 반환합니다.
//클라이언트 소스 파일 이름(경로 포함)을 반환합니다.
함수 TUploadFile.GetFileName: OleVariant;
시작하다
result := FFileName;//클라이언트 소스 파일 이름(경로 포함)
끝;
2. 반환 파일 크기
//파일 크기(바이트)를 반환합니다.
함수 TUploadFile.GetFileSize: OleVariant;
시작하다
결과 := FFileDataEnd - FFileDataStart + 1;
끝;
(4) 파일 저장
작업 (2)를 수행한 후 업로드 구성 요소는 ASP 프로그램의 요구 사항에 따라 파일을 저장할 수 있습니다. 먼저 그것은에 있어야합니다
TLB 디자인 창에는 SaveFileAs, SaveFile 두 가지 메소드가 선언되어 있습니다.
1. 지정된 파일명에 따라 파일을 저장합니다.
//지정된 파일 이름에 따라 파일을 저장합니다. FileName 매개변수는 지정된 파일 이름입니다. 반환 값 True는 파일이 성공적으로 저장되었음을 나타냅니다.
함수 TUploadFile.SaveFileAs(파일 이름: OleVariant): OleVariant;
var
longIndex : LongInt;
AFile: 바이트 파일;//바이너리 형식으로 파일을 저장합니다.
바이트데이터 : 바이트;
시작하다
결과 := 참;
노력하다
할당(A파일, 파일 이름);
다시 쓰기(A파일);
longIndex := FFileDataStart에서 FFileDataEnd로 수행
시작하다
byteData := Byte( FContentData[ longIndex ] );
쓰기(A파일, 바이트데이터);
끝;
닫기파일(A파일);
제외하고
결과 := 거짓;
끝;
끝;
2. 기본 파일명으로 파일을 저장합니다.
//기본 파일명에 따라 파일을 저장하고, 호출 페이지가 위치한 디렉터리에 같은 이름으로 파일을 저장한다.
함수 TUploadFile.SaveFile: OleVariant;
var
현재파일경로 : 문자열;
시작하다
//호출 페이지가 위치한 디렉터리를 가져옵니다.
CurrentFilePath := FScriptingContext.Request.ServerVariables['PATH_TRANSLATED'];
CurrentFilePath := ExtractFilePath( 현재FilePath );
//파일 저장
결과 := SaveFileAs( CurrentFilePath + ExtractFileName( FFileName ));
끝;
3. 업로드 구성 요소의 적용 예
이 예에서 DelphiUp.HTM은 파일 업로드 인터페이스이고 DelphiUp.ASP는 파일 업로드 작업을 수행하는 데 사용됩니다.
DelphiUp.ASP의 코드는 다음과 같습니다.
<!--DelphiUp.ASP: 파일 업로드 처리 페이지-->
<html><head><title>파일 업로드</title></head><body>
<% 희미 업로드, 파일 이름
업로드 = Server.CreateObject("MyUpload.UploadFile") 설정
파일 이름 = Upload.GetFileName
응답.쓰기 "<br>파일 ""&FileName&"" 저장 중..."
Upload.SaveFile인 경우
Response.Write "<br>""&FileName&"" 파일이 성공적으로 업로드되었습니다."
Response.Write "<br>파일 크기는 "&Upload.GetFileSize&"바이트입니다."
또 다른
Response.Write "<br>파일 ""&FileName&""을 업로드하지 못했습니다."
종료하면
업로드=아무것도 설정하지 않음 %>
</body></html>
4. 몇 가지 설명
1. DELPHI에서 자동으로 생성된 소스 코드에서 컴파일된 DLL 파일의 크기는 215K이며, 다음에서 확인할 수 있습니다.
ASPTypeLibrary_TLB.PAS의 인터페이스 섹션에서 ActiveX를 제외한 사용 항목의 모든 유닛을 삭제합니다.
MyUpload_TLB.PAS의 Uses에서 모든 유닛을 삭제하면 생성되는 DLL 파일의 크기를 61K로 줄일 수 있습니다.
2. 위 방법은 CGI 프로그램에도 적용 가능하지만, 반드시 TWebRequest 객체를 사용해야 합니다.
위 프로그램은 디버깅되었으며 PWIN98+Delphi3.0+PWS4.0에서 전달되었습니다.