Комбинируя несколько онлайн -учебников и методов, полученных на вас, в настоящее время совместим с 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 = "multiply/form-data"> <p> Файл загрузки: <input type = "file" name = "file" id = "str_file"/> </p> <p> <input = "Отправить" value = "upload"/> </p> </p> <p> </d div>
Прочитайте двоичные файлы:
function uploadandsubmit () {filename = document.getElementById ("str_file"). Value; var form = document.forms ["demoform"]; if (filename! FileReader (); reader.readasBinaryString (file); // Это считывается asynchronous reader.onloadend = function () {// после завершения чтения, if (reader.error) {console.log (reader.error);} else {uploadandSubmit2 (reader.Result); BinaryFile (filename); // Это чтение синхронизировано uploadandSubmit2 (bf1.readall ());}}Здесь нам нужно вынести суждение о типе браузера. Если это не IE, используйте FiLEREADER для чтения, и если это IE, используйте управление ActiveX для чтения. Здесь есть яма. Хотя IE11 и IE10 не поддерживают метод объекта FileReader, «TypeOf FileReader» IE11 и IE10 не является «неопределенным», и трудно напрямую отличить браузер тем, поддерживает ли он FileReader. Следует также отметить, что метод FileReader состоит в том, чтобы считывать файлы асинхронно, а ActiveX - синхронно читать файлы. Я никогда не понял, как эти два маршрута инкапсулируются в одном методе. Интересно, есть ли для вас хорошее решение.
Среди них метод строительства объекта BinaryFile выхищен с http://www.codeproject.com/articles/17825/reading-andwriting-binary-files-using-jscript?msg=3718403#xx3718403xx технологический блог. В ответе блога есть метод улучшения. Говорят, что это более эффективно, но, поскольку я этого не понял, я выбрал оригинальный метод.
Первоначальный метод длинный:
// При использовании элемента управления ADODB.STREAM обратите внимание на преобразование между ISO-8859-1 и Windows-1252 Функция набора символов BinaryFile (name) {var adtypebinary = 1var adtypetext = 2var adsaveCreecreeTeverWrite = 2 // Трюк-это старомодные. CodePage = '437'; this.path = name; var forward = new Array (); var Backward = new Array (); // Примечание - для лучшей производительности я должен предварительно представить эти определения шестнадцатеричного // в десятичный - в какой -то момент :-) - ajtforward ['80 '] =' 00c7 '; вперед ['81'] = '00fc'; '00e2'; forward ['84 '] =' 00e4 '; forward ['85'] = '00e0'; вперед ['86 '] =' 00e5 '; вперед ['87'] = '00e7'; вперед [''88'] = '00ea'; ''89'] = '00eb'; = '00ef'; forward ['8c'] = '00ee'; forward ['8d'] = '00ec'; forward ['8e'] = '00c4'; forward ['8f'] = '00c5'; вперед ['90 '] =' 00c9 ';' '91 '] =' 00e6 '; '00f4'; forward ['94 '] =' 00f6 '; forward ['95'] = '00f2'; forward ['96 '] =' 00fb '; forward ['97'] = '00f9'; вперед ['98 '] =' 00ff ';' 99 '] =' 00d6 '; = '00a2'; forward ['9c'] = '00a3'; forward ['9d'] = '00a5'; forward ['9e'] = '20a7'; вперед ['9f'] = '0192'; вперед ['a0'] = '00e1'; = '00fa'; forward ['a4'] = '00f1'; forward ['a5'] = '00d1'; forward ['a6'] = '00aa'; вперед ['a7'] = '00ba'; forward ['a8'] = '00bf'; '' a9 '] =' 2310 '; '00bd'; forward ['ac'] = '00bc'; forward ['ad'] = '00a1'; forward ['ae'] = '00ab'; forward ['af'] = '00bb'; вперед ['b0'] = '2591'; вперед ['b1'] = '2592'; '2502'; вперед ['b4'] = '2524'; forward ['b5'] = '2561'; forward ['b6'] = '2562'; вперед ['b7'] = '2556'; вперед ['b8'] = '2555'; вперед ['b9'] = '2563'; '2557'; вперед ['bc'] = '255d'; forward ['bd'] = '255c'; forward ['be'] = '255b'; forward ['bf'] = '2510'; вперед ['c0'] = '2514'; вперед ['c1'] = '2534'; '251c'; forward ['c4'] = '2500'; forward ['c5'] = '253c'; forward ['c6'] = '255e'; forward ['c7'] = '255f'; forward ['c8'] = '255a'; вперед ['c9'] = '2554'; '2566'; вперед ['cc'] = '2560'; forward ['cd'] = '2550'; forward ['ce'] = '256c'; forward ['cf'] = '2567'; forward ['d0'] = '2568'; вперед ['d1'] = '2564'; '2559'; вперед ['d4'] = '2558'; forward ['d5'] = '2552'; вперед ['d6'] = '2553'; вперед ['d7'] = '256b'; forward ['d8'] = '256a'; вперед ['d9'] = '2518'; '2588'; вперед ['dc'] = '2584'; forward ['dd'] = '258c'; forward ['de'] = '2590'; forward ['df'] = '2580'; forward ['e0'] = '03b1'; вперед ['e1'] = '00df'; '03c0'; вперед ['e4'] = '03a3'; forward ['e5'] = '03c3'; forward ['e6'] = '00b5'; forward ['e7'] = '03c4'; вперед ['e8'] = '03a6'; e9 '] =' 0398 '; '03b4'; forward ['ec'] = '221e'; forward ['ed'] = '03c6'; forward ['ee'] = '03b5'; вперед ['ef'] = '2229'; forward ['f0'] = '2261'; вперед ['f1'] = '00b1'; '2264'; вперед ['f4'] = '2320'; forward ['f5'] = '2321'; forward ['f6'] = '00f7'; forward ['f7'] = '2248'; вперед ['f8'] = '00b0'; forward ['f9'] = '2219'; '221a'; forward ['fc'] = '207f'; forward ['fd'] = '00b2'; forward ['fe'] = '25a0'; вперед ['ff'] = '00a0'; назад ['c7'] = '80'; назад ['fc'] = '81';; e9 '] =' 80 '; назад [' fc '] =' 81 '; '83'; Backward ['e4'] = '84'; назад ['e0'] = '85'; назад ['e5'] = '86'; назад ['e7'] = '87'; назад ['ea'] = '88'; обратно ['e7'] = '89';; e8 '] =' 88 '; '8b'; Backward ['ee'] = '8c';; Backward ['ec'] = '8d'; Backward ['c4'] = '8e'; назад ['c5'] = '8f'; Backward ['c9'] = '90'; назад ['e6'] = '91';; 'c6'] = '90'; '93'; Backward ['f6'] = '94'; Backward ['f2'] = '95'; Backward ['fb'] = '96'; Backward ['f9'] = '97'; Backward ['ff'] = '98'; назад ['d6'] = '99';; 'dc'] = '98'; '9b'; Backward ['a3'] = '9c'; Backward ['a5'] = '9d'; Backward ['20a7'] = '9e'; Backward ['192'] = '9f'; Backward ['e1'] = 'a0'; назад ['ed'] = 'a1';; '' f3 '] ='] = '' '] =' '] ='] = '] ='] = ''] = ''] = ''] = ''] = ''] = ''] = '] =' ''] = '] ='] = ''] = '] =' '] ='] = '] =' '] =' '] =' a1 '; 'A3'; назад ['f1'] = 'a4'; назад ['d1'] = 'a5'; назад ['aa'] = 'a6'; назад ['ba'] = 'a7'; назад ['bf'] = 'a8'; назад ['2310'] = 'a9';; '' ac '] =' aa '; aa'; bd '] ='] = '] ='] = '] ='] = '] ='] = '] ='] = '] ='] = '] ='] = '] ='] = '] ='] = '] 'Ab'; назад ['bc'] = 'ac'; назад ['a1'] = 'ad'; Backward ['ab'] = 'ae'; Backward ['bb'] = 'af'; назад ['2591'] = 'b0'; назад ['2592'] = 'b1'; 'B3'; назад ['2524'] = 'b4'; назад ['2561'] = 'b5'; назад ['2562'] = 'b6'; назад ['2556'] = 'b7'; назад ['2555'] = 'b8'; назад [2563 '] =' b9 '; 'Ba'; Backward ['2557'] = 'Bb'; Backward ['255d'] = 'Bc'; Backward ['255c'] = 'Bd'; Backward ['255b'] = 'be'; Backward ['2510'] = 'bf'; назад ['2514'] = 'c0'; 'C2'; Backward ['251c'] = 'c3'; Backward ['2500'] = 'c4'; назад ['253c'] = 'c5'; назад ['255e'] = 'c6'; назад ['255f'] = 'c7'; назад [255a '] =' c8 '; = 'CA'; Backward ['2566'] = 'cb';; Backward ['2560'] = 'CC'; Backward ['2550'] = 'CD'; Backward ['256c'] = 'CE'; Backward ['2567'] = 'cf'; назад ['2568'] = 'd0'; 'D2'; назад ['2559'] = 'd3'; назад ['2558'] = 'd4'; назад ['2552'] = 'd5'; назад ['2553'] = 'd6'; назад ['256b'] = 'd7'; назад [256a '] =' d8 '; 'D9'; Backward ['250c'] = 'da'; Backward ['2588'] = 'db'; Backward ['2584'] = 'dc'; назад ['258c'] = 'dd'; назад ['2590'] = 'de'; назад [2580 '] =' df '; 'E1'; Backward ['393'] = 'e2'; Backward ['3c0'] = 'e3'; Backward ['3a3'] = 'e4'; назад ['3c3'] = 'e5'; назад ['b5'] = 'e6'; назад [3c4 '] =' e7 '; = 'E9'; назад ['3a9'] = 'ea'; назад ['3b4'] = 'eb'; назад ['221e'] = 'ec'; назад ['3c6'] = 'ed'; назад ['3b5'] = 'ee'; назад ['2229'] = 'ef'; '' 2261 '] ='] = '' '] =' ''] = ''] = '' '] =' '] =' '] =' '] =' '] =' '] =' '] =' '] =' '] =' '] =' '] =' '] =' '] =' '] = 'F1'; назад ['2265'] = 'f2'; назад ['2264'] = 'f3'; назад ['' 2320 '] =' f4 '; назад [' '2321'] = 'f5'; назад ['f7'] = 'f6'; назад [2248 '] =' f7 '; 'F9'; Backward ['b7'] = 'fa'; назад ['221a'] = 'fb'; назад ['207f'] = 'fc'; назад ['b2'] = 'fd'; назад ['25a0'] = 'fe'; назад ['a0'] = 'ff'; var hd = "0123577777799999999. function (d) {var h = hd.substr (d & 15,1); while (d> 15) {d >> = 4; h = hd.substr (d & 15,1)+h;} return h;} this.h2d = function (h) {return parseint (h, 16);} this.writeall = funct Wscript.createObject ("adodb.stream"); var binarySteam = new ActivexObject ("adodb.stream"); // Указание типа потока - мы обманываем и получаем строку, но, как 'binarybinarstream.type = adtypetext; BinaryStream.Charset =' 437 ';//Open Open The StreambinaryStream. StreamBinaryStream.WriteText (this.Forward437 (что)); // Напишите строку на дисквалифицированную stream.savetoFile (this.path, adsaveCreateoverWrite); // clearn upbinarystream.close ();} this.Readall = function () {// Создать объект. Wscript.createObject ("adodb.stream") var binarySteam = new ActiveXObject ("adoDB.Stream"); // Указание типа потока - мы обманываем и получаем строку, но 'как' binaryBinaryStream.Type = adtypetext; BinaryStream.Charset = CodePAGE; // Откройте streambinar ObjectBinaryStream.LoadFromFile (this.Path); // открыть поток и получить бинарную «строку» из объекта, что = binarySteam.readtext; // Очистить upbinarystream.close (); вернуть это. Backward437 (что);}/ * Конвертировать октябрь на кодовую страницу 437. Array (); var tmp = ''; var i = 0; var c = 0; var l = invign.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.fromchar Code (cc);} else {h = this.d2h (cc); h = worth [''+h]; tmp+= string.fromCharcode (this.h2d (h));}} if (tmp! = '') {Encarray.push (tmp);} // Этот цикл прогрессивного объединяет элементы массива // entil, существует только Onevar ar2 = new Array (); for (; eCarray.length> 1;) {var l = ecrarray.length; for (var c = 0; c <l; c+= 2) {if (c+1 == l) {ar2.push (encarray [c]);} else {ar2.push (''+ecrray [c]+encarray [c+1]);}} ecrarray = ar2; ar2 = new array ()} return eCrary [0]; номер*/this.backward437 = function (instring) {var egarray = new Array (); var tmp = ''; var i = 0; var c = 0; var l = instring.length; var cc; var; var; var; var; var; var; var; var; 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 = обратно [''+h]; tmp+= string.fromCharcode (this.h2d (h));}} if (tmp! = '') {encarray.push (tmp);} // Этот цикл прогрессивного объединяет элементы массива // entil, существует только Onevar ar2 = new Array (); for (; eCarray.length> 1;) {var l = ecrarray.length; for (var c = 0; c <l; c+= 2) {if (c+1 == l) {ar2.push (ecraray [c]);} else {ar2.push (''+egray [c]+ecraray [c+1]);}} ecrarray = ar2;Основная часть:
this.Readall = function () {// Создать объект потока - нуждается в ADO 2.5 или HEIGHT // var binarySteam = wscript.createObject ("adodb.stream") var binarySteam = new ActiveXObject ("AdoDB.Stream"); // Укажите тип потока - мы обманываем и получаем string, но 'bearinarybineM.team. CodePage; // Открыть streambinaryStream.open (); // Загрузить данные файла с диска для потоковой передачи objectbinarystream.loadfromfile (this.path); // Откройте поток и получить бинарную строку из объекта, что = BinaryStream.ReadText; // Очистить upbinaryStream.close (); вернуть это. Backward437 (что);Вот метод чтения файлов с использованием элемента управления «AdoDB.Stream». Вы можете видеть, что тип чтения, используемый автором, является AdtyPetext (2), который читает двоичные файлы с использованием чтения текста! После изменения документа на adtypebinary (1) вы не можете ничего читать, я не знаю почему.
Остальная часть кода выполняет работу по конверсии кодирования. Вообще говоря, при чтении файлов вам необходимо использовать набор символов «ISO-8859-1», а при отправке файлов с HTTP вам необходимо использовать набор символов «Windows-1252». В этих двух наборах символов есть только несколько числовых символов, поэтому вы обнаружите различные части в данных чтения, чтобы преобразовать их в другое представление наборов символов один за другим.
Ajax отправляет двоичный поток:
Функция uploadandSubmit2 (binaryContent) {url = urlhead + "cook.ashx"; xmlhttp = new xmlhttprequest (); xmlhttp.open ("post", url + "? Encodeuricomponent (fileName.split ("//") [filename.split ("//"). Length-1])); // IE процесса китайских символов urlxmlhttp.sendasbinary (binaryContent); xmlhttp.onstatechange = function () {if (xmlhttp.learedtate == 4). (xmlhttp.status == 200) {var str = xmlhttp.response; alert (str); xmlhttp.abort ();}}}}}Для двоичной передачи нет «window.activexObject (" msxm12.xmlhttp ")" и "windo.activexobject (" microsoft.xmlhttp ")" совместимо со старой версией IE. Интересно, есть ли у вас какие -либо бинарные методы передачи, которые поддерживают эти два элемента управления ActiveX.
В учебном пособии перед ним находится шестая линия:
xmlhttp.overridemimeType ('text // plain; charset = x-user-deficen
После добавления этой строки браузер не проанализирует формат кодирования данных, возвращаемых в фоновом режиме. В частности, китайский текст, возвращенный на передний план, отображается как «" или "порт". Я предполагаю, что автор делает это для получения двоичных данных, передаваемых из бэкэнда на переднем плане.
Фактически, только XMLHTTPRequest Firefox поддерживает метод SendasBinary. Чтобы использовать его в соответствии с IE и Google, вам нужно добавить метод прототипа в Xmlhttprequest:
// Добавить функцию двоичной отправки в прототип Xmlhttprequest xmlhttprequest.prototype.sendasbinard = function (datastr) {function bytevalue (x) {return x.charcodeat (0) & 0xff;} vards = ray.prototype.map.call (0). Uint8array (ords); this.send (ui8a.buffer);}Я не очень хорошо понимаю код. Шестая линия IE8 не поддерживает его, и седьмая линия IE9 не поддерживает ее.
На фоне используется Java Serverlet, и ниже приведен код окончательного класса Java:
public String fileUpload (httpservletRequest) Throws ioException {request.setcharacterencoding ("utf-8"); bufferedinptream filein = new BufferedInputStream (request.getInputStream ()); String fn = request.getParameter ("filename"); byte [] buf = new Byte [1024]; File file = new File ("d:/" + fn); BufferedOutputStream fileout = new BufferedOutputStream (New FileOutputStream (File)); try {while (true) {// прочитать данные 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!