Combinando múltiples tutoriales en línea y los métodos obtenidos por usted mismo, actualmente es compatible con Google, IE11 e IE10.
No hay nada especial en el contenido en el cuerpo html.
<div id = "dconfirm"> <p style = "float: izquierda; margen-izquierda: 20px; margin-top: 20px"> <form de acción = "javascript: uploadAndSubmit ();" name = "DemoForm" id = "DemoForm" Method = "Post" Enctype = "Multipart/Form-Data"> <p> Carlo de carga: <input type = "file" name = "file" id = "str_file"/> </p> <p> <input type = "presentar" valor = "cargar"/> </p> </form> </p> </iv>
Leer archivos binarios:
function uploadAndSubMit () {filename = document.getElementById ("str_file"). valor; var formar = document.forms ["DemoForm"]; if (FileName! = "") {try {var obj = new ActiveXObject ("ADODB.STREAM"); // Esto debe ser IE} Catch (E) new FileReader (); Reader.ReadAsBinaryString (archivo); // Esto se lee Asynchronous lector.onloadend = function () {// Después de que se termine la lectura, if (lector.error) {console.log (lector.error);} else {ifoteandsubMit2 (lector.reser);}} VAR;} VAR VAR;} VAR BF11 Binaryfile (nombre de archivo); // Esta lectura se sincroniza uploadandsubmit2 (bf1.readall ());}}Aquí necesitamos hacer un juicio sobre el tipo de navegador. Si no es, es decir, use FileReader para leer, y si es, es decir, use el control ActiveX para leer. Hay un pozo aquí. Aunque IE11 e IE10 no admiten el método del objeto Filereader, el "tipo de archivo FileReader" de IE11 e IE10 no está "indefinido", y es difícil distinguir el navegador directamente por si es compatible con FileReader. También se debe tener en cuenta que el método FileReader es leer archivos de manera asincrónica, y ActiveX debe leer archivos sincrónicamente. Nunca he descubierto cómo estas dos rutas están encapsuladas en un método. Me pregunto si hay una buena solución para ti.
Entre ellos, el método de construcción del objeto BinaryFile se extrae de http://www.codeproject.com/articles/17825/reading-and-writing-binary-files-seing-jscript?msg=3718403#xx3718403xx Blog de tecnología. Hay un método de mejora en la respuesta del blog. Se dice que es más eficiente, pero como no lo entendí, elegí el método original.
El método original es largo:
// Al usar el control ADODB.Stream, preste atención a la conversión entre ISO-8859-1 y Windows-1252 Función de conjunto de caracteres BinaryFile (name) {var adTypeBinary = 1Var adtypetext = 2Var adsaveCreateeReAverwrite = 2 // el truco: esta es la página de 'antigüedad' no rake codePage = '437'; this.path = name; var flowar = new Array (); var Backward = new Array (); // nota - Para un mejor rendimiento, debo preconvertir estas definiciones hex // a decimal - en algún momento :-) - ajtforward ['80 '] =' 00c7 '; hacia adelante ['81'] = '00fc'; hacia adelante ['82 '] =' 00e9 '; '00e2'; hacia adelante ['84 '] =' 00e4 '; avance ['85'] = '00e0'; avance ['86 '] =' 00e5 '; avance ['87'] = '00e7'; avance ['88 '] =' 00ea '; hacia adelante ['89'] = '00eb'; hacia adelante ['8a'] = '00e8'; = '00Ef'; avance ['8c'] = '00ee'; avance ['8d'] = '00EC'; avance ['8e'] = '00c4'; avance ['8f'] = '00c5'; avance ['90 '] =' 00c9 '; avance ['91'] = '00e6'; hacia adelante ['92 '] =' 00c6 '; '00f4'; hacia adelante ['94 '] =' 00f6 '; hacia adelante ['95'] = '00f2'; hacia adelante ['96 '] =' 00fb '; avance ['97'] = '00f9'; avance ['98 '] =' 00ff '; hacia adelante ['99'] = '00d6'; hacia adelante ['9a'] = '00dc'; = '00a2'; avance ['9c'] = '00a3'; avance ['9d'] = '00a5'; avance ['9e'] = '20a7'; avance ['9f'] = '0192'; avance ['a0'] = '00e1'; hacia adelante ['a1'] = '00ed'; hacia adelante ['a2'] = '00f3'; = '00fa'; hacia adelante ['a4'] = '00f1'; hacia adelante ['a5'] = '00d1'; hacia adelante ['a6'] = '00aa'; hacia adelante ['a7'] = '00Ba'; adelante ['a8'] = '00bf'; adelante ['a9'] = '2310'; hacia adelante ['aa'] 00ac '; '00bd'; avance ['ac'] = '00bc'; hacia adelante ['ad'] = '00a1'; avance ['ae'] = '00ab'; avance ['af'] = '00bb'; avance ['b0'] = '2591'; hacia adelante ['b1'] = '2592'; hacia adelante ['b2'] = '2593'; '2502'; hacia adelante ['b4'] = '2524'; hacia adelante ['b5'] = '2561'; hacia adelante ['b6'] = '2562'; avance ['b7'] = '2556'; avance ['b8'] = '2555'; avance ['b9'] = '2563'; hacia adelante ['BA'] = '2551'; '2557'; hacia adelante ['bc'] = '255d'; avance ['bd'] = '255c'; avance ['be'] = '255b'; avance ['bf'] = '2510'; avance ['c0'] = '2514'; avance ['c1'] = '2534'; avance ['c2'] = '252c'; '251c'; hacia adelante ['c4'] = '2500'; avance ['c5'] = '253c'; avance ['c6'] = '255e'; avance ['c7'] = '255f'; avance ['c8'] = '255a'; hacia adelante ['c9'] = '2554'; avance ['ca'] = '2569'; '2566'; hacia adelante ['cc'] = '2560'; avance ['cd'] = '2550'; avance ['ce'] = '256c'; avance ['cf'] = '2567'; avance ['d0'] = '2568'; avance ['d1'] = '2564'; avance ['d2'] = '2565'; hacia adelante ['d3'] '2559'; hacia adelante ['d4'] = '2558'; avance ['d5'] = '2552'; avance ['d6'] = '2553'; avance ['d7'] = '256b'; avance ['d8'] = '256a'; avance ['d9'] = '2518'; hacia adelante ['da'] = '250c'; '2588'; hacia adelante ['dc'] = '2584'; hacia adelante ['dd'] = '258c'; hacia adelante ['de' de '] =' 2590 '; avance [' df '] =' 2580 '; adelante [' e0 '] =' 03b1 '; hacia adelante [' e1 '] =' 00df '; hacia adelante [' e2 '] =' 0393 '; '03C0'; hacia adelante ['e4'] = '03a3'; avance ['e5'] = '03c3'; avance ['e6'] = '00b5'; avance ['e7'] = '03c4'; avance ['e8'] = '03a6'; hacia adelante ['e9'] = '0398'; hacia adelante ['ea'] = '' 03a9 '; '03b4'; avance ['ec'] = '221e'; avance ['ed'] = '03c6'; avance ['ee'] = '03b5'; avance ['ef'] = '2229'; avance ['f0'] = '2261'; hacia adelante ['f1'] = '00b1'; hacia adelante ['f2'] = '2265'; '2264'; hacia adelante ['f4'] = '2320'; hacia adelante ['f5'] = '2321'; hacia adelante ['f6'] = '00f7'; avance ['f7'] = '2248'; avance ['f8'] = '00b0'; hacia adelante ['f9'] = '2219'; hacia adelante ['fa'] = '00B7'; '221a'; hacia adelante ['fc'] = '207f'; hacia adelante ['fd'] = '00b2'; hacia adelante ['fe'] = '25a0'; hacia adelante ['ff'] = '00a0'; backward ['c7'] = '80' 80 '; backward [' fc '] =' 81 '; atrasado [' e9 '] =' 82 '; '83'; Backward ['e4'] = '84'; Backward ['e0'] = '85'; Backward ['e5'] = '86'; Backward ['e7'] = '87'; Backward ['ea'] = '88' 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'; Backward ['D6'] = '99'; Backward ['DC'] = '9a'; '9b'; Backward ['a3'] = '9c'; Backward ['a5'] = '9d'; Backward ['20a7'] = '9e'; Backward ['192'] = '9f'; Backward ['e1'] = 'A0'; Backward ['ed'] = 'A1'; Backward ['F3'] = 'A2'; '' A3 '; hacia atrás [' f1 '] =' a4 '; hacia atrás [' d1 '] =' a5 '; Backward [' aa '] =' a6 '; 'Ab'; Backward ['BC'] = 'AC'; Backward ['a1'] = 'ad'; Backward ['AB'] = 'Ae'; Backward ['Bb'] = 'AF'; Backward [2591 '] =' B0 '; Backward [' 2592 '] =' B1 '; Backward [' 2593 '] =' B2 '; 'B3'; Backward ['2524'] = 'B4'; Backward ['2561'] = 'B5'; Backward ['2562'] = 'B6'; Backward ['2556'] = 'B7'; Backward [2555 '] =' B8 '; Avance [' 2563 '] =' b9 '; Backward [' 2551 '] = = = 'Ba'; Backward ['2557'] = 'Bb'; Backward ['255d'] = 'BC'; Backward ['255C'] = 'Bd'; Backward ['255b'] = 'Be'; Backward [2510 '] =' Bf '; Backward [' 2514 '] =' C0 '; Backward [' 2534 '] =' C1 'c1'; 'C2'; Backward ['251c'] = 'C3'; Backward ['2500'] = 'C4'; Backward ['253C'] = 'C5'; Backward ['255e'] = 'C6'; Backward ['255f'] = 'C7'; Backward ['255a'] = 'C8'; Backward ['2554'] = 'C9'; = 'Ca'; Backward ['2566'] = 'Cb'; Backward ['2560'] = 'CC'; Backward ['2550'] = 'CD'; Backward ['256c'] = 'Ce'; Backward ['2567'] = 'Cf'; Backward ['2568'] = 'D0'; Backward ['2564'] = 'D1'; 'D2'; Backward ['2559'] = 'D3'; Backward ['2558'] = 'D4'; Backward ['2552'] = 'D5'; Backward ['2553'] = 'D6'; Avance ['256b'] = 'D7'; Avance ['256a'] = 'D8'; Backward ['2518'] = = = 'D9'; backward ['250c'] = 'da'; backward ['2588'] = 'db'; backward ['2584'] = 'dc'; backward ['258c'] = 'dd'; backward ['2590'] = 'de'; Backward ['2580'] = 'df'; Backward ['3b1'] e0 'e0'; 'E1'; backward ['393'] = 'e2'; backward ['3c0'] = 'e3'; backward ['3a3'] = 'e4; backward [' 3c3 '] =' e5 e5; backward ['b5'] = 'e6; = 'E9'; backward ['3a9'] = 'ea'; backward ['3b4'] = 'eB'; backward ['221e'] = 'ec'; backward ['3c6'] = 'ed'; backward ['3b5'] = 'ee'; hacia atrás ['2229'] = 'ef' 'F1'; Backward ['2265'] = 'f2'; Backward ['2264'] = 'f3'; Backward ['2320'] = 'f4'; Backward ['2321'] = 'f5'; Backward ['f7'] = 'f6'; Backward ['2248'] = 'f7'; Backward ['B0'] = 'f8'; F8 '; 'F9'; backward ['b7'] = 'fa'; backward ['221a'] = 'fb'; backward ['207f'] = 'fc'; backward ['b2'] = 'fd'; backward ['25a0'] = 'fe'; backward ['a0'] = 'ff'; var hd = "01234567899AbcDef"; función (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 = function (qué) Wscript.createObject ("adodb.stream"); var binarystream = new ActiveXObject ("ADODB.Stream"); // Especifique el tipo de transmisión: hacemos trampa y obtenemos cadena pero 'como' binaryBinaryStream.type = adTypeteExt; binarystream.charset = '437'; // abierto streamBinaryStream.WriteText (this.forward437 (What)); // Escribe la cadena a diskBinaryStream.savetofile (this.path, adsavecreateeverwrite); // clearn upbinaryStream.close ();} this.read = function () {// se necesita objeto de transmisión ADO 2.5 o hevightigh Wscript.createObject ("adodb.stream") var binaryStream = new ActiveXObject ("ADODB.Stream"); // Especifique el tipo ObjectBinaryStream.LoadFromFile (this.path); // Abra la transmisión y obtenga 'cadena' binaria de ObjectVar What = binaryStream.ReadText; // Limpiar upbinarystream.close (); return this.backward437 (what);}/ * Convertir un número de octetado a un código de código 437 char Code */this.forward4 = function (instrucciones (instrucciones) (instrucciones) 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 = instrinning.charcodeat (i); if (cc <128) {tmp+= stromcharchar Código (cc);} else {h = this.d2h (cc); h = flow [''+h]; tmp+= string.FromCharCode (this.h2d (h));}} if (tmp! = '') {Encarray.push (tmp);} // Este bucle progresivo concatona los elementos de matriz // Entil solo hay OneVar ar2 = new Array (); for (; Encarray.length> 1;) {var l = Encarray.length; para (var (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 ();} retrash Número*/this.backward437 = function (Instring) {var encraRray = new array (); var tmp = '' '; var i = 0; var c = 0; var l = instring.length; var cc; var cc; var cc; var cc; var cc; var cc; var cc; var cc; var cc; var cc; var cc; var cc; h; for (; i <l; ++ i) {c ++; if (c == 128) {Encarray.push (tmp); tmp = '' '; c = 0;} cc = instrinning.charcodeat (i); if (cc <128) {tmp+= stromChomChromChromCom odo (cc);} más {h = this.d2h (cc); h = backward ['' '+h]; tmp+= stromChomCode (this.h2d (h));}} if (tmp! =' '') {Encarray.push (tmp);} // Este bucle progresivo concatona los elementos de matriz // Entil solo hay OneVar ar2 = new Array (); for (; Encarray.length> 1;) {var l = Encarray.length; para (var (var c = 0; c <l; c+= 2) {if (c+1 == l) {ar2.push (enncarray [c]);} else {ar2.push (''+encarray [c]+encarray [c+1]);}} encarray = ar2; ar2 = new array ();} retraso [0];}}}La parte principal es:
this.ReadAll = function () {// Crear objeto Stream - Necesita ADO 2.5 o Heighighre // var binaryStream = wscript.createObject ("adodb.stream") var binaryStream = new ActiveXObject ("adodb.Stream"); // Specify stream - hacemos trampa y obtenemos cadena pero 'como' binaryBinaryStream.typext; binaryStext; codePage; // Abrir el streamBinaryStream.open (); // Cargue los datos del archivo desde el disco a la transmisión objetobinaryStream.loadFromFile (this.path); // Abra la transmisión y obtenga la 'cadena' binaria de 'WhatStream.ReadText; // Limpie UpBinaryStream.Close (); return that.backward437 (lo que);};};};}Aquí está el método de leer archivos utilizando el control "ADODB.Stream". ¡Puede ver que el tipo de lectura utilizado por el autor es AdTypetext (2), que está leyendo archivos binarios usando lectura de texto! Después de cambiar el documento a AdTypeBinary (1), no puede leer nada, no sé por qué.
El resto del código está haciendo trabajo de conversión de codificación. En términos generales, al leer archivos, debe usar el conjunto de caracteres "ISO-8859-1", y al enviar archivos con HTTP, debe usar el conjunto de caracteres "Windows-1252". Solo hay unos pocos caracteres numéricos en estos dos conjuntos de caracteres, por lo que encuentra las diferentes partes en los datos de lectura para convertirlos en otro conjunto de caracteres Representación uno por uno.
Ajax envía una transmisión binaria:
function uploadAndSubMit2 (binaryContent) {url = urlhead + "Cook.ashx"; xmlhttp = new xmlhttprequest (); xmlhttp.open ("post", url + "? Method = post & func = file_upload & filename =" + EncodeReRiCoMponent (filename.split ("//") [filename.split ("//"). longitud-1])); // Ie Process Caracteres chinos urlxmlhtp.sendasbinary (binaryContent); xmlhttp.onreadyStateChange = function () {if (xmlhttp.adeytready == 4) (xmlhttp.status == 200) {var str = xmlhttp.Response; alert (str); xmlhttp.abort ();}}}}Para la transmisión binaria, no hay "Window.activexObject (" msxm12.xmlhttp ")" y "window.activexObject (" microsoft.xmlhttp ")" compatible con la versión anterior de IE. Me pregunto si tiene algún método de transmisión binaria que admite estos dos controles ActiveX.
En un tutorial, la línea seis está frente a él:
xmlhttp.overridemeMeType ('text // sencillo; charset = x-user-fined'); //: x-user-definado le dice al navegador que no analice los datos devueltos
Después de agregar esta línea, el navegador no analizará el formato de codificación de los datos devueltos en segundo plano. Específicamente, el texto chino devuelto al primer plano se muestra como "" o "puerto". Supongo que el autor hace esto para recibir datos binarios transmitidos desde el backend en primer plano.
De hecho, solo el XMLHTTPREQUEST de Firefox admite el método SendAsbinary. Para usarlo en IE y Google, debe agregar un método prototipo a XMLHTTPRequest:
// Agregar función de envío binaria al prototipo de xmlhttprequest xmlhttprequest.prototype.sendasbinary = function (dataTastr) {function bytevalue (x) {return x.charcodeat (0) y 0xff;} var ords = array.prototype.map.call (dataTR, byTeValue); Uint8array (ords); this.send (ui8a.buffer);}No entiendo muy bien el código aquí. La sexta línea IE8 no lo admite y la séptima línea IE9 no lo admite.
El fondo usa Java Serverlet, y el siguiente es el código de la clase Java final:
Public String FileUpload (httpservletRequest solicitud) lanza IOException {request.setcharacterEncoding ("UTF-8"); BufferedInputStream FileIn = new BufferedInputStream (request.getInputStream ()); Cadena fn = request.getParameter ("nombre de archivo"); byte [] buf = nuevo byte [1024]; Archivo archivo = nuevo archivo ("d:/" + fn); BufferedOutputStream FileOut = new BufferedOutputStream (nuevo FileOutputStream (archivo)); Pruebe {while (true) {// lea datos int bytesin = filein.read (buf, 0, 1024); System.out.println (bytesin); if (bytesin == -1) {break; } else {fileOut.Write (buf, 0, bytesin); }} fileout.flush (); return ("Guardar exitoso");} Catch (Exception e) {return "Guardar fallido, razón:"+e.ToString ();} finalmente {fileOut.close (); }}Lo anterior es el método de leer archivos binarios en JavaScript y transmitir transmisiones binarias usando AJAX que le presenté. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!