Asp 구성 요소 없 는 업로드 진도 바 솔 루 션

1.구성 요소 없 이 업로드 하 는 원 리 는 제 가 조금씩 실례 를 들 어 설명 하 겠 습 니 다.클 라 이언 트 HTML 은 다음 과 같 습 니 다.업로드 첨부 파일 을 찾 으 려 면

백 엔 드 asp 프로그램 에서 이전에 폼 에서 제출 한 ASCII 데 이 터 를 가 져 오기 가 매우 쉬 웠 습 니 다.하지만 업 로드 된 파일 을 가 져 오 려 면 Request 대상 의 Binary Read 방법 으로 읽 어야 합 니 다.Binary Read 방법 은 현재 입력 흐름 을 지정 한 바이트 수의 바 이 너 리 로 읽 는 것 입 니 다.주의해 야 할 것 은 Binary Read 방법 을 사용 하면 Request.Form 이나 Request.Query String 을 사용 하여 집합 할 수 없습니다.Request 대상 의 TotalBytes 속성 을 결합 하면 모든 폼 에서 제출 한 데 이 터 를 바 이 너 리 로 바 꿀 수 있 지만 이 데 이 터 는 인 코딩 을 거 친 것 입 니 다.먼저 이 데이터 들 이 어떻게 인 코딩 되 었 는 지,규칙 적 으로 따라 갈 수 있 는 코드 가 있 는 지 살 펴 보 겠 습 니 다.코드 에서 우 리 는 Binary Read 가 읽 은 바 이 너 리 를 텍스트 로 바 꾸 고 출력 합 니 다.배경 에 있 는 upload.asp 에서(이 예제 에서 큰 파일 을 업로드 하지 마 십시오.그렇지 않 으 면 브 라 우 저 가 죽 을 수 있 습 니 다):<%Dim biData, PostDataSize = Request.TotalBytesbiData = Request.BinaryRead(Size)PostData = BinaryToString(biData,Size)Response.Write "
" & PostData & "
"  'pre 를 사용 하여 원래 출력 형식'RecordSet 을 통 해 바 이 너 리 흐름 을 텍스트 함수 바 이 너 리 ToString(biData,Size)Const adLongVarChar=201 Set RS=CreateObject("ADODB.Recordset")RS.Fields.Append"mBinary",adLongVarChar,SizeRS.OpenRS.AddNew  RS("mBinary").AppendChunk(biData)RS.UpdateBinary ToString=RS("mBinary").ValuerS.CloseEnd Function%>간단하게 가장 간단 한 텍스트 파일(G:\homepage.txt,내용 은"보옥:http://www.webuc.net";)을 업로드 합 니 다.텍스트 상자 filename 에 기본 값 인"default filename"을 유지 하고 출력 결 과 를 보 여 줍 니 다.name="file1"; filename="G:\\homepage.txt"Content-Type:text/plain 보옥:http://www.webuc.netname="filename"default filename--------------------------------------------------------------------------------------------------------------------------------------------name="filename",설명 정보 에서 name="filename"을 통 해 폼 항목 의 name 을 알 수 있 습 니 다.filename="G:\homepage.txt"라 는 내용 이 있 으 면 올 린 파일 임 을 설명 합 니 다.올 린 파일 이 라면 방 새 옆 에 있 는 방 수 는 Content-Type:text/plain 으로 파일 의 Content-Type 을 설명 합 니 다.설명 정보 와 주체 정보 사 이 는 줄 을 바 꾸 어 구분 된다.응,기본적으로 명확 해 졌 다.이 규칙 에 따라 우 리 는 데 이 터 를 어떻게 분리 해 야 하 는 지 알 고 분 리 된 데 이 터 를 처리 해 야 한다.그러나 하마터면 한 가지 문 제 를 소홀히 할 뻔 했다.바로 경계 값(상례 중의'-----------7d 429871607 fe')을 어떻게 알 았 니?이 경계 값 을 업로드 할 때마다 다 릅 니 다.다행히 asp 에 서 는 Request.server Variables("HTTP")를 통 해CONTENT_TYPE")에서 얻 을 수 있 습 니 다.예 를 들 어 상례 에서 HTTPCONTENT_TYPE 내용 은"multipart/form-data;boundary=-------------------------------------------------------------------------------------------------------------------------------------------메모:여기 서 가 져 온 경계 값 은 위의 경계 값 의 시작 보다 적 습 니 다."-"보충 하 는 것 이 좋 습 니 다.)데 이 터 를 어떻게 분석 하 는 과정 에 대해 저 는 더 이상 언급 하지 않 겠 습 니 다.InStr,Mid 등 함수 로 우리 가 원 하 는 데 이 터 를 분리 하 는 것 이 아 닙 니 다.2.블록 업로드,기록 진 도 는 실시 간 으로 진 도 를 반영 해 야 합 니 다.실질 적 으로 현재 서버 가 얼마나 많은 데 이 터 를 얻 었 는 지 실시 간 으로 알 아야 합 니 다.우리 가 업 로드 를 실현 하 는 과정 을 다시 생각해 보 자.우 리 는 Request.Binary Read(Request.TotalBytes)를 통 해 이 루어 졌 다.Request 과정 에서 현재 서버 가 얼마나 많은 데 이 터 를 얻 었 는 지 알 수 없다.그래서 변 칙 적 인 방법 을 통 해 얻 은 데 이 터 를 한 조각 한 조각 으로 나 눌 수 있다 면 이미 올 린 블록 수 에 따라 우 리 는 현재 얼마나 올 렸 는 지 계산 할 수 있 습 니 다!즉,만약 에 제 가 1K 가 1 개 라면 1MB 를 업로드 하 는 입력 흐름 은 1024 개 로 나 누 어 가 져 옵 니 다.예 를 들 어 제 가 현재 100 개 를 가 져 왔 다 면 현재 100 K 를 올 렸 다 는 것 을 나타 냅 니 다.내 가 블록 을 나 누 자고 했 을 때 많은 사람들 이 놀 랐 다.왜냐하면 그들 은 Binary Read 방법 이 지정 한 크기 를 읽 을 수 있 을 뿐만 아니 라 연속 으로 읽 을 수 있 기 때문이다.예 를 들 어 블록 읽 기의 완전 성 을 검증 합 니 다.아까 의 예 를 바탕 으로(이 예제 에 큰 파일 을 올 리 지 마 십시오.그렇지 않 으 면 브 라 우 저 가 죽 을 수 있 습 니 다):<%Dim biData,PostData,TotalBytes,ChunkBytes ChunkBytes=1*1024    ' 블록 크기 는 1KTotalBytes=Request.TotalBytes ' 전체 크기 PostData="        ' 텍스트 형식 으로 전 환 된 데이터 ReadedBytes=0       ' 0'블록 으로 초기 화 되 어 Do While ReadedBytesTotalBytes Then ReadedBytes=TotalBytes Loop Response.Write"아까 텍스트 파일 을 업로드 하 는 것 을 시험 해 보 세 요.출력 결 과 는 블록 별로 읽 은 내용 이 완전 하 다 는 것 을 증명 합 니 다.그리고 While 순환 할 때마다 현재 상 태 를 Application 에 기록 할 수 있 습 니 다.그런 후에 우 리 는 이 응용 프로그램 을 방문 하여 업로드 진행 조 를 가 져 올 수 있 습 니 다.다른:이전 예 에 서 는 문자열 로 연결 되 어 있 습 니 다.바 이 너 리 데 이 터 를 연결 하려 면 ADODB.Stream 대상 의 Write 방법 을 통 해예제 코드 는 다음 과 같 습 니 다:Set bSourceData=createobject("ADODB.Stream")bSourceData.OpenbSourceData.Type=1'Binary Do While ReadedBytesTotalBytesBytes=TotalBytesApplication("ReadedBytes")=ReadedBytesLoop 3.업 로드 된 파일 을 저장 하려 면 Request.Biary Read 를 통 해 제출 데 이 터 를 가 져 오고 업로드 파일 을 분리 한 후 데이터 형식 에 따라 저장 방식 도 다 릅 니 다.바 이 너 리 데이터 에 대해 서 는 ADODB.Stream 대상 의 SaveToFile 방법 을 통 해 바 이 너 리 스 트림 을 파일 로 직접 저장 할 수 있 습 니 다.텍스트 데이터 에 대해 서 는 TextStream 대상 의 Write 방법 을 통 해 텍스트 데 이 터 를 파일 에 저장 할 수 있 습 니 다.텍스트 데이터 와 바 이 너 리 데 이 터 는 서로 편리 하 게 전환 할 수 있 고 작은 파일 을 업로드 하 는 데 있어 서 이들 은 거의 차이 가 없다.그러나 두 가지 방식 으로 저장 할 때 차이 가 있 습 니 다.ADODB.Stream 대상 에 대해 서 는 모든 데 이 터 를 다 불 러 와 야 파일 로 저장 할 수 있 습 니 다.따라서 이런 방식 으로 큰 파일 을 업로드 하면 메모 리 를 차지 합 니 다.TextStream 대상 에 대해 서 는 파일 을 만 든 후에 한 번 에 Write 일 부 를 여러 번 나 누 어 Write 할 수 있 습 니 다.이러한 장점 은 서버 메모리 공간 을 차지 하지 않 고 위 에서 분석 한 블록 과 결합 하여 데이터 원 리 를 얻 는 것 입 니 다.우 리 는 업로드 데 이 터 를 얻 을 때마다 파일 에 Write 할 수 있 습 니 다.저 는 테스트 를 한 적 이 있 습 니 다.똑 같이 이 컴퓨터 에 200 여 MB 의 파일 을 올 렸 습 니 다.첫 번 째 방식 으로 메모리 가 계속 올 랐 습 니 다.마지막 에 컴퓨터 가상 메모리 가 부족 하 다 는 것 을 직접 알려 주 었 습 니 다.가장 가 증 스 러 운 것 은 진도 표 가 파일 이 이미 올 라 왔 다 고 표시 하 더 라 도 최종 파일 은 저장 되 지 않 았 습 니 다.사용 후 방법 은 업로드 과정 에서 메모리 가 거의 변 하지 않 았 다.

좋은 웹페이지 즐겨찾기