------------------------------------------------------------- [感謝,御詫び] http://not6.blog.shinobi.jp/Search/のhtmlソースを勝手にメモ // Copyleft(c) Ippei // license: Creative Commons // http://www.creativecommons.jp/ ------------------------------------------------------------- [何をしたいか] 適当なファイル(私が想定したのはcomファイル)をページ上で作って ダウンロードできるようにしたい。しかもcgiとかでなくてjsでファ イルを作成させたい。 [対応] Firefox,Opera ------------------------------------------------------------- [概要] データスキームを用いる。ファイルはバイナリになりそうなので、 BASE64に変換し、Dataスキーム(base64)でダウンロードさせる。 [Dataスキーム] data:application/octet-stream,(data) という文字列(スキーム)が(data)というデータを表す。(data)には データの中身を入れる。 もちろんapplication/octet-streamはzipファイルやlzhファイルの mime-typeである。これによってブラウザはダウンロードを開始する。 <a>タグのhref属性やJavaScriptのlocation.hrefなどでこのData スキームにリンクさせればよい。 例えば <a href="data:application/octet-stream,こんちわ。">メッセージをDLする</a> のように。 上の例ではただ「こんちわ。」と書かれたファイルがダウンロード できる。ただし、ファイル名はこちらから指定できないのが欠点。 data:application/octet-stream;base64,(base64-data) という文字列(スキーム)なら(base64-data)の所に、データの中身を BASE64に変換した文字列にすることで、ブラウザが都合のいい時に デコードしてくれる。これならバイナリなデータでも扱える。 [Base64に変換] http://www.onicos.com/staff/iz/amuse/javascript/expert/ を参考すべし。 また、Firefoxに限定するなら、 btoa(raw_string) で、文字列raw_stringをbase64に変換する関数btoaが標準に付いている。 [Dataスキーム(2)] 本初の目的と少しずれるがメモしておく。 Dataスキームで作ったデータを、例えば作った画像データをその場で htmlに表示することができる。 function createGIF(data){ //gifを作るテスト var myData = document.createElement("img"); //タグ名(要素) myData.type = "image/gif"; //データのmime-type myData.src = "data:application/octet-stream;base64,"+data; document.body.appendChild(myData);//例えばdocument.bodyの最後に追加 } createGIF("\ Qk2uAAAAAAAAADYAAAAoAAAABgAAAAYAAAABABgAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\ QID/AP//AP8A/wAAgACAAAAAAP9AgP8A//8A/wD/AACAAIAAAAAA/0CA/wD//wD/AP8AAIAAgAAA\ AAD/QID/AP//AP8A/wAAgACAAAAAAP9AgP8A//8A/wD/AACAAIAAAAAA/0CA/wD//wD/AP8AAIAA\ gAAA"); 6x6の二次色の正方形が表示されたらok。 <img src="example.gif"> っていうファイル名("example.gif")の代わりにdataスキームを書く。 ただ、拡張子がないので、typeでmime-typeを書いておかないとダメぽい。 [.com(機械語)の知識] 当初の目的はcomファイルの製作だった。comファイルは、 アセンブラを16進法にしたものを繋げればよい。 16進法でどうするかは例えばコマンドプロンプト (MS-DOS)を使う。 || >debug || -a 100 || 2C9B:0100 mov bx , feff || 2C9B:0103 || -d 100 || 2C9B:0100 BB FF FE 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ || 2C9B:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 8A 2C ............4.., || - 実際にあなたがkey boardで入力するのは太字の文字 のみなので難しいことは無い。 例えばmov bxというアセンブラで言うニモニックは BBとなる。これをjavascriptでは16進法のBBということで \xbbと打つ。 var a = "\xbb"; これをBASE64にすればよい。 ---------------------------------------------------------- [もっと詳しく] data schemeの仕様(英語) http://www.ietf.org/rfc/rfc2397.txt