Asp 구성 요소 업로드 진행률 막대 솔루션 없음

5760 단어
1. 구성 요소가 없는 업로드의 원리는 제가 조금씩 실례를 들어 설명할게요. 클라이언트 HTML은 아래와 같습니다.첨부 파일을 업로드하려면 요소를 통과해야 하지만,form의 enctype 속성을 'multipart/form-data' 로 설정해야 합니다. 백엔드 asp 프로그램에서 이전에 폼이 제출한 ASCII 데이터를 가져오는 것은 매우 쉽습니다.그러나 업로드된 파일을 가져오려면 Request 객체의 Binary Read 방법을 사용하여 읽어야 합니다.Binary Read 방법은 현재 입력 흐름에 지정된 바이트 수의 2진법으로 읽는 것입니다. 주의해야 할 것은 Binary Read 방법을 사용한 후에 더 이상 Request를 사용할 수 없다는 것입니다.Form 또는 Request.Query String이 모였습니다.Request 객체의 TotalBytes 속성을 결합하면 모든 양식에서 제출된 데이터를 이진으로 만들 수 있지만 이러한 데이터는 인코딩됩니다.먼저 이 데이터들이 어떻게 인코딩되었는지, 어떤 규칙이 있는지, 세그먼트 코드가 있는지 살펴보자. 코드에서 우리는 Binary Read가 읽은 2진법을 텍스트로 바꾸어 출력하고 백엔드의 upload를 출력한다.asp에서 (이 예시에서 큰 파일을 업로드하지 마십시오. 그렇지 않으면 브라우저가 죽을 수도 있습니다.): Dim biData, Post DataSize = Request.TotalBytesbiData = Request.BinaryRead(Size)PostData = BinaryToString(biData,Size)Response.Write "
" & PostData & "
"'pre, 있는 그대로 출력 형식'RecordSet을 사용하여 바이너리 스트림을 텍스트 Function Binary Tostring(bidata, Size) Const adLong VarChar = 201 Set RS = Create Object("ADODB. Recordset") RS. Fields로 변환합니다.Append "mBinary", adLongVarChar, SizeRS.OpenRS.AddNew  RS("mBinary").AppendChunk(biData)RS.UpdateBinaryToString = RS("mBinary").ValueRS.CloseEnd Function%> 가장 간단한 텍스트 파일(G:\homepage.txt, "보옥:http://www.webuc.net";) 텍스트 상자 filename에 기본값인"default filename"을 저장하고 출력 결과를 제출합니다. -------------------7d429871607feContent-Disposition: form-data;name="file1", filename="G:\homepage.txt"Content-Type: text/plain B옥:http://www.webuc.net-----------------------------7d429871607feContent-Disposition: form-data; "filename"default filename----------------------7d429871607fe-는 폼의 항목에 대해 "-------------------------------7d429871607fe"와 같은 경계를 사용하여 한 조각 한 조각 한 조각으로 구분한 것을 알 수 있다. 각 조각의 시작마다 묘사 정보가 있다. 예를 들어Content-Disposition:form-data;name = "filename", 설명 정보에서name = "filename"을 통해 폼 항목의name를 알 수 있습니다.filename = "G:\homepage.txt"라는 내용이 있으면 업로드된 파일이고 업로드된 파일이면 방어수수수수수타령 Content-Type: text/plain으로 파일의 Content-Type을 설명합니다.묘사 정보와 주체 정보 사이는 줄을 바꾸어 구분된다.응, 기본적으로 분명해. 이 규칙에 따라 우리는 데이터를 어떻게 분리하고 분리된 데이터를 처리해야 하는지 알았어. 그런데 하마터면 한 문제를 소홀히 할 뻔했어. 바로 경계치(상례의'--------------------------------7d429871607fe')는 어떻게 알았지?매번 이 경계값을 올릴 때마다 다르지만, 다행히 asp에서 Request를 통과할 수 있습니다.ServerVariables("HTTP CONTENT TYPE")에서 얻을 수 있습니다. 예를 들어 상례에서 HTTPCONTENT_TYPE의 내용은 "multipart/form-data;boundary=-------------------7d429871607fe"입니다. 이 경우 클라이언트의form에서enctype="multipart/form-data"를 사용했는지 판단할 수 있을 뿐만 아니라 경계치boundary=---------------------7d429871607fe도 얻을 수 있습니다.(참고: 여기서 가져온 경계 값은 위의 경계 값보다 시작 부분이 "--"보다 적어 추가하는 것이 좋습니다.)데이터를 어떻게 분석하는지에 대해 나는 더 이상 군말하지 않겠다. 단지 Instr, Mid 등 이런 함수를 빌려 우리가 원하는 데이터를 분리하는 것이다.2. 블록을 나누어 업로드하고 진도를 기록하려면 진도표를 실시간으로 반영해야 한다. 실질적으로 현재 서버가 얼마나 많은 데이터를 얻었는지 실시간으로 알아야 한다.우리가 업로드를 실현한 과정을 다시 한 번 생각해 보자. 우리는 Request를 통해Binary Read(Request.TotalBytes)는 Request 과정에서 현재 서버가 얼마나 많은 데이터를 얻었는지 알 수 없습니다.그래서 융통성 있는 방법을 통해서만 얻을 수 있다. 만약에 우리가 얻은 데이터를 한 덩어리 한 덩어리로 나누고 이미 올린 덩어리 수에 따라 현재 업로드가 얼마나 큰지 계산할 수 있다!즉, 만약에 내가 1K를 1조각으로 한다면 1MB를 올린 입력 흐름은 1024조각으로 나뉘어 얻는다. 예를 들어 내가 현재 100조각을 얻었다면 현재 100K를 올렸다는 뜻이다.내가 블록을 나누자고 했을 때 많은 사람들이 불가사의하다고 느꼈다. 왜냐하면 Binary Read 방법은 지정된 크기를 읽을 수 있을 뿐만 아니라 연속적으로 읽을 수 있기 때문이다.블록 읽기의 무결성을 검증하기 위해 예를 들어 (이 예는 큰 파일을 업로드하지 마십시오. 그렇지 않으면 브라우저가 죽을 수 있습니다): Dim bidata, Post Data, Total Bytes, Chunk Bytes Chunk Bytes = 1 * 1024'블록 크기는 1Ktotal Bytes = Request입니다.TotalBytes'총 크기 PostData = ""에서 텍스트 유형으로 바뀐 데이터 ReadedBytes = 0'을(를) 0'블록으로 초기화하여 Do While ReadedBytes TotalBytes Then ReadedBytes = TotalBytes Loop Responses.Write "
" & PostData & "
"'pre, 있는 그대로 출력 형식'을 사용하여 바이너리 스트림을 텍스트 Function Binary Tostring(bidata, Size) Const adLongVarChar = 201 Set RS = Create Object("ADODB. Recordset") RS. Fields로 변환합니다.Append "mBinary", adLongVarChar, SizeRS.OpenRS.AddNew  RS("mBinary").AppendChunk(biData)RS.UpdateBinaryToString = RS("mBinary").ValueRS.CloseEnd Function% > 방금 올린 텍스트 파일을 시험해 본 결과 블록별로 읽은 내용이 완전하다는 것을 증명했고, While 순환에서 우리는 순환할 때마다 현재 상태를 Application에 기록할 수 있으며, 이 Application에 접근해서 동적 업로드 진도표를 얻을 수 있습니다.또한: 상례에서 문자열을 통해 연결한 것으로 바이너리 데이터를 연결하려면ADODB를 통해 연결할 수 있습니다.Stream 대상의 Write 방법, 예시 코드는 다음과 같다.Set bSourceData =createobject("ADODB.Stream")bSourceData.OpenbSourceData.Type = 1 'BinaryDo While ReadedBytes < TotalBytesbiData = Request.BinaryRead(ChunkBytes)bSourceData.Write bidata'는 write 방법을 사용하여 현재 파일 흐름을 bSourceData에 ReadedBytes = ReadedBytes + ChunkBytes If ReadedBytes > TotalBytes Then ReadedBytes = TotalBytes Application ("ReadedBytes") = ReadedBytes Loop 3, 업로드된 파일을 저장하는 Request를 통해 직접 기록합니다.BinaryRead는 제출 데이터를 가져와 업로드 파일을 분리한 후 데이터 유형에 따라 저장 방식이 다르다. 이진 데이터의 경우 ADODB를 통해 직접 저장할 수 있다.바이너리 스트림을 파일로 저장하는 Stream 객체의 SaveToFile 메서드입니다.텍스트 데이터의 경우 TextStream 객체의 Write 방법을 사용하여 텍스트 데이터를 파일에 저장할 수 있습니다.텍스트 데이터와 이진 데이터는 편리하게 서로 변환할 수 있고 작은 파일을 업로드하는 데 있어서 둘은 기본적으로 별 차이가 없다.그러나 두 가지 방식으로 저장할 때 약간의 차이가 있다. ADODB에 대해서는Stream 대상은 모든 데이터를 다 불러와야 파일로 저장할 수 있기 때문에 이런 방식으로 큰 파일을 올리면 메모리를 많이 차지하지만 Text Stream 대상은 파일을 만든 후에 한 번에 Write의 일부분을 여러 번 Write로 나눌 수 있다. 이런 좋은 점은 서버 메모리 공간을 차지하지 않고 위에서 분석한 블록을 결합하여 데이터를 얻는 원리이다.업로드된 데이터를 가져올 때마다 파일에 Write를 넣을 수 있습니다.나는 실험을 한 적이 있다. 마찬가지로 본기에서 200여 MB의 파일을 업로드했는데 첫 번째 방식으로 메모리가 계속 증가했다. 마지막에 컴퓨터의 가상 메모리가 부족하다는 것을 직접 알렸다. 가장 가증스러운 것은 진도표가 파일이 업로드되었다는 것을 나타냈지만 결국 파일은 저장되지 않았다는 것이다.사용 후 한 가지 방법으로 업로드 과정에서 메모리는 기본적으로 아무런 변화가 없다.

좋은 웹페이지 즐겨찾기