<폼 액션=upload.asp 메소드=포스트 enctype=멀티파트/폼-데이터>
파일 업로드:<입력 유형=파일 이름=파일1><br>
<입력 유형=제출 이름=업로드 값=업로드>
</양식>
그 중 enctype 매개변수는 양식의 MIME 인코딩 방법을 설정하는 데 사용됩니다. 파일을 업로드할 때(또는 동시에 텍스트 상자를 포함할 때) 해당 속성은 upload.asp로 설정되어야 합니다. 스트림 처리를 위한 ASP 프로그램은 이 문서의 뒷부분에서 소개됩니다.
2. 파일 형식 분석 업로드
파일을 처리하기 전에 먼저 업로드된 파일의 특정 형식을 이해해야 합니다. 다음과 같은 간단한 ASP 프로그램을 작성하여 해당 바이너리 코드를 볼 수 있습니다.
<%
filesize=Request.TotalBytes '업로드된 파일의 크기를 가져옵니다.
filedata=Request.BinaryRead(filesize) '업로드된 파일의 바이너리 데이터를 가져옵니다.
Response.BinaryWrite filedata '브라우저에 바이너리 데이터 표시
%>
브라우저에 표시된 업로드된 파일의 바이너리 코드를 분석한 결과 코드가 4개 부분으로 구성되어 있음을 확인했습니다(여러 개의 파일이나 텍스트 상자가 동시에 업로드된 경우 코드는 업로드 순서대로 배열되어 있으며 동일한 형식). ), 각 부분의 내용은 개행 문자로 구분을 사용하여 입력됩니다.
1) 첫 번째 부분(시작 플래그)
-------------7d329631b04d4
2) 2부(서류설명)
콘텐츠 처리: 양식 데이터; 이름=파일1; 파일 이름=C:/Documents and Settings/Administrator/My Documents/Invitation.doc 콘텐츠 유형: application/msword
여기에서 업로드된 파일의 파일 이름과 절대 경로, 파일 형식을 얻을 수 있습니다. 이 정보는 파일을 올바르게 저장하는 데 필수적입니다.
3) 제3부(문서내용)
즉, 파일의 바이너리 내용이 생략됩니다.
4) 4부(마지막 표시)
-------------7d329631b04d4
첫 번째 부분과 네 번째 부분의 내용을 합치면 ----------------7d329631b04d4 (업로드될 때마다 값이 다름) ) 동일)은 (업로드된 콘텐츠가 여러 개인 경우) 데이터의 시작과 끝을 표시하는 구분자 역할을 합니다. 파일을 저장하는 데 필요한 정보 측면에서 먼저 데이터의 두 번째 부분의 파일 이름에서 파일 이름을 얻은 다음 파일의 시작 위치를 올바르게 찾은 다음 마지막으로 ASP 기술을 사용하여 저장해야 합니다. 원래 파일 이름이 있는 바이너리 파일입니다. 여러 개의 콘텐츠(여러 개의 텍스트 상자 및 파일 등)를 동시에 업로드하는 경우 동일한 방식으로 처리됩니다. 콘텐츠의 각 부분은 구분 기호에 포함되지만 텍스트 상자와 파일은 약간 다른 방식으로 표현됩니다. . 이는 바이너리 코드를 구체적으로 분석하여 이해할 수 있습니다.
3. ASP 기술을 사용하여 파일 저장 구현
업로드된 파일 코드 처리
1) 구분 기호 코드 얻기
위의 분석을 통해 우리는 구분 기호가 여러 데이터 세그먼트(텍스트 상자 및 다양한 유형의 파일 포함)를 나누는 데 중요한 역할을 한다는 것을 이미 알고 있습니다. 이전에 분석한 대로 구분 기호는 첫 번째 캐리지 리턴 및 줄 바꿈 기호 앞에 나타납니다. 따라서 구분 기호 코드는 다음 프로그램을 통해 얻을 수 있습니다.
<%
newline=chrB(13) & chrB(10) ' 개행 문자는 이진 캐리지 리턴 문자를 나타냅니다.
filesize=Request.TotalBytes 'filesize는 업로드된 파일의 크기입니다.
filedata=Request.BinaryRead(filesize) 'filedata는 업로드된 파일의 바이너리 데이터입니다.
Divider=leftB(filedata,clng(instrb(filedata,newline))-1) 'divider는 구분선입니다.
%>
참고: 여기서는 바이너리 바이트코드를 다루기 때문에 모든 함수는 b가 추가된 바이너리 버전을 사용합니다.
2) 파일(또는 텍스트 상자) 내용 가져오기
(1) 준비 기능(바이너리 문자열을 문자열로 변환)
업로드된 파일의 내용은 바이너리에서 문자열로 변환하는 과정을 거치지 않고 바로 저장할 수 있습니다. 단, 텍스트 상자의 내용이나 파일 이름을 추출해야 하는 경우에는 변환을 수행해야 합니다. 따라서 한자에 적합한 범용 변환 함수를 작성하는 것이 필요하다. 다음은 함수 코드입니다.
기능 BtoS(bstr)
그렇지 않은 경우 Null(bstr)입니다.
i = 0에서 lenb(bstr) - 1까지
bchr = midb(bstr,i+1,1)
If ascb(bchr)>127 Then '한자는 2바이트이므로 두 문자를 함께 처리해야 합니다.
temp = temp&chr(ascw(midb(bstr, i+2, 1)&bchr))
나는 = 나는+1
또 다른
온도 = 온도&문자(ascb(bchr))
종료 조건
다음
종료 조건
BtoS=온도
기능 종료
(2) 파일(또는 텍스트 상자)의 내용을 가져옵니다.
실제 웹 애플리케이션에서 업로드 작업에는 여러 텍스트 상자, 여러 파일 등과 같은 여러 콘텐츠가 포함될 수 있습니다. 파일과 텍스트 상자는 쉽게 구별됩니다. 파일 데이터에는 파일 이름= 문자열이 포함됩니다. 따라서 우리는 파일 내용과 텍스트 상자 내용을 모두 추출하는 데 사용할 수 있는 다음과 같은 일반 함수를 작성했습니다(이진 변환이 필요함).
함수 getdata(byval data, byval Divider, final) 'data는 이진 문자열을 나타냅니다. final은 데이터의 끝 위치를 나타냅니다.
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34) '문자열의 이진 표현 filename=
bncrlf=chrb(13)&chrb(10) '이진 캐리지 리턴 문자
startpos = instrb(data,divider)+lenb(divider)+lenb(bncrlf) '시작 위치
endpos = instrb(startpos,data, Divider)-lenb(bncrlf) '끝 위치
part1 = midb(data, startpos, endpos-startpos) '두 구분 기호 사이의 내용
firstline = midb(part1, 1, instrb(part1, bncrlf)-1) ' 내용 앞의 설명 단락
If (instrb(firstline,filename)=0) Then '텍스트 상자인 경우 텍스트 상자 문자열 내용을 가져옵니다.
줄기=midb(부분1,instrb(부분1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf),lenb(부분1)-instrb(부분1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
getdata=BtoS(단계)
Else '파일인 경우 파일의 바이너리 내용을 가져옵니다.
Getdata=midb(부분1, instrb(부분1, bncrlf&bncrlf)+lenb(bncrlf&bncrlf), lenb(부분1)
-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
종료 조건
최종=끝 위치
기능 종료
프로그램에서 이 함수를 직접 호출하면 아래와 같이 필요한 파일(또는 텍스트 상자)의 내용을 얻을 수 있습니다.
<%
Content=getdata(데이터, 구분선, 위치)
%>
3) 파일명을 알아낸다
이전에 분석한 대로 업로드 파일 데이터 스트림의 filename= 필드에는 파일의 이름과 절대 경로가 포함됩니다. 일반적으로 경로에서 파일 이름만 추출하면 됩니다. 다음은 프로그램 코드입니다.
<%
namepos=instrrev(B2S(firstline),chr(92)) 'firstline은 위에서 얻은 설명 부분 데이터, chr(92)
표현하다/
filename=midb(firstline,namepos+1,lenb(firstline)-namepos-1) '파일 이름을 가져옵니다.
%>
ASP를 사용하여 파일 업로드 기능을 직접 구현
기존 ASP 프로그래머는 FILESYSTEMOBJECT 개체를 사용하여 텍스트 파일(.txt)에 대한 이동, 복사, 삭제 및 기타 작업을 수행할 수 있습니다. 이진 개체를 처리해야 하는 경우 이 문서의 앞부분에서 소개한 방법을 사용해야 합니다. 그러나 이제 ASP의 ADO.STREAM 개체는 텍스트 개체와 바이너리 개체를 동시에 작동할 수 있으며(http://www.microsoft.com/data에서 다운로드 가능) 이를 사용하여 파일 업로드를 직접 구현할 수 있습니다. ASP에서 기능을 수행합니다. 아래에서는 구현 과정을 소개합니다.
1) STREAM 객체 열기
SREAM 개체의 경우 파일을 저장하려면 개체의 전체 내용을 저장해야 합니다. 따라서 두 개(또는 그 이상)의 STREAM 객체를 생성해야 합니다. 그 중 하나는 초기 바이너리 데이터를 수신하는 소스 데이터 스트림이고, 다른 하나는 소스 데이터 스트림에서 처리된 데이터를 수신하는 대상 데이터 스트림입니다. 원하는 파일에 저장하세요.
<%
set str=server.CreateObject(ADODB.Stream) 'str은 소스 데이터 스트림입니다.
str.Mode=3 '개방 모드를 설정합니다. 3은 읽고 쓸 수 있습니다.
str.Type=1 '데이터 유형을 설정합니다. 1은 바이너리 데이터입니다.
str.Open
set desc=server.CreateObject(ADODB.Stream) 'desc는 대상 데이터 스트림입니다.
설명.모드=3
설명 유형=1
설명.열기
%>
2) STEAM 개체 간 콘텐츠 복사
이 부분에서는 파일을 대상 데이터 스트림에 올바르게 복사하고 파일을 저장하기 전에 소스 데이터 스트림에서 파일의 시작 부분을 찾고 파일 내용의 길이를 찾아야 합니다.
<%
formdata=Request.BinaryRead(Request.TotalBytes) 'formdata는 업로드된 모든 콘텐츠입니다
str.Write formdata ' 할당 소스 데이터 스트림
str.position=count-lenb(result)-2 '위치는 파일의 시작을 가리킵니다.
str.copyto desc, lenb(filecotent) 'lenb(filecontent)는 파일의 길이를 나타냅니다.
desc.SaveToFile fullpath,2 'fullpath에서 지정한 경로와 이름으로 파일을 저장합니다.
%>
3) STEAM 개체를 닫습니다.
프로그래밍이 완료되면 STEAM 개체를 다음과 같이 닫고 해제해야 합니다.
<%
설명 닫기
설명=아무것도 설정하지 않음
닫기
STR=아무것도 설정하지 않음
%>
요약
본 논문에서는 본 단원에서 개발한 정보관리 시스템에 잘 적용된 ASP를 이용하여 파일업로드를 직접 구현하는 방법을 제시한다. 실습을 통해 이 방법이 여러 기존 파일 업로드 방법보다 더 간단하고 효율적이라는 것이 입증되었습니다.