여러 온라인 자습서와 직접 얻은 방법을 결합하여 현재 Google, IE11 및 IE10과 호환됩니다.
htmlbody의 내용에는 특별한 것이 없습니다.
<div id = "dconfirm"> <p style = "float : 왼쪽; 마진-왼쪽 : 20px; 마진-탑 : 20px"> <form action = "javaScript : uploadandSubmit ();"; 이름 = "demoform"id = "demoform"method = "post"encType = "multipart/form-data"> <p> 파일 업로드 : <입력 유형 = "file"name "="file "id ="str_file "/> </p> <p> <입력 유형 ="value = "upload"/> </p> </div> </div> </div>
이진 파일 읽기 :
함수 uploadandSubmit () {filename = document.getElementById ( "str_file"). filereader (); reader.readaSbinaryString (file); // 이것은 읽기 비동기식 reader.onloadend = function () {// 읽기가 완료된 후, if (reader.error) {console.log (reader.error);} else {uploadandsubmit2 (reader.result);} var bf1 (var bf1); 동기화 업로드 andsubmit2 (bf1.readall ());}}여기서는 브라우저 유형에 대한 판단을해야합니다. IE가 아닌 경우 FilereAder를 사용하여 읽기에 사용하고 IE 인 경우 ActiveX Control을 사용하여 읽기를하십시오. 여기에 구덩이가 있습니다. IE11 및 IE10은 FilereAder 객체 방법을 지원하지 않지만 IE11 및 IE10의 "Filereader 타입"은 "정의되지 않은"것이 아니며 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과 Wind CodePage = '437'; this.path = name; var forward = new array (); var backward = new array (); // 참고 - 더 나은 성능을 위해서는이 16 진수 // 정의를 어느 시점에서 미리 정리해야합니다 - 어느 시점에서 :-) - ajtforward ['80 '] ='00c7 '; 앞으로 ['81'] = '00fc'; 앞으로 ['82 '] ='00e9 '; '00e2'; 앞으로 ['84 '] ='00e4 '; 앞으로 ['85'] = '00e0'; 앞으로 ['86 '] ='00e5 '; 앞으로 ['87'] = '00e7'; 앞으로 ['88 '] ='00ea '; 앞으로 ['89'] = '00eb'; 앞으로 [8a '] ='00e8 ']; = '00ef'; 앞으로 [ '8c'] = '00ee'; 앞으로 [ '8d'] = '00ec'; 앞으로 [ '8e'] = '00c4'; 앞으로 [ '8f'] = '00c5'; 앞으로 ['90 '] ='00c9 '; 앞으로 ['91'] = '00e6'; 앞으로 [ '92'; '00f4'; 앞으로 ['94 '] ='00f6 '; 앞으로 ['95'] = '00f2'; 앞으로 ['96 '] ='00fb '; 앞으로 ['97'] = '00f9'; 앞으로 ['98 '] ='00ff '; 앞으로 ['99'] = '00d6'; 앞으로 [9a '] ='00dc ']; = '00a2'; 앞으로 [ '9c'] = '00a3'; 앞으로 [ '9d'] = '00a5'; 앞으로 [ '9e'] = '20a7'; 앞으로 [ '9f'] = '0192'; 앞으로 [ 'a0'] = '00e1'; 앞으로 [ 'a1'] = '00ed'; 앞으로 [ '' '' ']; = '00fa'; 앞으로 [ 'a4'] = '00f1'; 앞으로 [ 'a5'] = '00d1'; 앞으로 [ 'a6'] = '00aa'; 앞으로 [ 'a7'] = '00ba'; 앞으로 [ 'a8'] = 'a9'] = '2310'; 앞으로 [AA '] =' ']' ']. '00bd'; 앞으로 [ 'ac'] = '00bc'; 앞으로 [ 'ad'] = '00a1'; 앞으로 [ 'ae'] = '00ab'; 앞으로 [ 'af'] = '00bb'; 앞으로 [ 'b0'] = '2591'; 앞으로 [ 'b1'] = '2592'; 앞으로 [ 'b2'] = 2593 '; '2502'; 앞으로 [ 'b4'] = '2524'; 앞으로 [ 'b5'] = '2561'; 앞으로 [ 'b6'] = '2562'; 앞으로 [ 'b7'] = '2556'; 앞으로 [ 'b8'] = '2555'; 앞으로 [ 'b9'] = '2563'; 앞으로 [ 'ba'] = '2551'; '2557'; 앞으로 [ 'bc'] = '255d'; 앞으로 [ 'bd'] = '255c'; 앞으로 [ 'be'] = '255b'; 앞으로 [ 'bf'] = '2510'; 앞으로 [ 'c0'] = '2514'; 앞으로 [ 'c1'] = '2534'; 앞으로 [ 'c2'] = '252c'; '251c'; 앞으로 [ 'c4'] = '2500'; 앞으로 [ 'c5'] = '253c'; 앞으로 [ 'c6'] = '255e'; 앞으로 [ 'c7'] = '255f'; 앞으로 [ 'c8'] = '255a'; 앞으로 [ 'c9'] = '2554'; 앞으로 [ 'ca'] = '2569'; '2566'; 앞으로 [ 'cc'] = '2560'; 앞으로 [ 'cd'] = '2550'; 앞으로 [ 'ce'] = '256c'; 앞으로 [ 'cf'] = '2567'; 앞으로 [ 'd0'] = '2568'; 앞으로 [ 'd1'] = '2564'; 앞으로 [ 'd2'] = '2565'; '2559'; 앞으로 [ 'd4'] = '2558'; 앞으로 [ 'd5'] = '2552'; 앞으로 [ 'd6'] = '2553'; 앞으로 [ 'd7'] = '256b'; 앞으로 [ 'd8'] = '256a'; 앞으로 [ 'd9'] = '2518'; 앞으로 [ 'da'] = '250c'; '2588'; 앞으로 [ 'dc'] = '2584'; 앞으로 [ 'dd'] = '258c'; 앞으로 [ 'de'] = '2590'; 앞으로 [ 'df'] = '2580'; 앞으로 [ 'e0'] = '03b1'; 앞으로 [ 'e1'] = '00df'; 앞으로 [ 'e2'] = 0393 '; '03c0'; 앞으로 [ 'e4'] = '03a3'; 앞으로 [ 'e5'] = '03c3'; 앞으로 [ 'e6'] = '00b5'; 앞으로 [ 'e7'] = '03c4'; 앞으로 [ 'e8'] = '03a6'; 앞으로 [ 'e9'] = '0398'; 앞으로 [03a9 ']; '03b4'; 앞으로 [ 'ec'] = '221e'; 앞으로 [ 'ed'] = '03c6'; 앞으로 [ 'ee'] = '03b5'; 앞으로 [ 'ef'] = '2229'; 앞으로 [ 'f0'] = '2261'; 앞으로 [ 'f1'] = '00b1'; 앞으로 [ 'f2'] = ''f2 '] = 2265'; '2264'; 앞으로 [ 'f4'] = '2320'; 앞으로 [ 'f5'] = '2321'; 앞으로 [ 'f6'] = '00f7'; 앞으로 [ 'f7'] = '2248'; 앞으로 [ 'f8'] = '00b0'; 앞으로 [ 'f9'] = '2219'; 앞으로 [fb '] =' '] 00b7'; '221a'; 앞으로 [ 'fc'] = '207f'; 앞으로 [ 'fd'] = '00b2'; 앞으로 [ 'fe'] = '25a0'; 앞으로 [ 'ff'] = '00a0'; 뒤로 [ 'c7'] = '80'; 후진 [ 'fc'= '81'; 뒤로 [ 'e9'] = 82 '; 82'; '83'; 뒤로 [ 'e4'] = '84'; 뒤로 [ 'e0'] = '85'; 뒤로 [ 'e5'] = '86'; 뒤로 [ 'e7'] = '87'; 뒤로 [ 'ea'] = '88'; 뒤로 [ 'eb'] = '89'; 후진 [ 'e8'] = '8a'; '8b'; 뒤로 [ 'ee'] = '8c'; 뒤로 [ 'ec'] = '8d'; 뒤로 [ 'c4'] = '8e'; 뒤로 [ 'c5'] = '8f'; 뒤로 [ 'c9'] = '90'; 뒤로 [ 'e6'] = '91'; 뒤로 [ 'c6'] = 92 '; 뒤로 ['c6 '] ='92 '; '93'; 뒤로 [ 'f6'] = '94'; 뒤로 [ 'f2'] = '95'; 뒤로 [ 'fb'] = '96'; 뒤로 [ 'f9'] = '97'; 뒤로 [ 'ff'] = '98'; 뒤로 [ 'd6'] = '99'; 뒤로 [ 'dc'] = 9a '; '9b'; 뒤로 [ 'a3'] = '9c'; 뒤로 [ 'a5'] = '9d'; 뒤로 [ '20a7'] = '9e'; 뒤로 [ '192'] = '9f'; 뒤로 [ 'e1'] = 'a0'; 뒤로 [ 'ed'] 'a1'; 뒤로 [ 'f3'] = '뒷면 ['f3 '=]. 'a3'; 뒤로 [ 'f1'] = 'a4'; 뒤로 [ 'd1'] = 'a5'; 뒤로 [ 'aa'] = 'a6'; 뒤로 [ 'ba'] = 'a7'; 뒤로 [ 'bf'] = 'a8'; 후진 [ '2310'] = 'a9'; 뒤로 [ 'bf'] = 'aa'; 뒤로 [ 'bf'] = 'aa'; 'ab'; 뒤로 [ 'bc'] = 'ac'; 뒤로 [ 'a1'] = 'ad'; 뒤로 [ 'ab'] = 'ae'; 뒤로 [ 'bb'] = 'af'; 뒤로 [ '2591'] = 'b0'; 뒤로 [ '2592'] = 'b1'; 후진 [ '2593'] = 'b2'; 'b3'; 뒤로 [ '2524'] = 'b4'; 뒤로 [ '2561'] = 'b5'; 뒤로 [ '2562'] = 'b6'; 뒤로 [ '2556'] = 'b7'; 뒤로 [ '2555'] = '2563'= 'b9'; 후진 [2551 ']. 'ba'; 뒤로 [ '2557'] = 'bb'; 뒤로 [ '255d'] = 'bc'; 뒤로 [ '255c'] = 'bd'; 뒤로 [ '255b'] = 'be'; 뒤로 [ '2510'] = 'bf'; 후진 [ '2514'] = 'c0'; 뒤로 [2534 ']'2534 '; 'c2'; 뒤로 [ '251c'] = 'c3'; 뒤로 [ '2500'] = 'c4'; 뒤로 [ '253c'] = 'c5'; 뒤로 [ '255e'] = 'c6'; 뒤로 [ '255f'] = 'c7'; 후진 [ '255a'] = 'c8'; 후진 [2554 '; = 'ca'; 뒤로 [ '2566'] = 'cb'; 뒤로 [ '2560'] = 'cc'; 뒤로 [ '2550'] = 'cd'; 뒤로 [ '256c'] = 'ce'; 뒤로 [ '2567'] = 'cf'; 후진 [ '2568'] = 'd0'; 뒤로 [2564 '] ='256 ']]'d1 '[2564']. 'd2'; 뒤로 [ '2559'] = 'd3'; 뒤로 [ '2558'] = 'd4'; 뒤로 [ '2552'] = 'd5'; 뒤로 [ '2553'] = 'd6'; 뒤로 [ '256b'] = 'd7'; 뒤 [ '256a'] = 'd8'; 후진 [2518 ']. 'd9'; 뒤로 [ '250c'] = 'da'; 뒤로 [ '2588'] = 'db'; 뒤로 [ '2584'] = 'dc'; 뒤로 [ '258c'] = 'dd'; 뒤로 [ '2590'] = 'de'; 후진 [ '2580'] = 'df'; 후진 [ '3b1']]]. 'e1'; 뒤로 [ '393'] = 'e2'; 뒤로 [ '3c0'] = 'e3'; 뒤로 [ '3a3'] = 'e4'; 뒤로 [ '3c3'] = 'e5'; 뒤로 [ 'b5'] = 'e6'; 뒤로 [ '3c4'] = 'e7'; 뒤로 [3a6 '; = 'e9'; 뒤로 [ '3a9'] = 'ea'; 뒤로 [ '3b4'] = 'eb'; 뒤로 [ '221e'] = 'ec'; 뒤로 [ '3c6'] = 'ed'; 뒤로 [ '3b5'] = 'ee'; 후진 ['2229 '] ='ef '; 후진 [2261'] = 'f0' '; 'f1'; 뒤로 [ '2265'] = 'f2'; 뒤로 [ '2264'] = 'f3'; 뒤로 [ '2320'] = 'f4'; 뒤로 [ '2321'] = 'f5'; 뒤로 [ 'f7'] = 'f6'; 후진 [ '2248'] = 'f7'; 후진 [ 'b0'] '' ']' ']. 'f9'; 뒤로 [ 'b7'] = 'fa'; 뒤로 [ '221a'] = 'fb'; 뒤로 [ '207f'] = 'fc'; 뒤로 [ 'b2'] = 'fd'; 뒤로 [ '25a0'] = 'fe'; backward [ 'a0'] = 'ff'; var hd = "012456789ABCDEF"; 함수 (d) {var h = hd.Substr (d & 15,1); wscript.createobject ( "adodb.stream"); var binarystream = new ActiveXobject ( "adodb.stream"); // 스트림 유형을 지정 - 우리는 속임수를 띠고 문자열을 얻지 만 'binarybinarystream.type = adtypetext; binarystream.charset ='437 '; // wramebystream.open (); streamBinaryStream.writetext (this.forward437 (what)); // 문자열을 diskbinarystream.savetofile (this.path, adsavecreateoverwrite)에 씁니다. wscript.createObject ( "adodb.stream") var binarystream = new ActiveXobject ( "adodb.stream"); // 스트림 유형을 지정 - 우리는 속임수를 잡고 문자열을 얻지 만 'binarybinarystream.type = adtypetext; binarystream.charset = codepage; // Streambinstream.open (binarystream.charset = codepage); ObjectBinaryStream.loadFromFile (this.path); // 스트림을 열고 객체 VAR에서 BINIAR 'String'을 얻습니다. 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+= stromchar 코드 (cc);} else {h = this.d2h (cc); h = 전방 [ ''+h]; tmp+= string.fromcharCode (this.h2d (h));}} if (tmp! = '' ') {encarray.push (tmp);} // 이 루프 프로그레시브는 // 배열 요소 엔티를 동의합니다. c = 0; c <l; c+= 2) {if (c+1 == l) {ar2.push (acarray [c]);} else {ar2.push ( ''+encarray [c]+encarray [c+1]);}} encarray = ar2; ar2 = new array (); 번호*/this.backward437 = 함수 (Instring) {var encarray = new 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.fromcharc Ode (cc);} else {h = this.d2h (cc); h = 뒤로 [ ''+h]; tmp+= string.fromcharcode (this.h2d (h));}} if (tmp! = '' ') {encarray.push (tmp);} // 이 루프 프로그레시브는 // 배열 요소 엔티를 동의합니다. 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];}}주요 부분은 다음과 같습니다.
this.readall = function () {// 스트림 객체 생성 - ado 2.5가 필요합니다. 또는 ado 2.5 또는 heighter // var binarystream = wscript.createObject ( "adodb.stream") var binarystream = new ActiveXObject ( "adodb.stream"); // speign -binarybinalstream. CodePage; // streamBinaryStream.open (); // 디스크에서 파일 데이터를 객체를 스트리밍하기 위해 파일 데이터를로드하십시오.다음은 "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 ( "//") (xmlhttp.status == 200) {var str = xmlhttp.response; alert (str); xmlhttp.abort ();}}}}}바이너리 전송의 경우 "wind 이 두 개의 ActiveX 컨트롤을 지원하는 이진 전송 방법이 있는지 궁금합니다.
튜토리얼에서 6 행은 다음과 같습니다.
xmlhttp.overridemimeType ( 'text // plain; charset = x-user-defined'); // : x-user-defined 브라우저가 반환 된 데이터를 구문 분석하지 말라고 지시합니다.
이 라인을 추가 한 후 브라우저는 백그라운드에서 반환 된 데이터의 인코딩 형식을 구문 분석하지 않습니다. 구체적으로, 전경으로 반환 된 중국어 텍스트는 ""또는 "포트"로 표시됩니다. 저자는 전경의 백엔드에서 전송 된 이진 데이터를 받기 위해 이것을 수행한다고 생각합니다.
실제로 Firefox의 XMLHTTPREQUEST만이 SendAsbinary 방법을 지원합니다. IE 및 Google에서 사용하려면 xmlhttprequest에 프로토 타입 방법을 추가해야합니다.
// XMLHTTPREQUEST의 프로토 타입 XMLHTTPREQUEST.PROTOTYP.SENDASBINGARE = FONTUTE (DATAST) {function byteValue (x) {return X.charcoDeat (0) & 0xff;} var ords = array.prototyp.call (datast, bytevalue); uint8array (ords); this.send (ui8a.buffer);}여기서 코드를 잘 이해하지 못합니다. 여섯 번째 라인 IE8은이를 지원하지 않으며 일곱 번째 라인 IE9는이를 지원하지 않습니다.
배경은 Java Serverlet을 사용하고 다음은 최종 Java 클래스의 코드입니다.
public String fileUpload (httpservletrequest 요청)는 ioexception {request.setcharacterencoding ( "utf-8"); bufferedInputStream fileIn = new bufferedInputStream (request.getInputStream ()); 문자열 fn = request.getParameter ( "filename"); 바이트 [] buf = 새로운 바이트 [1024]; 파일 = 새 파일 ( "d :/" + fn); BufferedOutputStream 파일 아웃 = 새 BufferedOutputStream (새 파일 OutputStream (파일)); try {while (true) {// 데이터 읽기 int bytesin = filein.read (buf, 0, 1024); System.out.println (바이트 신); if (bytesin == -1) {break; } else {fileout.write (buf, 0, bytesin); }} fileout.flush (); return ( "성공 저장");} catch (예외 e) {return "return"저장 실패, 이유 : "+e.tostring ();} 마침내 {fileout.close (); }}위의 것은 JavaScript에서 이진 파일을 읽고 내가 소개 한 Ajax를 사용하여 이진 스트림을 전송하는 방법입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!