الجمع بين العديد من البرامج التعليمية عبر الإنترنت والأساليب التي حصلت عليها بنفسك ، وهي متوافقة حاليًا مع Google و IE11 و IE10.
لا يوجد شيء مميز حول المحتوى في HTMLBody.
<div id = "dconfirm"> <p style = "float: left ؛ 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> <input type = "pridt"
اقرأ الملفات الثنائية:
دالة uploadandsubmit () {fileName = document.getElementById ("str_file"). value ؛ var form = document.forms ["demoform"] ؛ if (filename! = "") fileReader () ؛ reader.readasbinaryString (file) ؛ // يتم قراءة هذا غير متزامن reader.onloadend = function () {// بعد الانتهاء من القراءة ، إذا (reader.error) {console.log (reader.error) ؛ binaryfile (اسم الملف) ؛ // يتم مزامنة هذه القراءة uploadandsubmit2 (bf1.readall ()) ؛}}هنا نحتاج إلى إصدار حكم على نوع المتصفح. إذا لم يكن الأمر كذلك ، فاستخدم FileReader للقراءة ، وإذا كان الأمر كذلك ، فاستخدم التحكم ActiveX للقراءة. هناك حفرة هنا. على الرغم من أن IE11 و IE10 لا يدعمان طريقة كائن FileReader ، إلا أن "Typeof fileReader" لـ IE11 و IE10 ليس "غير محدد" ، ومن الصعب تمييز المتصفح مباشرة من خلال ما إذا كان يدعم Filereader. تجدر الإشارة أيضًا إلى أن طريقة Filereader هي قراءة الملفات بشكل غير متزامن ، و ActiveX هو قراءة الملفات بشكل متزامن. لم أحسب مطلقًا كيف يتم تغليف هذين الطريقين بطريقة واحدة. أتساءل عما إذا كان هناك حل جيد لك.
من بينها ، يتم مقتطف طريقة بناء كائن BinaryFile من http://www.codeproject.com/articles/17825/ Reading-and-writing-binary-files-using-jscript؟msg=3718403#xx3718403xx. هناك طريقة تحسين في رد المدونة. يقال إنه أكثر كفاءة ، لكن لأنني لم أفهم ذلك ، اخترت الطريقة الأصلية.
الطريقة الأصلية طويلة:
// عند استخدام التحكم ADODB.Stream ، انتبه إلى التحويل بين ISO-8859-1 و Windows-1252 SET Function BinaryFile (name) {var adtypeBinary = 1Var Adteptext = 2var adsavecreateverwrite = 2 // the the the the the the CODEPAGE = '437' ؛ this.path = name ؛ var forward = new array () ؛ var backward = new array () ؛ // note - للحصول على أداء أفضل ، يجب أن أقوم بسباق هذه التعريفات hex // إلى العشرية - في مرحلة ما :-) - ajtforward ['80 '] =' 00c7 '؛ '00e2' ؛ forward ['84 '] =' 00e4 '؛ forward ['85'] = '00e0' ؛ forward ['86 '] =' 00e5 '؛ forward ['87'] = '00e7' = '00ef' ؛ forward ['8c'] = '00ee' ؛ forward ['8d'] = '00ec' ؛ forward ['8e'] = '00c4' ؛ forward ['8f'] = '00c5' ؛ forward ['90 '] =' 00c9 '؛ "00f4 '؛ forward ['94'] = '00f6' ؛ forward ['95 '] =' 00f2 '؛ forward ['96'] = '00fb' ؛ forward ['97 '] =' 00f9 '؛ = '00a2' ؛ forward ['9c'] = '00a3' ؛ forward ['9d'] = '00a5' ؛ forward ['9e'] = '20a7' ؛ forward ['9f'] = '0192' ؛ forward ['a0'] = '00e1' ؛ = '00fa' ؛ forward ['a4'] = '00f1' ؛ forward ['a5'] = '00d1' ؛ forward ['a6'] = '00aa' ؛ forward ['a7'] = '00ba' ؛ '00bd' ؛ forward ['ac'] = '00bc' ؛ forward ['ad'] = '00a1' ؛ forward ['ae'] = '00ab' ؛ forward ['af'] = '00bb' '2502' ؛ forward ['b4'] = '2524' ؛ forward ['b5'] = '2561' ؛ forward ['b6'] = '2562' ؛ forward ['b7'] = '2556' ؛ forward ['b8'] = '2555' ؛ '2557' ؛ forward ['bc'] = '255d' ؛ forward ['bd'] = '255c' ؛ forward ['be'] = '255b' ؛ forward ['bf'] = '2510' ؛ forward ['c0'] = '2514' ؛ '251c' ؛ forward ['c4'] = '2500' ؛ forward ['c5'] = '253c' ؛ forward ['c6'] = '255e' ؛ forward ['c7'] = '255f' ؛ forward ['c8'] = '255a' '2566' ؛ forward ['cc'] = '2560' ؛ forward ['cd'] = '2550' ؛ forward ['ce'] = '256c' ؛ forward ['cf'] = '2567' ؛ forward ['d0'] = '2568' ؛ '2559' ؛ forward ['d4'] = '2558' ؛ forward ['d5'] = '2552' ؛ forward ['d6'] = '2553' ؛ forward ['d7'] = '256b' ؛ forward ['d8'] = '256a' '2588' ؛ forward ['dc'] = '2584' ؛ forward ['dd'] = '258c' ؛ forward ['de'] = '2590' ؛ forward ['df'] = '2580' ؛ forward ['e0'] = '03b1' ؛ '03c0' ؛ forward ['e4'] = '03a3' ؛ forward ['e5'] = '03c3' ؛ forward ['e6'] = '00b5' ؛ forward ['e7'] = '03C4' ؛ '03b4' ؛ forward ['ec'] = '221e' ؛ forward ['ed'] = '03c6' ؛ forward ['ee'] = '03b5' ؛ forward ['ef'] = '2229' ؛ forward ['f0'] = '2261' '2264' ؛ forward ['f4'] = '2320' ؛ forward ['f5'] = '2321' ؛ forward ['f6'] = '00f7' ؛ forward ['f7'] = '2248' ؛ forward ['f8'] = '00b0' '221a' ؛ forward ['fc'] = '207f' ؛ forward ['fd'] = '00b2' ؛ forward ['fe'] = '25a0' ؛ forward ['ff'] = '00a0' '83' ؛ للخلف ['e4'] = '84' ؛ للخلف ['e0'] = '85' ؛ للخلف ['e5'] = '86' '8b' ؛ backward ['ee'] = '8c' ؛ backward ['ec'] = '8d' ؛ backward ['c4'] = '8e' ؛ backward ['c5'] = '8f' ؛ backward ['c9'] = '90' '93' ؛ للخلف ['f6'] = '94' ؛ للخلف ['f2'] = '95' ؛ للخلف ['fb'] = '96' ؛ للخلف ['f9'] = '97' ؛ backward ['ff'] = '98' ؛ '9b' ؛ للخلف ['a3'] = '9c' ؛ للخلف ['a5'] = '9d' ؛ للخلف ['20a7'] = '9e' ؛ للخلف ['192'] = '9f' 'a3' ؛ للخلف ['f1'] = 'a4' ؛ للخلف ['d1'] = 'a5' ؛ للخلف ['aa'] = 'a6' ؛ للخلف ['ba'] = 'a7' ؛ backward ['bf'] = 'a8' 'ab' ؛ backward ['bc'] = 'ac' ؛ backward ['a1'] = 'ad' ؛ backward ['ab'] = 'ae' ؛ backward ['bb'] = 'af' ؛ backward ['2591'] = 'B0' ؛ 'b3' ؛ للخلف ['2524'] = 'b4' ؛ للخلف ['2561'] = 'b5' ؛ للخلف ['2562'] = 'b6' ؛ للخلف ['2556'] = 'b7' ؛ backward ['2555'] = 'b8' ؛ 'ba' ؛ للخلف ['2557'] = 'bb' ؛ للخلف ['255d'] = 'bc' ؛ للخلف ['255c'] = 'bd' ؛ backward ['255b'] = 'be' ؛ backward ['2510'] = 'bf' 'c2' ؛ للخلف ['251c'] = 'c3' ؛ للخلف ['2500'] = 'c4' ؛ للخلف ['253c'] = 'c5' ؛ للخلف ['255e'] = 'c6' = 'ca' ؛ للخلف ['2566'] = 'cb' ؛ للخلف ['2560'] = 'cc' ؛ للخلف ['2550'] = 'cd' ؛ backward ['256c'] = 'ce' ؛ backward ['2567'] = 'cf' 'd2' ؛ للخلف ['2559'] = 'd3' ؛ للخلف ['2558'] = 'd4' ؛ للخلف ['2552'] = 'd5' ؛ backward ['2553'] = 'd6' ؛ backward ['256b'] = 'd7' ؛ 'd9' ؛ للخلف ['250c'] = 'da' ؛ للخلف ['2588'] = 'db' ؛ للخلف ['2584'] = 'dc' ؛ backward ['258c'] = 'dd' 'e1' ؛ للخلف ['393'] = 'e2' ؛ للخلف ['3c0'] = 'e3' ؛ للخلف ['3a3'] = 'e4' ؛ backward ['3c3'] = 'e5' ؛ backward ['b5'] = 'e6' = 'e9' ؛ للخلف ['3a9'] = 'ea' ؛ للخلف ['3b4'] = 'eb' ؛ للخلف ['221e'] = 'ec' ؛ backward ['3c6'] = 'ed' 'f1' ؛ للخلف ['2265'] = 'f2' ؛ للخلف ['2264'] = 'f3' ؛ للخلف ['2320'] = 'f4' 'f9' ؛ للخلف ['b7'] = 'fa' ؛ للخلف ['221a'] = 'fb' ؛ للخلف ['207f'] = 'fc' ؛ backward ['b2'] = 'fd' ؛ backward ['25a0'] = 'fe' function (d) {var h = hd.substr (d & 15،1) ؛ بينما (d> 15) {d >> = 4 ؛ h = hd.substr (d & 15،1)+h ؛} return h ؛} this.h2d = function (h) {return parseint (h ، 16) ؛ wscript.createBject ("adodb.stream") ؛ var binarystream = new ActiveXObject ("adodb.stream") ؛ // حدد نوع الدفق - نحن نغش ونحصل StreambinaryStream.WritetEtext (this.forward437 (ماذا)) wscript.createObject ("adodb.stream") var binarystream = new ActiveXObject ("adodb.stream") ؛ // حدد نوع الدفق - نحن غش ونحصل ObjectBinaryStream.LoadFromFile (this.path) ؛ // افتح الدفق واحصل على "سلسلة" ثنائية من الكائن What = BinaryStream.ReadText ؛ // Clean UpbinaryStream.Close () ؛ إرجاع this.backward437 (ماذا) ؛ Array () ؛ var tmp = '' '؛ var i = 0 ؛ var c = 0 ؛ var l = instring.length ؛ var cc ؛ var h ؛ for (؛ i <l ؛ ++ i) {c ++ ؛ if (c == 128) {encarray.push (tmp) ؛ tmp = '' ؛ c = 0 ؛} cc = instring.charcodeat (i) ؛ if (cc <128) {tmp+= string.fromchar الكود (cc) ؛} آخر {h = this.d2h (cc) ؛ h = forward [''+h] ؛ هذه الحلقة التقدمية تتجسس عناصر الصفيف // entil هناك فقط Onevar AR2 = جديد Array () ؛ لـ (؛ encarray.length> 1 ؛) {var l = encarray.length ؛ for (var c = 0 ؛ c <l ؛ c+= 2) {if (c+1 == l) {ar2.push (encarray [c]) ؛} آخر {ar2.push (''+encarray [c]+encarray [c+1]) ؛ الرقم*/this.backward437 = function (instring) {var encarray = new array () ؛ var tmp = '' ؛ var i = 0 ؛ var c = 0 ؛ var l = instring.length ؛ var cc ؛ var ؛ var H ؛ for (؛ i <l ؛ ++ i) {c ++ ؛ if (c == 128) {encarray.push (tmp) ؛ tmp = '' ؛ c = 0 ؛} cc = instring.charcodeat (i) ؛ if (cc <128) {tmp+= string.fromcharc Ode (cc) ؛} else {h = this.d2h (cc) ؛ h = backward [''+h] ؛ هذه الحلقة التقدمية تتجسس عناصر الصفيف // entil هناك فقط Onevar AR2 = جديد Array () ؛ لـ (؛ encarray.length> 1 ؛) {var l = encarray.length ؛ for (var c = 0 ؛ c <l ؛ c+= 2) {if (c+1 == l) {ar2.push (encarray [c]) ؛} else {ar2.push ('' '+encarray [c]+encarray [c+1]) ؛}} encarray = ar2 ؛ ar2 = new array () ؛الجزء الرئيسي هو:
this.readall = function () {// إنشاء كائن دفق - يحتاج إلى ado 2.5 أو hefter // var binarystream = wscript.createBject ("adodb.stream") var binarystream = new ActivexObject ("adodb.stream") ؛ codepage ؛ // افتح streambinarystream.open () ؛ // تحميل بيانات الملف من القرص لدفق ObjectBinaryStream.LoadFromfile (this.path) ؛فيما يلي طريقة قراءة الملفات باستخدام عنصر تحكم "adodb.stream". يمكنك أن ترى أن نوع القراءة المستخدمة من قبل المؤلف هو adtepetext (2) ، والذي يقرأ الملفات الثنائية باستخدام قراءة النص! بعد تغيير المستند إلى AdTypeBinary (1) ، لا يمكنك قراءة أي شيء ، لا أعرف السبب.
يقوم بقية الكود بعمل تشفير أعمال التحويل. بشكل عام ، عند قراءة الملفات ، تحتاج إلى استخدام مجموعة الأحرف "ISO-8859-1" ، وعند إرسال الملفات باستخدام HTTP ، تحتاج إلى استخدام مجموعة الأحرف "Windows-1252". لا يوجد سوى عدد قليل من الأحرف الرقمية في هاتين الشخصين ، لذلك يمكنك العثور على الأجزاء المختلفة في بيانات القراءة لتحويلها إلى تمثيل مجموعة حرف أخرى واحدة تلو الأخرى.
Ajax يرسل دفقًا ثنائيًا:
وظيفة uploadandsubmit2 (BinaryContent) {url = urlhead + "cook.ashx" ؛ xmlhttp = new xmlhttprequest () ؛ EncodeUricomponent (filename.split ("//") [filename.split ("//"). الطول -1])) (xmlhttp.status == 200) {var str = xmlhttp.response ؛ Alert (str) ؛بالنسبة للإرسال الثنائي ، لا يوجد "window.activexobject (" msxm12.xmlhttp ")" و "window.activexobject (" microsoft.xmlhttp ")" متوافق مع الإصدار القديم من IE. أتساءل عما إذا كان لديك أي طرق نقل ثنائية تدعم هذين عناصر التحكم ActiveX.
في البرنامج التعليمي ، السطر السادس أمامه:
xmlhttp.overridemimetype ('text // plain ؛ charset = x-user-defined') ؛
بعد إضافة هذا الخط ، لن يحلل المتصفح تنسيق الترميز للبيانات التي يتم إرجاعها في الخلفية. على وجه التحديد ، يتم عرض النص الصيني الذي تم إرجاعه إلى المقدمة على أنه "" أو "منفذ". أعتقد أن المؤلف يقوم بذلك لتلقي بيانات ثنائية تنتقل من الواجهة الخلفية في المقدمة.
في الواقع ، يدعم XMLHTTPRequest من Firefox فقط الطريقة المرسلة. من أجل استخدامه تحت IE و Google ، تحتاج إلى إضافة طريقة نموذجية إلى XMLHTTPREQUEST:
// إضافة وظيفة إرسال ثنائية إلى النموذج الأولي لـ XMLHTTPREQUEST XMLHTTPREQUEST.PROTOTY.SENDASBINALINAT = دالة (datast) {function bytevalue (x) {return x.charcodeat (0) & 0xff ؛ uint8array (ords) ؛ this.send (ui8a.buffer) ؛}لا أفهم الرمز هنا جيدًا. السطر السادس IE8 لا يدعمه والخط السابع IE9 لا يدعمه.
تستخدم الخلفية Java Serverlet ، والما يلي هو رمز فئة Java النهائية:
السلسلة العامة FileUpload (طلب httpservletrequest) يلقي ioException {request.setcharacterencoding ("utf-8") ؛ bufferedInputStream filein = new BufferedInputStream (request.getInputStream ()) ؛ String fn = request.getParameter ("filename") ؛ Byte [] buf = new byte [1024] ؛ ملف الملف = ملف جديد ("d:/" + fn) ؛ bufferedOutputStream FileOut = جديد bufferedoutputStream (FileOutputStream جديد (ملف)) ؛ حاول {بينما (صحيح) {// قراءة البيانات int bytesin = filein.read (buf ، 0 ، 1024) ؛ system.out.println (bytesin) ؛ if (bytesin == -1) {break ؛ } آخر {fileout.write (buf ، 0 ، bytesin) ؛ }} fileout.flush () ؛ Return ("Save Success") ؛} catch (استثناء e) {return "Save Fails ، nupion:"+e.toString () ؛} أخيرًا {fileout.close () ؛ }}ما سبق هو طريقة قراءة الملفات الثنائية في JavaScript ونقل التدفقات الثنائية باستخدام Ajax التي قدمتها لك. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!