En combinant plusieurs tutoriels en ligne et les méthodes obtenues par vous-même, il est actuellement compatible avec Google, IE11 et IE10.
Il n'y a rien de spécial dans le contenu dans le HTMLBody.
<div id = "dconfirm"> <p style = "float: gauche; margin-left: 20px; margin-top: 20px"> <form action = "javaScript: uploadandSubmit ();" name = "Demoform" id = "DemoFORG" Method = "Post" EncType = "multipart / form-data"> <p> Fichier de téléchargement: <entrée type = "file" name = "file" id = "str_file" /> </ p> <p> </pant type = "soup"
Lire des fichiers binaires:
fonction uploadandSubmit () {filename = document.getElementById ("str_file"). value; var form = document.forms ["Demofor"]; if (filename! = "") {try {var obj = new activeXObject ("adodb.stream"); // FileReader (); reader.readasbinaryString (file); // Ceci est lu asynchrone Reader.onLoadEnd = function () {// Une fois la lecture terminée, if (reader.error) {console.log (reader.error);} else {uploadandSubmit2 (Reader.result);}} return;} var bf1 = new BinaryFile (nom de fichier); // Cette lecture est synchronisée UploadandSubmit2 (bf1.readall ());}}Ici, nous devons porter un jugement sur le type de navigateur. Si ce n'est pas IE, utilisez FileReader pour la lecture, et si c'est IE, utilisez le contrôle ActiveX pour la lecture. Il y a une fosse ici. Bien que IE11 et IE10 ne prennent pas en charge la méthode de l'objet FileReader, le "typeof filereader" de IE11 et IE10 n'est pas "non défini", et il est difficile de distinguer directement le navigateur en prenant en charge le fichier Fileaders. Il convient également de noter que la méthode FileReader est de lire les fichiers de manière asynchrone, et ActiveX doit lire les fichiers de manière synchrone. Je n'ai jamais compris comment ces deux itinéraires sont encapsulés dans une méthode. Je me demande s'il y a une bonne solution pour vous.
Parmi eux, la méthode de construction de l'objet BinaryFile est extrait de http://www.codeproject.com/articles/17825/reading-and-writing-binary-files-using-jscript?msg=3718403#xx3718403xx technologie. Il existe une méthode d'amélioration dans la réponse du blog. On dit qu'il est plus efficace, mais parce que je ne le comprenais pas, j'ai choisi la méthode d'origine.
La méthode d'origine est longue:
// Lorsque vous utilisez le contrôle Adodb.stream, faites attention à la conversion entre la fonction ISO-8859-1 et Windows-1252 Fonction de jeu de caractères BinaryFile (nom) {var adtypebinary = 1Var adtypeText = 2Var adsavreateOoverwrite = 2 // L'astuce - il s'agit de la page de traduction à l'ancienne " codepage = '437'; this.path = name; var ultor = new Array (); var backward = new Array (); // note - Pour de meilleures performances, je dois préconverter ces définitions hexadécimales à décimal - à un moment donné :-) - ajtfor '00e2'; Forward ['84 '] =' 00e4 '; Forward ['85'] = '00e0'; Forward ['86 '] =' 00e5 '; Forward ['87'] = '00e7'; Forward [88 '] =' 00ea '; Forward ['89'] = '00eb'; = '00ef'; Forward ['8c'] = '00ee'; Forward ['8d'] = '00ec'; Forward ['8e'] = '00c4'; Forward ['8f'] = '00c5'; Forward [90 '] =' 00c9 '; Forward ['91'] = '00e6'; '00f4'; Forward ['94 '] =' 00f6 '; Forward ['95'] = '00f2'; Forward ['96 '] =' 00fb '; Forward ['97'] = '00f9'; Forward [98 '] =' 00ff '; Forward ['99'] = '00d6'; = '00A2'; Forward ['9c'] = '00A3'; Forward ['9d'] = '00A5'; Forward ['9e'] = '20a7'; Forward ['9f'] = '0192'; Forward [A0 '] =' 00E1 '; Forward [' A1 '] =' 00ed '; = '00fa'; Forward ['a4'] = '00f1'; Forward ['a5'] = '00d1'; Forward ['a6'] = '00aa'; Forward ['a7'] = '00ba'; Forward ['A8'] = '00BF'; Forward ['A9'] = '2310'; '00bd'; Forward ['AC'] = '00BC'; Forward ['ad'] = '00a1'; Forward ['ae'] = '00AB'; Forward ['AF'] = '00BB'; Forward ['B0'] = '2591'; Forward ['B1'] = '2592'; Forme '2502'; Forward ['B4'] = '2524'; Forward ['B5'] = '2561'; Forward ['B6'] = '2562'; Forward ['B7'] = '2556'; Forward ['B8'] = '2555'; Forward ['B9'] = '2563'; '2557'; Forward ['BC'] = '255D'; Forward ['Bd'] = '255c'; Forward ['be'] = '255b'; Forward ['Bf'] = '2510'; Forward ['C0'] = '2514'; Forward ['C1'] = '2534'; Forme '251c'; Forward ['C4'] = '2500'; Forward ['C5'] = '253C'; Forward ['C6'] = '255e'; Forward ['C7'] = '255f'; Forward ['C8'] = '255a'; Forward ['C9'] = '2554'; Forward ['Ca'] = '2569'; '2566'; Forward ['CC'] = '2560'; Forward ['CD'] = '2550'; Forward ['ce'] = '256c'; Forward ['Cf'] = '2567'; Forward ['D0'] = '2568'; Forward ['D1'] = '2564'; Forme '2559'; Forward ['d4'] = '2558'; Forward ['d5'] = '2552'; Forward ['D6'] = '2553'; Forward ['D7'] = '256B'; Forward ['D8'] = '256a'; Forward ['D9'] = '2518'; '2588'; Forward ['DC'] = '2584'; Forward ['dd'] = '258c'; Forward ['de'] = '2590'; Forward ['df'] = '2580'; Forward ['e0'] = '03B1'; Forward ['e1'] = '00df'; Forward ['e2'] = '0393' '03C0'; Forward ['e4'] = '03a3'; Forward ['e5'] = '03c3'; Forward ['e6'] = '00b5'; Forward ['e7'] = '03c4'; Forward ['e8'] = '03a6'; Forward ['e9'] = '0398'; '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'; Forward ['f9'] = '2219'; '221a'; en avant ['fc'] = '207f'; en avant ['fd'] = '00b2'; en avant ['fe'] = '25a0'; en avant ['ff'] = '00a0'; backward ['c7'] = '80'; backward ['fc'] = '81'; backward ['e9'] = '82'; '83'; en arrière ['e4'] = '84'; arrière ['e0'] = '85'; arrière ['e5'] = '86'; en arrière ['e7'] = '87'; en arrière ['ea'] = '88'; en arrière ['eb'] = '89'; en arrière ['e8'] = '8a'; backward [ef '] = = backward [' e8 '] =' 8a '; backward ["ef'] = [" e8 '] =' 8a '; backward [ef'] '8b'; en arrière ['ee'] = '8c'; arrière ['ec'] = '8d'; arrière ['C4'] = '8e'; arrière ['C5'] = '8f'; arrière ['C9'] = '90'; Backward ['e6'] = '91'; backward ['c6'] = '92'; backward [f4 '] '93'; en arrière ['f6'] = '94'; arrière ['f2'] = '95'; arrière ['fb'] = '96'; arrière ['f9'] = '97'; en arrière ['ff'] = '98'; en arrière ['d6'] = '99'; en arrière [DC '] =' 9a '; backward [a2']. '9b'; arrière ['a3'] = '9c'; arrière ['a5'] = '9d'; arrière ['20a7'] = '9e'; arrière ['192'] = '9f'; en arrière ['e1'] = 'a0'; backward ['ed'] = 'a1'; backward ['f3'] = 'a2'; backward 'A3'; arrière ['f1'] = 'a4'; arrière ['d1'] = 'a5'; arrière ['aa'] = 'a6'; arrière ['ba'] = 'a7'; arrière ['bf'] = 'a8'; backward ['2310'] = 'a9'; backward ['ac'] = 'aa'; backward [bd '] 'Ab'; en arrière ['bc'] = 'ac'; arrière ['a1'] = 'ad'; arrière ['ab'] = 'ae'; en arrière ['bb'] = 'af'; en arrière ['2591'] = 'b0'; en arrière ['2592'] = 'b1'; à l'arrière ['2593'] = 'b2'; backward ['2502'] 'B3'; en arrière ['2524'] = 'b4'; arrière ['2561'] = 'b5'; arrière ['2562'] = 'b6'; en arrière ['2556'] = 'b7'; en arrière ['2555'] = 'B8'; Backward ['2563'] = 'b9'; arrière ['2551'] = 'Ba'; arrière ['2557'] = 'bb'; arrière ['255d'] = 'BC'; arrière ['255c'] = 'bd'; arrière ['255b'] = 'be'; en arrière ['2510'] = 'bf'; Backward ['2514'] = 'C0'; en arrière ['' 2534 '] =' C1 '. 'C2'; en arrière ['251c'] = 'C3'; arrière ['2500'] = 'C4'; arrière ['253C'] = 'C5'; en arrière ['255e'] = 'C6'; en arrière ['255f'] = 'C7'; en arrière ['255a'] = 'C8'; = 'Ca'; arrière ['2566'] = 'cb'; arrière ['2560'] = 'cc'; arrière ['2550'] = 'cd'; arrière ['256c'] = 'ce'; arrière ['2567'] = 'cf'; backward ['2568'] = 'd0'; en arrière ['2564' 'D2'; arrière ['2559'] = 'd3'; arrière ['2558'] = 'd4'; arrière ['2552'] = 'd5'; arrière ['2553'] = 'd6'; en arrière ['256b'] = 'D7'; Backward ['256a'] = 'd8'; arrière ['2518'] = 'D9'; en arrière ['250c'] = 'da'; arrière ['2588'] = 'db'; arrière ['2584'] = 'dc'; arrière ['258c'] = 'dd'; en arrière ['2590'] = ' 'E1'; en arrière ['393'] = 'e2'; arrière ['3c0'] = 'e3'; arrière ['3a3'] = 'e4'; en arrière ['3c3'] = 'e5'; en arrière ['b5'] = 'e6' '; en arrière [' 3c4 '] =' e7 '; en arrière [' 3a6 '] ='. = 'E9'; arrière ['3a9'] = 'ea'; arrière ['3b4'] = 'eb'; arrière ['221e'] = 'ec'; arrière ['3c6'] = 'ed'; en arrière ['3b5'] = 'ee'; en arrière ['2229'] = 'ef'; en arrière ['2261' 'F1'; arrière ['2265'] = 'f2'; arrière ['2264'] = 'f3'; arrière ['2320'] = 'f4'; arrière ['2321'] = 'f5'; en arrière ['f7'] = 'f6'; backward ['2248'] = 'f7'; en arrière [b0 '] =' F8 ''; 'F9'; en arrière ['b7'] = 'fa'; arrière ['221a'] = 'fb'; arrière ['207f'] = 'fc'; arrière ['b2'] = 'fd'; arrière ['25a0'] = 'fe'; backward ['a0'] = 'ff'; var hd = "0123456789abccd '; this. fonction (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 (what) {// créer un objet Stream / var binarar Wscript.createObject ("adodb.stream"); var binarystream = new activeXObject ("adodb.stream"); // spécifier le type de flux - nous trichons et obtenons une chaîne mais 'like' binarybinarystream.type = adtypeText; binarystream.carset = '437'; // ouvrir le stretyBinarystream.open (); // en écriture StreamBinaryStream.WriteText (this.forward437 (quoi)); // Écrivez la chaîne sur diskbinarystream.savetofile (this.path, adsavecreateoverwrite); // clearn upbinarystream.close ();} this.readall = function () {// créer un objet de flux - a besoin de 2,5 ou de heighter // var binarystream = Wscript.createObject ("adodb.stream") var binarystream = new activeXObject ("adodb.stream"); // spécifier le type de flux - nous trichons et obtenons une chaîne mais 'like' binarybinarystream.type = adtypeText; binarystream.Charset = codePage; // ouvrir le streambinary. objectBinaryStream.LoadFromFile (this.path); // Ouvrez le flux et obtenez la «chaîne» binaire de l'objetvar what = binarystream.readtex Array (); var tmp = ''; var i = 0; var c = 0; var l = instrung.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. Code (cc);} else {h = this.d2h (cc); h = trown ['' + h]; tmp + = string.fromCharcode (this.h2d (h));}} if (tmp! = '') {Encarray.push (tmp);} // Cette boucle progressive concatonate les éléments de tableau // entils Il n'y a qu'un seulvar ar2 = new Array (); for (; encarray.length> 1;) {var l = encarray.length; pour (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();}return encArray[0];}/* Convert a code page 437 char code to a octet nombre * / this.backward437 = fonction (instruction) {var encarray = new array (); var tmp = ''; var i = 0; var c = 0; var l = instrung.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.fromCharc ode (cc);} else {h = this.d2h (cc); h = backward ['' + h]; tmp + = string.fromCharcode (this.h2d (h));}} if (tmp! = '') {encarray.push (tmp);} // Cette boucle progressive concatonate les éléments de tableau // entils Il n'y a qu'un seulvar ar2 = new Array (); for (; encarray.length> 1;) {var l = encarray.length; pour (var c = 0; c <l; c + = 2) {if (c + 1 == l) {ar2.push (encarray [c]);} else {ar2.push ('' + encarray [c] + enfer [c + 1]);}} encarray = ar2; ar2 = new Array ();} return encarray [0];}}La partie principale est:
this.readall = function () {// Créer un objet Stream - a besoin de ADO 2.5 ou theinter // var binarystream = wscript.createObject ("adodb.stream") var binarystream = new activeXobject ("adodb.stream"); // spécifier le type de diffusion - nous trichez et obtenons une chaîne mais 'comme' binarybinystream.type CodePage; // Ouvrez le StreamBinaryStream.Open (); // Chargez les données de fichier du disque à Stream ObjectBinaryStream.LoadFromFile (this.path); // Ouvrez le flux et get 'String' binaire 'à partir de l'objetVar What = BinaryStream.ReadText; // Clean UpbinaryStream.Close (); Retour This.backward437 (What);};Voici la méthode de lecture de fichiers à l'aide du contrôle "Adodb.stream". Vous pouvez voir que le type de lecture utilisé par l'auteur est AdtypeText (2), qui est de lire des fichiers binaires en utilisant la lecture de texte! Après avoir changé le document en Adtypebinary (1), vous ne pouvez rien lire, je ne sais pas pourquoi.
Le reste du code fait des travaux de conversion d'encodage. D'une manière générale, lorsque vous lisez des fichiers, vous devez utiliser le jeu de caractères "ISO-8859-1", et lors de l'envoi de fichiers avec HTTP, vous devez utiliser le jeu de caractères "Windows-1252". Il n'y a que quelques caractères numériques dans ces deux jeux de caractères, vous trouvez donc les différentes parties des données de lecture pour les convertir en une autre représentation de jeu de caractères une par une.
Ajax envoie un flux binaire:
Fonction uploadandSubmit2 (binaryContent) {url = urlhead + "Cook.ashx"; xmlhttp = new xmlHttpRequest (); xmlhttp.open ("post", url + "? EncodeuriComponent (filename.split ("//") [filename.split ("//"). longueur-1])); // processus chinois des caractères urlxmlhttp.sendasbinary (binaryContent); xmlhttp.onreadystatechange = function () {if (xmlhttp.ReadyState == 4) (xmlhttp.status == 200) {var str = xmlhttp.Response; alert (str); xmlhttp.abort ();}}}}}Pour la transmission binaire, il n'y a pas de "fenêtre.activexObject (" msxm12.xmlhttp ")" et "window.activexObject (" Microsoft.xmlhttp ")" Compatible avec l'ancienne version de IE. Je me demande si vous avez des méthodes de transmission binaires qui prennent en charge ces deux contrôles ActiveX.
Dans un tutoriel, la ligne six est devant:
xmlhttp.OverridemiMetype ('text // plaine; charset = x-user-defined'); //: x-user-defined indique au navigateur de ne pas analyser les données renvoyées
Après avoir ajouté cette ligne, le navigateur n'analyse pas le format de codage des données renvoyées en arrière-plan. Plus précisément, le texte chinois retourné au premier plan s'affiche comme "" ou "port". Je suppose que l'auteur le fait pour recevoir des données binaires transmises du backend au premier plan.
En fait, seul XMLHTTPRequest de Firefox prend en charge la méthode Sendasbinary. Pour l'utiliser sous IE et Google, vous devez ajouter une méthode prototype à XMLHTTPREQUEST:
// ajouter une fonction d'envoi binaire au prototype de xmlhttprequest xmlhttprequest.prototype.sendasbinary = function (datastr) {function bytevalue (x) {return x.charcodeat (0) & 0xff;} var ords = array.prototype.map.Call (datast, bytevaluue); Uint8Array (ORDS); this.send (ui8a.buffer);}Je ne comprends pas très bien le code ici. La sixième ligne IE8 ne le prend pas en charge et la septième ligne IE9 ne le prend pas en charge.
L'arrière-plan utilise Java Serverlet, et ce qui suit est le code de la classe Java finale:
Public String Fileupload (HttpServLetRequest Request) lève ioException {request.SetcharAtterencoding ("utf-8"); bufferedInputStream fileIn = new BufferedInputStream (request.getInputStream ()); String fn = request.getParameter ("FileName"); octet [] buf = nouveau octet [1024]; Fichier file = nouveau fichier ("d: /" + fn); BufferedOutputStream fileout = new BufferedoutputStream (new FileOutputStream (fichier)); essayez {while (true) {// lire les données int bytesIn = fileIn.read (buf, 0, 1024); System.out.println (bytesin); if (bytesIn == -1) {break; } else {fileout.write (buf, 0, bytesin); }} fileout.flush (); return ("sauver réussi");} catch (exception e) {return "Save a échoué, raison:" + e.toString ();} enfin {fileout.close (); }}Ce qui précède est la méthode de lecture de fichiers binaires en JavaScript et de transmission de flux binaires à l'aide d'Ajax que je vous ai présentés. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!