การรวมบทเรียนออนไลน์หลายแบบและวิธีการที่ได้รับด้วยตัวเองในปัจจุบันเข้ากันได้กับ Google, IE11 และ IE10
ไม่มีอะไรพิเศษเกี่ยวกับเนื้อหาใน htmlbody
<div id = "dconfirm"> <p style = "float: ซ้าย; margin-left: 20px; margin-top: 20px"> <form action = "JavaScript: uploadandsubmit ();" name = "demoform" id = "demoform" method = "post" enctype = "multipart/form-data"> <p> ไฟล์อัปโหลด: <input type = "file" name = "file" id = "str_file"/> </p> <p>
อ่านไฟล์ไบนารี:
ฟังก์ชั่น uploadandsubmit () {filename = document.getElementById ("str_file") ค่า; var form = document.forms ["demoform"]; ถ้า (filename! = "") {ลอง {var obj = new activexobject ("adoDb.stream"); ใหม่ filereader (); reader.readasbinaryString (ไฟล์); // นี่คือการอ่าน asynchronous reader.onloadend = function () {// หลังจากการอ่านเสร็จสิ้นถ้า (reader.error) {console.log (reader.error);}}} {uploadandsubmit2 binaryfile (ชื่อไฟล์); // การอ่านนี้ถูกซิงโครไนซ์ uploadandsubmit2 (bf1.readall ());}}ที่นี่เราต้องตัดสินประเภทเบราว์เซอร์ หากไม่ใช่คือ IE ให้ใช้ filereader สำหรับการอ่านและถ้าเป็นเช่นนั้นให้ใช้การควบคุม ActiveX สำหรับการอ่าน มีหลุมอยู่ที่นี่ แม้ว่า IE11 และ IE10 ไม่รองรับวิธีการของ FileReader แต่ "typeof filereader" ของ IE11 และ IE10 ไม่ใช่ "ไม่ได้กำหนด" และมันยากที่จะแยกแยะเบราว์เซอร์โดยตรงโดยรองรับ FileReader หรือไม่ ควรสังเกตว่าวิธี FileReader คือการอ่านไฟล์แบบอะซิงโครนัสและ ActiveX คือการอ่านไฟล์แบบซิงโครนัส ฉันไม่เคยคิดเลยว่าเส้นทางทั้งสองนี้จะถูกห่อหุ้มด้วยวิธีเดียว ฉันสงสัยว่ามีทางออกที่ดีสำหรับคุณหรือไม่
ในหมู่พวกเขาวิธีการก่อสร้างของวัตถุไบนารีไฟล์ถูกตัดตอนมาจาก http://www.codeproject.com/articles/17825/reading-and-writing-binary-files-using-jscript?msg=3718403#xx3718403xx บล็อกเทคโนโลยี มีวิธีการปรับปรุงในการตอบกลับของบล็อก ว่ากันว่ามันมีประสิทธิภาพมากขึ้น แต่เพราะฉันไม่เข้าใจฉันจึงเลือกวิธีดั้งเดิม
วิธีดั้งเดิมมีความยาว:
// เมื่อใช้การควบคุม ADODB.stream ให้ความสนใจกับการแปลงระหว่าง ISO-8859-1 และ Windows-1252 ชุดตัวละครฟังก์ชั่น BinaryFile (ชื่อ) {var adtypebinary = 1Var Adtypetext = 2Var AdsaveAteOverWrite = 2 // codePage = '437'; this.path = name; var forward = new Array (); var backward = new Array (); // note - เพื่อประสิทธิภาพที่ดีขึ้นฉันควรทำการตรวจสอบ hex // คำจำกัดความเหล่านี้ไปยังทศนิยม - ณ จุดหนึ่ง :-) - ajtforward ['80 '] =' 00c7 '; '00E2'; ไปข้างหน้า ['84 '] =' 00E4 '; ไปข้างหน้า ['85'] = '00E0'; ไปข้างหน้า ['86 '] =' 00E5 '; ไปข้างหน้า ['87'] = '00E7'; = '00ef'; ไปข้างหน้า ['8C'] = '00E'; ไปข้างหน้า ['8D'] = '00EC'; ไปข้างหน้า ['8E'] = '00C4'; ไปข้างหน้า ['8F'] = '00C5'; ไปข้างหน้า ['90 '] =' 00C9 ' '00f4'; ไปข้างหน้า ['94 '] =' 00f6 '; ไปข้างหน้า ['95'] = '00f2'; ไปข้างหน้า ['96 '] =' 00fb '; ไปข้างหน้า ['97'] = '00f9'; = '00a2'; ไปข้างหน้า ['9c'] = '00a3'; ไปข้างหน้า ['9d'] = '00a5'; ไปข้างหน้า ['9e'] = '20a7'; ไปข้างหน้า ['9f'] = '0192' = '00fa'; ไปข้างหน้า ['a4'] = '00f1'; ไปข้างหน้า ['a5'] = '00d1'; ไปข้างหน้า ['a6'] = '00aa'; ไปข้างหน้า ['a7'] = '00ba'; '00bd'; ไปข้างหน้า ['ac'] = '00bc'; ไปข้างหน้า ['ad'] = '00a1'; ไปข้างหน้า ['ae'] = '00ab'; ไปข้างหน้า ['af'] = '00bb'; ไปข้างหน้า ['b0'] = '2591'; '2502'; ไปข้างหน้า ['b4'] = '2524'; ไปข้างหน้า ['b5'] = '2561'; ไปข้างหน้า ['b6'] = '2562'; ไปข้างหน้า ['b7'] = '2556'; '2557'; ส่งต่อ ['bc'] = '255D'; ไปข้างหน้า ['bd'] = '255C'; ไปข้างหน้า ['be'] = '255B'; ไปข้างหน้า ['bf'] = '2510'; ไปข้างหน้า ['c0'] = '2514'; '251c'; ไปข้างหน้า ['c4'] = '2,500'; ไปข้างหน้า ['c5'] = '253c'; ไปข้างหน้า ['c6'] = '255e'; ไปข้างหน้า ['c7'] = '255f'; ไปข้างหน้า ['c8'] = '255a'; '2566'; ส่งต่อ ['cc'] = '2560'; ไปข้างหน้า ['cd'] = '2550'; ไปข้างหน้า ['ce'] = '256c'; ไปข้างหน้า ['cf'] = '2567'; ไปข้างหน้า ['d0'] = '2568' '2559'; ไปข้างหน้า ['d4'] = '2558'; ไปข้างหน้า ['d5'] = '2552'; ไปข้างหน้า ['d6'] = '2553'; ไปข้างหน้า ['d7'] = '256b'; ไปข้างหน้า ['d8'] = '256a'; '2588'; ไปข้างหน้า ['dc'] = '2584'; ไปข้างหน้า ['dd'] = '258c'; ไปข้างหน้า ['de'] = '2590'; ไปข้างหน้า ['df'] = '2580'; ไปข้างหน้า ['e0'] = '03b1'; '03C0'; ส่งต่อ ['e4'] = '03a3'; ไปข้างหน้า ['e5'] = '03C3'; ไปข้างหน้า ['e6'] = '00B5'; ไปข้างหน้า ['e7'] = '03C4'; = '03b4'; ไปข้างหน้า ['ec'] = '221e'; ไปข้างหน้า ['ed'] = '03c6'; ไปข้างหน้า ['ee'] = '03b5'; ไปข้างหน้า ['ef'] = '2229'; ไปข้างหน้า ['f0'] = '2261'; '2264'; ไปข้างหน้า ['f4'] = '2320'; ไปข้างหน้า ['f5'] = '2321'; ไปข้างหน้า ['f6'] = '00f7'; ไปข้างหน้า ['f7'] = '2248'; ไปข้างหน้า ['f8'] = '00b0'; '221a'; ไปข้างหน้า ['fc'] = '207f'; ไปข้างหน้า ['fd'] = '00b2'; ไปข้างหน้า ['fe'] = '25a0'; ไปข้างหน้า ['ff'] = '00a0'; backward ['c7'] = '80'; '83'; backward ['e4'] = '84'; backward ['e0'] = '85'; backward ['e5'] = '86'; backward ['e7'] = '87'; backward ['ea'] = '88'; '8b'; backward ['ee'] = '8c'; backward ['ec'] = '8d'; backward ['c4'] = '8e'; backward ['c5'] = '8f'; backward ['c9'] = '90'; '93'; backward ['f6'] = '94'; backward ['f2'] = '95'; backward ['fb'] = '96'; backward ['f9'] = '97'; backward ['ff'] = '98'; '9b'; backward ['a3'] = '9c'; backward ['a5'] = '9d'; backward ['20a7'] = '9e'; backward ['192'] = '9f'; backward ['e1'] = 'a0'; 'a3'; backward ['f1'] = 'a4'; backward ['d1'] = 'a5'; backward ['aa'] = 'a6'; backward ['ba'] = 'a7'; backward ['bf'] = 'a8' 'ab'; backward ['bc'] = 'ac'; backward ['a1'] = 'ad'; backward ['ab'] = 'ae'; backward ['bb'] = 'af'; backward ['2591'] = 'b0'; backward ['2592'] = 'b1' 'b3'; ย้อนหลัง ['2524'] = 'b4'; ย้อนหลัง ['2561'] = 'b5'; backward ['2562'] = 'b6'; backward ['2556'] = 'b7'; backward ['' uneward '] =' B8 '; backward [' 2563 ' 'ba'; ย้อนหลัง ['2557'] = 'bb'; backward ['255D'] = 'bc'; backward ['255C'] = 'bd'; backward ['255B'] = 'bet'; backward ['2510'] = 'bf'; backward ['2514'] 'C2'; backward ['251C'] = 'C3'; backward ['2,500'] = 'C4'; backward ['253C'] = 'C5'; backward ['255E'] = 'C6'; backward ['255f'] = 'C7' = 'ca'; backward ['2566'] = 'cb'; backward ['2560'] = 'cc'; backward ['2550'] = 'cd'; backward ['256c'] = 'ce'; backward ['2567'] = 'cf'; backward ['2568'] = 'd0'; 'd2'; ย้อนหลัง ['2559'] = 'd3'; ย้อนหลัง ['2558'] = 'd4'; backward ['2552'] = 'd5'; backward ['2553'] = 'd6'; backward ['256b'] = 'd7' 'd9'; backward ['250c'] = 'da'; backward ['2588'] = 'db'; backward ['2584'] = 'dc'; backward ['258c'] = 'dd'; backward ['2590'] = 'de'; 'e1'; backward ['393'] = 'e2'; backward ['3c0'] = 'e3'; backward ['3a3'] = 'e4'; backward ['3c3'] = 'e5'; backward ['b5'] = 'e6'; = 'e9'; backward ['3a9'] = 'ea'; backward ['3b4'] = 'eb'; backward ['221e'] = 'ec'; backward ['3c6'] = 'ed'; backward ['3b5'] = 'ee'; backward ['2229' 'f1'; backward ['2265'] = 'f2'; backward ['2264'] = 'f3'; backward ['2320'] = 'f4'; backward ['2321'] = 'f5'; backward ['f7'] = 'f6'; 'f9'; backward ['b7'] = 'fa'; backward ['221a'] = 'fb'; backward ['207f'] = 'fc'; backward ['b2'] = 'fd'; backward ['25a0'] = 'fe'; ฟังก์ชั่น (d) {var h = hd.substr (d & 15,1); ในขณะที่ (d> 15) {d >> = 4; h = hd.substr (d & 15,1)+h;} return h;} this.h2d = ฟังก์ชัน (h) {return parseint (h, 16); wscript.createObject ("adodb.stream"); var binarystream = new ActivexObject ("adodb.stream"); // ระบุประเภทสตรีม - เราโกงและรับสตริง แต่ 'เหมือน' binarybinarystream.type = adtypetext; binarystream.charset = '437'; StreambinaryStream.writeText (this.forward437 (อะไร)); // เขียนสตริงลงใน diskbinarystream.savetofile (this.path, adsaveCreateOverwrite); // Clearn upbinarystream.close (); wscript.createObject ("adodb.stream") var binarystream = new ActivexObject ("adodb.stream"); // ระบุประเภทสตรีม - เราโกงและรับสตริง แต่ 'ชอบ' binarybinarystream.type = adtypetext; binarystream.charset.charset = CodePage; ObjectBinaryStream.loadFromFile (this.path); // เปิดสตรีมและรับไบนารี 'สตริง' จาก ObjectVar อะไร = binarystream.readText; // ทำความสะอาด upbinarystream.close (); return.backward437 (อะไร);}/ * แปลงหมายเลข octet tmp = ''; var i = 0; var c = 0; var l = string.length; var cc; var h; สำหรับ (; i <l; ++ i) {c ++; ถ้า (c == 128) {concarray.push (tmp); tmp = ''; c = 0;} cc = string.charcodeat (i); if (cc <128) {tmp+= string.fromcharchar รหัส (cc);} else {h = this.d2h (cc); h = forward [''+h]; tmp+= string.fromCharcode (this.h2d (h));}} ถ้า (tmp! = '') {concarray.push (tmp); ลูปนี้ progressive concatonates องค์ประกอบ // อาร์เรย์จะมีเฉพาะ onevar ar2 = new Array (); สำหรับ (; concarray.length> 1;) {var l = concarray.length; c = 0; c <l; c+= 2) {if (c+1 == l) {ar2.push (encarray [c]);} else {ar2.push ('+encarray [c]+encarray [c+1]);}} concarray = ar2; หมายเลข octet*/this.backward437 = ฟังก์ชั่น (instring) {var concarray = array ใหม่ (); var tmp = ''; var i = 0; var c = 0; var l = string.length; var cc; var; h; สำหรับ (; i <l; ++ i) {c ++; ถ้า (c == 128) {concarray.push (tmp); tmp = ''; c = 0;} cc = string.charcodeat (i); ถ้า (cc <128) {tmp+= string.fromcharc ODE (cc);} else {h = this.d2h (cc); h = backward [''+h]; tmp+= string.fromcharcode (this.h2d (h));}} ถ้า (tmp! = '') {concarray.push (tmp); ลูปนี้ progressive concatonates องค์ประกอบ // อาร์เรย์จะมีเฉพาะ onevar ar2 = new Array (); สำหรับ (; concarray.length> 1;) {var l = concarray.length; c = 0; c <l; c+= 2) {ถ้า (c+1 == l) {ar2.push (encarray [c]);} else {ar2.push ('+encarray [c]+encarray [c+1]);ส่วนหลักคือ:
this.readall = function () {// สร้างวัตถุสตรีม - ต้องการ ado 2.5 หรือ heighter // var binarystream = wscript.createObject ("adodb.stream") var binarystream = new ActivexObject ("adodb.stream"); // ระบุประเภทสตรีม codePage; // เปิด streambinarystream.open (); // โหลดข้อมูลไฟล์จากดิสก์เพื่อสตรีม ObjectBinaryStream.loadFromFile (this.path); // เปิดสตรีมและรับ 'สตริง' ไบนารีจาก ObjectVar อะไร = binarystream.readText; // ทำความสะอาด upbinarystream.close ()นี่คือวิธีการอ่านไฟล์โดยใช้การควบคุม "ADODB.Stream" คุณจะเห็นว่าประเภทการอ่านที่ผู้เขียนใช้คือ AdTypetext (2) ซึ่งกำลังอ่านไฟล์ไบนารีโดยใช้การอ่านข้อความ! หลังจากเปลี่ยนเอกสารเป็น adtypebinary (1) คุณไม่สามารถอ่านอะไรได้ฉันไม่รู้ว่าทำไม
ส่วนที่เหลือของรหัสกำลังทำการเข้ารหัสการแปลงงาน โดยทั่วไปเมื่ออ่านไฟล์คุณต้องใช้ชุดอักขระ "ISO-8859-1" และเมื่อส่งไฟล์ด้วย HTTP คุณต้องใช้ชุดอักขระ "Windows-1252" มีอักขระตัวเลขเพียงไม่กี่ตัวในชุดอักขระทั้งสองนี้ดังนั้นคุณจะพบส่วนต่าง ๆ ในข้อมูลการอ่านเพื่อแปลงเป็นชุดอักขระอื่นเป็นตัวแทนทีละตัว
Ajax ส่งกระแสไบนารี:
ฟังก์ชั่น uploadandsubmit2 (binaryContent) {url = urlhead + "cook.ashx"; xmlhttp = ใหม่ xmlhttprequest (); xmlhttp.open ("โพสต์", url + " encodeuricomponent (filename.split ("//") [filename.split ("//"). length-1])); // เช่นกระบวนการจีนอักขระภาษาจีน urlxmlhttp.sendasbinary (binarycontent); (xmlhttp.status == 200) {var str = xmlhttp.response; การแจ้งเตือน (str); xmlhttp.abort ();}}}}}สำหรับการส่งแบบไบนารีไม่มี "window.activexobject (" msxm12.xmlhttp ")" และ "window.activexobject (" microsoft.xmlhttp ")" เข้ากันได้กับเวอร์ชันเก่าของ IE ฉันสงสัยว่าคุณมีวิธีการส่งสัญญาณไบนารีใด ๆ ที่รองรับการควบคุม ActiveX ทั้งสองนี้หรือไม่
ในบทช่วยสอนบรรทัดที่หกอยู่ข้างหน้า:
XMLHTTP.OVERRIDEMIMETYPE ('text // plain; charset = x-user-defined'); //: x-user-defined บอกว่าเบราว์เซอร์ไม่แยกวิเคราะห์ข้อมูลที่ส่งคืน
หลังจากเพิ่มบรรทัดนี้เบราว์เซอร์จะไม่แยกวิเคราะห์รูปแบบการเข้ารหัสของข้อมูลที่ส่งคืนในพื้นหลัง โดยเฉพาะข้อความภาษาจีนที่กลับไปที่เบื้องหน้าจะแสดงเป็น "" หรือ "พอร์ต" ฉันเดาว่าผู้เขียนทำสิ่งนี้เพื่อรับข้อมูลไบนารีที่ส่งจากแบ็กเอนด์ในเบื้องหน้า
ในความเป็นจริงมีเพียง XMLHTTPRequest ของ Firefox เท่านั้นที่รองรับวิธีการ Sendasbinary ในการใช้งานภายใต้ IE และ Google คุณต้องเพิ่มวิธีการต้นแบบใน XMLHTTPREQUEST:
// เพิ่มฟังก์ชั่นการส่งแบบไบนารีลงในต้นแบบของ xmlhttprequest xmlhttprequest.prototype.sendasbinary = function (dataRst) {ฟังก์ชั่น bytevalue (x) {return x.charcodeat (0) & 0xff; uint8array (ords); this.send (ui8a.buffer);}ฉันไม่เข้าใจรหัสที่นี่เป็นอย่างดี บรรทัดที่หก IE8 ไม่รองรับและสายที่เจ็ด IE9 ไม่รองรับ
พื้นหลังใช้ Java Serverlet และต่อไปนี้เป็นรหัสของคลาส Java สุดท้าย:
Public String fileupload (คำขอ httpservletRequest) พ่น IOException {request.Setcharacterencoding ("UTF-8"); bufferedInputStream filein = new BufferedInputStream (request.getInputStream ()); String fn = request.getParameter ("ชื่อไฟล์"); ไบต์ [] buf = ไบต์ใหม่ [1024]; ไฟล์ไฟล์ = ไฟล์ใหม่ ("d:/" + fn); bufferedOutputStream fileout = ใหม่ bufferedOutputStream (ใหม่ fileOutputStream (ไฟล์)); ลอง {ในขณะที่ (จริง) {// อ่านข้อมูล int bytesin = filein.read (buf, 0, 1024); System.out.println (bytesin); if (bytesin == -1) {break; } else {fileout.write (buf, 0, bytesin); }} fileout.flush (); return ("บันทึกสำเร็จ");} catch (exception e) {return "บันทึกล้มเหลว, เหตุผล:"+e.toString ();} ในที่สุด {fileout.close (); -ข้างต้นเป็นวิธีการอ่านไฟล์ไบนารีใน JavaScript และส่งสตรีมไบนารีโดยใช้ AJAX ที่ฉันแนะนำให้รู้จักกับคุณ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!