Combinando vários tutoriais on -line e os métodos obtidos por você, atualmente é compatível com o Google, IE11 e IE10.
Não há nada de especial no conteúdo no htmlbody.
<div id = "dConfirm"> <p style = "float: esquerda; margem-left: 20px; margem-top: 20px"> <form action = "javascript: uploadandsubmit ();" name = "Demoforma" id = "Demoforma" Método = "Post" ENCTYPE = "Multipart/Form-Data"> <p> File de upload: <input type = "file" name = "file" id = "str_file"/> </p> <p> <input Type = "submit" = "upload"/</p>
Leia arquivos binários:
function uploadandsubMit () {filename = document.getElementById ("str_file"). value; var form = document.forms ["Demoform"]; if (filename! = "") {try] {var obj = new ActiveXobject ("adodb.stream"); //) new fileReader (); reader.readasBinaryString (arquivo); // Isso é lido assíncrono reader.onLoadend = function () {// Após a leitura ser concluída, se (reader.error) {console.log.rog (reader.error);} else {uploadland) Binaryfile (nome do arquivo); // Esta leitura é sincronizada uPLOPLANDSUBMIT2 (BF1.readall ());}}Aqui precisamos fazer um julgamento no tipo de navegador. Se não for, IE, use o FileReader para leitura e, se for o IE, use o ActiveX Control para leitura. Há um poço aqui. Embora o IE11 e o IE10 não suportem o método do objeto FileReader, o "typeof fileReader" do IE11 e o IE10 não é "indefinido", e é difícil distinguir o navegador diretamente se ele suporta o FileReader. Deve -se notar também que o método FileReader é ler arquivos de forma assíncrona e o ActiveX é ler os arquivos de maneira síncrona. Eu nunca descobri como essas duas rotas são encapsuladas em um método. Gostaria de saber se existe uma boa solução para você.
Entre eles, o método de construção do objeto BinaryFile é extraído em http://www.codeproject.com/articles/17825/reading-andriting-binary-files-using-jscript?msg=3718403#xxx3718403xx Blog de tecnologia. Existe um método de melhoria na resposta do blog. Dizem que é mais eficiente, mas como eu não entendi, escolhi o método original.
O método original é longo:
//Ao usar o controle Adodb.stream, preste atenção à conversão entre a função ISO-8859-1 e o Windows-1252 da função BinaryFile (name) {var adTypeBinary = 1Var adtypeText = 2Var adsAvecreateSoverWrite = 2 // o truque-o que é o momento antigo para a manifestação 'não translation // CodePage = '437'; this.path = nome; var para forward = new Array (); var para trás = new Array (); // Nota - Para melhor desempenho, eu deveria pré -determinar essas definições hexadecimais // para decimal - em algum momento :-) - Ajtforward ['80 '] =' 00 '; Forward ['81'] = '00fc'; '00E2'; Forward ['84 '] =' 00E4 '; Forward ['85'] = '00E0'; Forward ['86 '] =' 00E5 '; Forward ['87'] = '00E7'; Forward ['88 '] =' 00Aa ';'; = '00EF'; Forward ['8C'] = '00EE'; Forward ['8D'] = '00EC'; Forward ['8e'] = '00C4'; Forward ['8f'] = '00C5'; Forward ['90 '] =' 00 ';'; '00f4'; forward ['94 '] =' 00f6 '; forward ['95'] = '00f2'; forward ['96 '] =' 00fb '; forward ['97'] = '00f9'; Forward ['98 '] =' 00FF '; = '00A2'; Forward ['9C'] = '00A3'; Forward ['9D'] = '00A5'; Forward ['9e'] = '20A7'; Forward ['9f'] = '0192'; = '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'; avançado ['ae'] = '00ab'; forward ['af'] = '00bb'; avançado ['B0'] = '2591'; '2502'; para a frente ['B4'] = '2524'; Forward ['B5'] = '2561'; Forward ['B6'] = '2562'; Forward ['B7'] = '2556'; Forward ['B8'] = '2555' ['B9'] = '2563'; '2557'; avançado ['bc'] = '255d'; avançado ['bd'] = '255c'; avançado ['be'] = '255b'; forward ['bf'] = '2510'; forward ['c0'] = 2514 '; '251c'; avançado ['C4'] = '2500'; avançado ['C5'] = '253C'; Forward ['C6'] = '255E'; Forward ['C7'] = '255f'; avançado ['C8'] = 255A '; '2566'; Forward ['CC'] = '2560'; Forward ['CD'] = '2550'; Forward ['CE'] = '256C'; Forward ['Cf'] = '2567'; Forward ['D0'] = '2568'; Forward ['D1' = '2564'; '2559'; avançar ['d4'] = '2558'; avançar ['d5'] = '2552'; avançar ['d6'] = '2553'; avançar ['d7'] = '256b'; avançar ['d8'] = '256a'; '2588'; avançado ['dc'] = '2584'; forward ['dd'] = '258c'; forward ['de'] = '2590'; forward ['df'] = '2580'; avançado ['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'; avanço ['fc'] = '207f'; forward ['fd'] = '00B2'; avançado ['fe'] = '25a0'; avançado ['ff'] = '00a0'; redowward ['c7'] = '80'; '83'; para trás ['e4'] = '84'; para trás ['e0'] = '85'; para trás ['e5'] = '86'; para trás ['e7'] = '87'; redowward ['e8] =' 88 '; '8b'; para trás ['ee'] = '8c'; para trás ['ec'] = '8d'; para trás ['c4'] = '8e'; para trás ['c5'] = '8f'; redowward ['c9'] = '90'; '93'; para trás ['f6'] = '94'; para trás ['f2'] = '95'; para trás ['fb'] = '96'; para trás ['f9'] = '97'; redowward ['ff'] = '98'; '9b'; para trás ['a3'] = '9c'; para trás ['a5'] = '9d'; para trás ['20a7'] = '9e'; para trás ['192'] = '9f'; redowward ['e1'] = 'a0'; 'A3'; para trás ['f1'] = 'a4'; para trás ['d1'] = 'a5'; para trás ['aa'] = 'a6'; para trás ['ba'] = 'a7'; redowward ['bf'] = 'a8'; 'Ab'; para trás ['bc'] = 'ac'; para trás ['a1'] = 'ad'; para trás ['ab'] = 'ae'; para trás ['bb'] = 'af'; para trás ['2591'] = 'b0'; para trás ['2592' = 'B1'; 'B3'; para trás ['2524'] = 'B4'; para trás ['2561'] = 'B5'; para trás ['2562'] = 'B6'; para trás ['2556'] = 'B7'; 'Ba'; para trás ['2557'] = 'bb'; para trás ['255d'] = 'bc'; para trás ['255c'] = 'bd'; para trás ['255b'] = 'ser'; 'C2'; para trás ['251C'] = 'C3'; para trás ['2500'] = 'C4'; para trás ['253C'] = 'C5'; para trás ['255e'] = 'C6'; = 'Ca'; para trás ['2566'] = 'cb'; para trás ['2560'] = 'cc'; para trás ['2550'] = 'cd'; para trás ['256c'] = 'ce'; para trás; 'D2'; para trás ['2559'] = 'd3'; para trás ['2558'] = 'd4'; para trás ['2552'] = 'd5'; para trás ['2553'] = 'd6'; 'D9'; para trás ['250C'] = 'da'; para trás ['2588'] = 'db'; para trás ['2584'] = 'dc'; para trás ['258c'] = 'dd'; para trás; 'E1'; para trás ['393'] = 'e2'; para trás ['3C0'] = 'e3'; para trás ['3a3'] = 'e4'; para trás ['3C3'] = 'e5'; = 'E9'; para trás ['3a9'] = 'ea'; para trás ['3b4'] = 'eb'; para trás ['221e'] = 'ec'; para trás ['3c6'] = 'ed'; para trás; 'F1'; para trás ['2265'] = 'f2'; para trás ['2264'] = 'F3'; para trás ['2320'] = 'f4'; para trás ['2321'] = 'f5'; 'F9'; para trás ['B7'] = 'fa'; para trás ['221a'] = 'fb'; para trás ['207f'] = 'fc'; para trás ['b2'] = 'fd'; para trás ['25a0'] = 'fe'; redonde function (d) {var h = hd.substr (d & 15,1); while (d> 15) {d >> = 4; h = hd.substr (d & 15,1)+h;} retorna h;} this.h2d = function (h) {return parsent (h/16);} this.writeLl = function (o que Wscript.createObject ("adodb.stream"); var binarystream = new ActiveXObject ("adodb.stream"); // especifique o tipo de fluxo - trapaceiam e obtemos string, mas 'como' binarybinaryStream.typene = adtypeText; binarySetream. StreamBinaryStream.WriteText (this.forward437 (o quê)); // Escreva a string no diskbinarystream.savetofile (this.path, adSavecReateOverWrite); // limpen upbinarystream.close ();} this.readall = function () {// Criar o objeto de fluxo - necessidades ADO 2. Wscript.createObject ("adodb.stream") var binarystream = new ActiveXObject ("adodb.stream"); // Especifique o tipo de fluxo - trapaceiam e obtemos string, mas 'como' binarybinarystream.type = adtypetext; binaryStream.charset = codificação; objectBinaryStream.LoadFromFile (this.Path); // Abra o fluxo e obtenha 'string' binária do objectVar What = BinaryStream.readText; // Limpe upbinaryStream.close (); return this.backward437 (o quê);}/ * convert um número octe em que um código 437 CEDEMENTE */this.Te.Ter); Array (); var tmp = ''; var i = 0; var c = 0; var l = instruming.length; var cc; var; h; para (; 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 = forward [''+h]; tmp+= string.fromcharcode (this.h2d (h));}} if (tmp! = '') {Encarray.push (tmp);} // Esse loop concatona progressivo os elementos // elementos de matriz, existe apenas OneVar AR2 = new Array (); para (; Encarray.length> 1;) {var l = encarray.length; para (var c = 0; c <l; c+= 2) {if (c+1 == l) {ar2.push (encarray [c]);} else {ar2.push (''+esterão [c]+esterileiro [c+1]);}} ecarray = ar2; ar2; número*/this.backward437 = function (instruming) {var encarray = new Array (); var tmp = ''; var i = 0; var c = 0; var l = instruming.Length; var cc; var; h; para (; 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 = para trás [''+h]; tmp+= string.fromCharcode (this.h2d (h));}} if (tmp! = '') {carray.push (tmp);} // // Esse loop concatona progressivo os elementos // elementos de matriz, existe apenas OneVar AR2 = new Array (); para (; Encarray.length> 1;) {var l = encarray.length; para (var c = 0; c <l; c+= 2) {if (c+1 == l) {ar2.push (encarray [c]);} else {ar2.push (''+esterrar [c]+ecarray [c+1]);}} ecarray = ar2; ar2;A parte principal é:
this.ReadAll = function(){//Create Stream object - needs ADO 2.5 or heighter//var BinaryStream = WScript.CreateObject("ADODB.Stream")var BinaryStream = new ActiveXObject("ADODB.Stream");//Specify stream type - we cheat and get string but 'like' binaryBinaryStream.Type = adTypeText;BinaryStream.CharSet = codePage; // Abra o StreamBinaryStream.open (); // Carregue os dados do arquivo do disco para transmitir objectBinaryStream.LoadFromFile (this.Path); // Abra o fluxo e obtenha 'string' binária do objectVar o que = binarystream.readtext; // limpeza);Aqui está o método de ler arquivos usando o controle "Adodb.stream". Você pode ver que o tipo de leitura usado pelo autor é adtypetext (2), que está lendo arquivos binários usando a leitura de texto! Depois de alterar o documento para adtypebinary (1), você não pode ler nada, não sei por quê.
O restante do código está fazendo o trabalho de conversão de codificação. De um modo geral, ao ler arquivos, você precisa usar o conjunto de caracteres "ISO-8859-1" e, ao enviar arquivos com HTTP, você precisa usar o conjunto de caracteres "Windows-1252". Existem apenas alguns caracteres numéricos nesses dois conjuntos de caracteres, então você encontra as diferentes partes nos dados de leitura para convertê -los em outro conjunto de caracteres, um por um por um.
Ajax envia um fluxo binário:
função uploadandsubmit2 (binarycontent) {url = urlhead + "cook.ashx"; xmlhttp = novo xmlHttPrequest (); xmlhttp.open ("post", url + "? codeuricomponent (filename.split ("//") [fileName.split ("//"). comprimento-1])); // ou seja, os caracteres chineses urlxmlHttp.sendasbinary (binaryContent); xmlHttp.onreadyStechange = {) {se (xmlhttp.status == 200) {var str = xmlHttp.Response; alert (str); xmlhttp.abort ();}}}}}Para transmissão binária, não há "Window.ActivexObject (" msxm12.xmlHttp ")" e "window.activexObject (" Microsoft.xmlHttp ")" Compatível com a versão antiga do IE. Gostaria de saber se você tem algum método de transmissão binária que suporta esses dois controles ActiveX.
Em um tutorial, a linha seis está na frente dele:
xmlhttp.Overridemimetype ('text // Plain; charset = x-user-Defined'); //: x-user-Defined diz ao navegador para não analisar os dados retornados
Depois de adicionar essa linha, o navegador não analisará o formato de codificação dos dados retornados em segundo plano. Especificamente, o texto chinês retornado ao primeiro plano é exibido como "" ou "porta". Eu acho que o autor faz isso para receber dados binários transmitidos do back -end em primeiro plano.
De fato, apenas o XMLHTTPREQUEST do Firefox suporta o método Sendasbinary. Para usá -lo no IE e no Google, você precisa adicionar um método de protótipo ao xmlHttPrequest:
// Adicione a função de envio binário ao protótipo de xmlHttPrequest xmlhttPrequest.prototype.sendasbinary = function (dATASTR) {function bytevalue (x) {return x.charcodeat (0) e 0xff;} vars = Array.ProType.Map.Map.Map.COLEAT (0xFF; Uint8array (ords); this.send (ui8a.buffer);}Não entendo muito bem o código aqui. A sexta linha IE8 não a suporta e a sétima linha IE9 não a suporta.
O plano de fundo usa o Java ServerLet, e o seguinte é o código da classe Java final:
public string fileUpload (solicitação httpServletRequest) lança a ioexception {request.Setcharacterencoding ("utf-8"); bufferInputStream fileIn = new BufferInputStream (request.getInputStream ()); String fn = request.getParameter ("nome do arquivo"); byte [] buf = novo byte [1024]; Arquivo de arquivo = novo arquivo ("d:/" + fn); BufferoutOutputStream fileout = new BufferoudOutputStream (new FileOutputStream (File)); tente {while (true) {// leia dados int bytesin = filein.read (buf, 0, 1024); System.out.println (bytesin); if (bytesin == -1) {break; } else {fileout.write (buf, 0, bytesin); }} fileout.flush (); return ("salvar bem -sucedido");} catch (Exceção e) {return "salvar falha, razão:"+e.toString ();} finalmente {fileout.close (); }}O exposto acima é o método de ler arquivos binários em JavaScript e transmitir fluxos binários usando o AJAX que eu apresentei a você. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!