작성 아이디어: 클라이언트에서 base64로 로컬 파일을 인코딩한 다음 대상으로 보냅니다.
테스트 중 업로드된 파일이 너무 커서 시간 초과 및 오류가 발생했습니다.
나중에 개선되어 20M의 테스트가 성공적으로 이루어졌습니다.
작성 목적: 기존 솔루션에서는 한 번에 하나씩 선택하여 업로드할 수 있지만 데이터베이스의 파일 경로를 읽고 이러한 파일을 한 곳에 업로드하는 경우 더 번거롭습니다.
물론 ftp를 사용하여 경로를 하나씩 찾는 것도 가능하지만 매번 이러한 파일을 찾는 데는 시간이 더 많이 걸릴 것입니다. 여기 글을 쓰는 목적은 주로 데이터베이스의 파일 경로를 통해 파일을 얻어서 한 번에 한 곳에 일괄 업로드하는 것입니다.
주요 목적은 자신을 훈련하는 것입니다.
해결 과정: 처음에는 시뮬레이션된 키보드 입력을 사용하여 파일 컨트롤에 값을 강제로 할당하고 전통적인 방법을 사용하여 업로드하려고 했습니다. 그런데 항상 null 값이 발생하고 심지어 많은 파일이 전송되지 않습니다. 몇 가지 정보를 참조한 후 이제 데이터베이스를 통해 모든 경로를 가져와서 js에 쓰고 있습니다. 그런 다음 프런트 데스크에서 js를 사용하여 이러한 경로를 읽고 xmlhttp를 통해 파일을 보냅니다.
Internet Explorer는 xmlHttp를 별로 좋아하지 않고 항상 악의적인 동작이 있다고 생각하기 때문에 항상 경고를 표시하므로 작동 중에는 웹 경로를 사용하여 액세스할 수만 있습니다.
그런 다음 서버에는 이러한 인코딩을 수신하고 이를 디코딩하는 파일이 있습니다. ^_^
현재 많은 코드가 여전히 개선되고 있습니다.
간략한 소개:
------------------------------------- ----------
aryFiles.push(c://aaa.zip);
aryFiles.push(c://bbb.exe);
다음은 파일 경로와 파일이 여러 개일 수 있습니다.
앞으로는 파일 제어를 통해 클라이언트에서 이 경로를 얻을 수도 있습니다.
http://www.xxx.com/xxx/xxx.asp
목적지는 이곳이며, 원하는 주소로 변경하시면 됩니다.
ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename)
server.mappath(.) &/& + str_filename 읽을 파일은 다음과 같습니다.
server.mappath(.) &/& 경로가 저장 경로와 일치합니다.
ado_stream.SaveToFile server.mappath(.) &/& str_filename,2
server.mappath(.) &/& 파일을 저장할 경로입니다. str_filename은 파일 이름입니다.
여기에서 읽는 것과 저장하는 것은 프로그램이 위치한 디렉토리에 위치하며, 테스트할 때에도 이렇게 보관할 수 있습니다.
첫 번째 코드 부분을 로컬에 넣습니다(예:c:/upload.htm).
두 번째 코드 부분을 로컬 서버 또는 공용 서버일 수 있는 서버에 배치합니다. 위의 대상과 일관성을 유지하세요.
(예: http://www.xxx.com/upload.asp 또는 http://localhost/www/upload.asp)
------------------------------------- ---------------
조치: 첫 번째 코드가 저장된 위치를 찾으십시오. 그냥 실행하세요(예: C 드라이브를 열고 upload.htm 실행).
클라이언트 코드</P><P><html><head></head><body> <input type=button onclick=BeginSendFiles() value=Send/> <input type=button onclick=JavaScript: Breaked= true ; 값=인터럽트/> <div id=ddd 너비=300px></div> </br> <DIV id=div_message></DIV></body></P><P><script 언어=VBScript>함수 bytes2BSTR(vIn) strReturn = For i = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn,i ,1)) ThisCharCode < &H80이면 strReturn = strReturn & Chr(ThisCharCode) Else NextCharCode = AscB(MidB(vIn,i+1,1)) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) i = i + 1 End If Next bytes2BSTR = strReturnEnd 함수</script></P ><P><스크립트 언어=javascript> var xmlhttp; var ado_stream; mPartID, mPartEnd; var BlockSize; var Breaked; var aryFiles;</P><P> BlockSize = 1024*100; //매번 전송되는 바이트 수 = new Array(); P> P><P> // 파일 보내기 시작 function BeginSendFiles() { initAryFiles(); SendFile(aryFiles.pop()); } // 전송할 파일 배열 구성 function initAryFiles() { aryFiles.push(c://aaa.zip) aryFiles.push(c://bbb.exe) ;//c://aaa. zip c ://bbb.exe local file aryFiles.reverse() ;//파일 이름}</P><P> function SendFile(vFullPath) { // 다음과 같은 경우 빈 파일은 업로드되지 않습니다. (!vFullPath) { return ; } Breaked = false ; div_message.innerHTML = ; ado_stream = new ActiveXObject(ADODB.Stream); // 파일 스트림 읽기 ado_stream.Open(); ); // 파일 읽기 ado_stream.position = 0;</P><P> SendCount = Math.ceil(ado_stream.size/BlockSize) ; // 남으면 한 번 더 보냅니다.</P><P> // Alert(SendCount) ;</P><P> var reg = //b /w+./w+$/gi mFileName = reg.exec(vFullPath) ; mPartID = 1 ; SendData() ; { if (SendCount > 0) { var dom = new ActiveXObject(msxml2.DOMDocument); // xml 파일 보내기 dom.async = false dom.resolveExternals = false;</P><P> // xml 파일 헤더 구성 var node = dom.createProcessingInstruction(xml,version='1.0'); dom.appendChild(node); // 루트 노드 구성 var root = dom.createElement(root); dom.documentElement.setAttribute(xmlns:dt, urn:schemas-microsoft-com:datatypes); 바이너리 데이터 node = dom.createElement(upData); node.dataType = bin.base64; base64 인코딩 var att = dom.createAttribute(FileName); // 파일 이름 속성 att.value = mFileName; node.setAttributeNode(att) = null; // 섹션 시작 표시 att .value = mPartStart; node.setAttributeNode(att); att = null; dom.createAttribute(PartID); 섹션 번호 att.value = mPartID(att); att = null; var att = dom.createAttribute(PartEnd); // 섹션 끝 표시 att.value = mPartEnd(att); ;</P><P> root.appendChild(node) ; node.nodeTypedValue = ado_stream.Read(BlockSize); 노드 데이터는 고정 길이 node = null; xmlhttp = new ActiveXObject(Microsoft.XMLHTTP)에서 읽혀집니다(POST,http://www.xxx.com/xxx/xxx.asp, false); //http://www.xxx.com/xxx/xxx.asp는 웹 경로의 파일입니다. xmlhttp.onreadystatechange= CallBack; xmlhttp.send(dom); = null } else { ado_stream.Close(); ado_stream = null } } function CallBack() { // 업로드 성공 if(xmlhttp.readystate == 4) { // 업로드가 중단되었는지 확인합니다. return ; }</P><P> if (SendCount > 0) { mPartID += 1; // div_message.innerHTML += ( + xmlhttp.ResponseText) ; var p = Math.floor((mPartID/(Math.ceil(ado_stream.size/BlockSize) + 1)) * 100) ; // 진행률 계산ShowBar(p) ; );, 1) ; } else { // 파일 전송 완료 //div_message.innerHTML += mFileName + 전송 완료! ;</P><P> // 계속해서 다음 파일 전달 ShowBar(0) ; var cFile = aryFiles.pop() } } </P><P> }</P>< P > function ShowBar(per) { // 진행률 표시줄 ddd.innerHTML = <table width='200' border=0 cellpadding='0'cellspacing='0' ><tr><td bgcolor='#6699FF'><입력 유형=버튼 스타일=' 너비: + 당 + % ; 테두리:0px 배경:#FFFFFF' 값= + 당 + %> </td></tr ></table> }</P><P></script></html></P><P>
서버 측
</P><P><%@ LANGUAGE=VBScript%><% Option ExplicitResponse.Expires = 0 </P><P>' 변수와 개체를 정의합니다. Dim ado_streamdim xml_domdim xml_datadim str_filenamedim bol_PartStartdim int_PartIDdim bol_PartEnd </P><P>' 스트림 개체 집합 만들기 ado_stream = Server.CreateObject(ADODB.Stream)' 요청 개체 집합에서 XMLDOM 개체 만들기 xml_dom = Server.CreateObject(MSXML2.DOMDocument)xml_dom.load(request)' 이진 데이터 세트가 포함된 노드 읽기 xml_data = xml_dom.selectSingleNode(root/upData)str_filename = xml_data.getAttribute(FileName)bol_PartStart = CBool(xml_data.getAttribute(PartStart) ))int_PartID = CInt(xml_data.getAttribute(PartID))bol_PartEnd = CBool(xml_data.getAttribute(PartEnd))</P><P>' Stream 개체를 열고 여기에 데이터를 저장합니다 ado_stream.Type = 1 ' 1=adTypeBinary ado_stream.open bol_PartStart가 아니면 ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename) ' 파일 읽기 ado_stream.position = ado_stream.sizeend ifado_stream.Write xml_data.nodeTypedValue' 파일 저장 ado_stream.SaveToFile server.mappath(.) &/& str_filename,2'파일 저장 2=adSaveCreateOverWrite ado_stream.close </P><P> '자원 해제 설정 ado_stream = 아무것도 설정 xml_dom = 없음' 브라우저에 정보 반환 Response.Write 업로드 성공!& str_filename & int_PartID & bol_PartStart%> </P><P>