แนวคิดในการเขียน: เข้ารหัสไฟล์ในเครื่องด้วย base64 บนไคลเอนต์ จากนั้นส่งไปยังปลายทาง
ในระหว่างการทดสอบ ไฟล์ที่อัปโหลดมีขนาดใหญ่เกินไป ทำให้เกิดการหมดเวลาและเกิดความล้มเหลว
ต่อมาได้รับการปรับปรุง การเข้ารหัสถูกส่งเป็นกลุ่ม การทดสอบ 20M สำเร็จ
วัตถุประสงค์ของการเขียน: ในโซลูชันแบบเดิม คุณสามารถเลือกและอัปโหลดทีละไฟล์ได้ อย่างไรก็ตาม จะยุ่งยากกว่าเมื่อต้องอ่านเส้นทางของไฟล์ในฐานข้อมูลและอัปโหลดไฟล์เหล่านี้ไปยังที่เดียว
แน่นอนว่าเป็นไปได้ที่จะใช้ ftp เพื่อค้นหาเส้นทางทีละรายการ แต่จะใช้เวลานานกว่าสำหรับฉันในการค้นหาไฟล์เหล่านี้ทุกครั้ง จุดประสงค์ของการเขียนที่นี่คือเพื่อรับไฟล์ผ่านเส้นทางของไฟล์ในฐานข้อมูลและอัปโหลดไฟล์ไปยังที่เดียวทีละชุด
จุดประสงค์หลักคือเพื่อฝึกฝนตัวเอง
กระบวนการแก้ปัญหา: ในตอนแรก ฉันพยายามใช้อินพุตคีย์บอร์ดจำลองเพื่อกำหนดค่าให้กับการควบคุมไฟล์อย่างจริงจัง และอัปโหลดโดยใช้วิธีดั้งเดิม แต่ฉันมักจะพบค่าว่างและแม้แต่ไฟล์จำนวนมากก็ไม่ถูกส่งออกไป หลังจากปรึกษาข้อมูลบางอย่างแล้ว ตอนนี้ฉันกำลังดึงข้อมูลเส้นทางทั้งหมดผ่านฐานข้อมูลและเขียนลงใน js จากนั้นใช้ js ที่แผนกต้อนรับเพื่ออ่านพาธเหล่านี้และส่งไฟล์ผ่าน xmlhttp
เนื่องจาก Internet Explorer ไม่ชอบ xmlHttp มากนัก และมักจะคิดว่ามีพฤติกรรมที่เป็นอันตราย ดังนั้นจึงมักแสดงคำเตือน ดังนั้น คุณจึงไม่สามารถใช้เส้นทางเว็บในระหว่างดำเนินการได้ คุณสามารถใช้เส้นทางทางกายภาพเพื่อเข้าถึงเท่านั้น
จากนั้นเซิร์ฟเวอร์ก็มีไฟล์สำหรับรับการเข้ารหัสเหล่านี้และถอดรหัสมัน ดังนั้นฉันจึงเรียกมันว่า c/s
ปัจจุบันรหัสจำนวนมากยังคงได้รับการปรับปรุง
บทนำโดยย่อ:
-------------------------------------------------- -------------------------------------------------- ----------
aryFiles.push(c://aaa.zip);
aryFiles.push(c://bbb.exe);
นี่คือเส้นทางของไฟล์และไฟล์สามารถมีได้หลายไฟล์
ในอนาคต สามารถรับเส้นทางนี้บนไคลเอนต์ผ่านการควบคุมไฟล์ได้
http://www.xxx.com/xxx/xxx.asp
นี่คือปลายทางคุณสามารถเปลี่ยนไปยังที่อยู่ที่คุณต้องการได้
ado_stream.LoadFromFile (เซิร์ฟเวอร์ mappath (.) &/& + str_filename)
server.mappath(.) &/& + str_filename นี่คือไฟล์ที่จะอ่าน
server.mappath(.) &/& เส้นทางสอดคล้องกับเส้นทางการจัดเก็บข้อมูล
เซิร์ฟเวอร์ ado_stream.SaveToFile.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 ; value=interrupt/> <div id=ddd width=300px></div> </br> <DIV id=div_message></DIV></body></P><P><script language=VBScript>ฟังก์ชัน bytes2BSTR(vIn) strReturn = For i = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn,i) ,1)) ถ้า ThisCharCode < &H80 ดังนั้น strReturn = strReturn & Chr(ThisCharCode) อื่น NextCharCode = AscB(MidB(vIn,i+1,1)) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) i = i + 1 End If Next bytes2BSTR = strReturnEnd Function</script></P <P><script language=javascript> var xmlhttp; var ado_stream; var mFileName, mPartStart, mPartID, mPartEnd; var SendCount; var Breaked; var aryFiles;</P> BlockSize = 1024*100; // จำนวนไบต์ที่ส่งแต่ละครั้ง = false; P> P><P> // เริ่มส่งฟังก์ชันไฟล์ BeginSendFiles() { initAryFiles(); SendFile(aryFiles.pop()); } // สร้างอาร์เรย์ของไฟล์ที่จะส่งฟังก์ชัน initAryFiles() { aryFiles.push(c://aaa.zip) ; aryFiles.push(c://bbb.exe) ;//c://aaa. zip c://bbb.exe ไฟล์ในเครื่อง aryFiles.reverse() ;//ชื่อไฟล์}</P><P> ฟังก์ชั่น 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) ; mPartStart = จริง ; mPartEnd = false ; </P><P> ฟังก์ชั่น SendData() { if (SendCount > 0) { var dom = new ActiveXObject(msxml2.DOMDocument); // ส่งไฟล์ xml dom.async = false; dom.resolveExternals = false;</P><P> // สร้างส่วนหัวของไฟล์ xml โหนด = dom.createProcessingInstruction (xml, เวอร์ชัน = '1.0'); dom.appendChild (โหนด); สร้างโหนดรูท var root = dom.createElement(root); dom.appendChild(root); dom.documentElement.setAttribute(xmlns:dt, urn:schemas-microsoft-com:datatypes); // สร้างโหนด updata ที่จะบันทึก โหนดข้อมูลไบนารี = dom.createElement(upData); node.dataType = bin.base64; การเข้ารหัส base64 var att = dom.createAttribute (PartStart); // เครื่องหมายเริ่มต้นส่วน .value = mPartStart; node.setAttributeNode(att) = null; var att = dom.createAttribute(PartID); หมายเลขส่วน att.value = mPartID; node.setAttributeNode(att); var att = dom.createAttribute(PartEnd); // เครื่องหมายสิ้นสุดส่วน att.value = mPartEnd; ;</P><P> root.appendChild(โหนด) ; node.nodeTypedValue = ado_stream.Read(BlockSize); // ข้อมูลโหนดถูกอ่านจากสตรีม โหนดที่มีความยาวคงที่ = null; SendCount -= 1; xmlhttp = new ActiveXObject(Microsoft.XMLHTTP); xmlhttp.open(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) { // ตรวจสอบว่าการอัปโหลดถูกขัดจังหวะหรือไม่ if(Breaked) return ; }</P><P> ถ้า (SendCount > 0) { mPartID += 1; // div_message.innerHTML += ( + xmlhttp.ResponseText) ; var p = Math.floor((mPartID/(Math.ceil(ado_stream.size/BlockSize) + 1)) * 100) ; // คำนวณเปอร์เซ็นต์ความคืบหน้า(p) ; );, 1) ; } else { // การถ่ายโอนไฟล์เสร็จสมบูรณ์ //div_message.innerHTML += mFileName + โอนเรียบร้อยแล้ว! ;</P><P> // ส่งไฟล์ถัดไป ShowBar(0) ; var cFile = aryFiles.pop() ; SendFile(cFile) } </P><P> </P>< P > ฟังก์ชั่น ShowBar(ต่อ) { // แถบความคืบหน้า ddd.innerHTML = <table width='200' border=0 cellpadding='0' cellspacing='0' ><tr><td bgcolor='#6699FF'><input type=button style=' width: + per + % ; border:0px; background:#005599; color:#FFFFFF' value= + ต่อ + %> </td></tr ></table> ; </P><P></script></html></P><P>
ฝั่งเซิร์ฟเวอร์
</P><P><%@ LANGUAGE=VBScript%><% ตัวเลือก 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'Save file 2=adSaveCreateOverWrite ado_stream.close </P><P> 'ปล่อยทรัพยากรชุด ado_stream = ไม่มีชุด xml_dom = ไม่มีเลย' ส่งคืนข้อมูลไปยังเบราว์เซอร์ Response.Write Upload สำเร็จ!& str_filename & int_PartID & bol_PartStart%> </P><P>