• ベストアンサー

JavaScriptでファイルの保存

IEおよびFireFox環境で動くページを作成しています。(バージョンは現在の最新) HTMLとJavaScriptのみで作られたページです。 あるサーバにメソッドをコールして、バイナリデータを受け取っているのですが、 受け取ったデータをローカルにファイル保存する事は可能でしょうか? ダイアログの表示/非表示の有無は問いません。 ご教授、お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.3

>勝手に名前をつけて、勝手なディレクトリに保存できれば これができたらウィルス仕掛け放題。 だからできないようになってるわけで、 リンクをクリックすると「ダウンロードファイルを保存しますか?」のアレしかできないって話。

mozori01
質問者

お礼

度々のご回答ありがとうございます。 手段はどうあれ、受け取ったバイナリデータを、 HTMLとJavaScriptの機能のみで保存は不可ということですね。 ブラウザのAPIなどと合わせて実現できないか検討してみます。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.5

VBScriptの話が出てますが、 ファイル環境(file://~、c:\~)で実行した場合、 FileSystemObjectが利用でき、好きな場所に保存可能です。 (ActiveXの確認ダイアログは出ると思います。) しかし、サーバ環境(http://~)で実行した場合は、 FileSystemObjectは使えません。エラーになります。 VBScriptでもファイルに直に保存する事は出来ません。 これも、セキュリティ上の制限だと思います。 ------------------------------------------------- セキュリティ上の理由で、ブラウザから直に保存する方法は、 如何なる方法でも、存在しないのではないでしょうか? エコーサーバ的な物を用意して、保存するのが簡単だと思います。 CGIが利用できるサーバが有れば簡単に実現できます。 ------------------------------------------------- サンプル JavaScriptで作成したバイナリデータを、ファイルに保存します。 (サーバのCGI経由でダウンロードして保存) HTMLでは、バイナリデータをエンコードし、CGIへPOST。 CGIでは、受け取ったデータをデコードし、バイナリデータとして返す。 結果、ダウンロードの画面が開き、ユーザが保存場所を指定して、 保存できます。 sample.html --------------------------------------------- <html> <head> <script type="text/javascript"> <!-- function test(){ //テストデータの作成(0~255の256バイトのデータ) //テキストにエンコードしておきます。 var dat = ""; for(var i = 0; i < 256; i++){ if(i < 16) dat += "%0" + i.toString(16); else dat += "%" + i.toString(16); } //Form作成 var f = document.createElement("form"); document.body.appendChild(f); f.action = "http://localhost/cgi-bin/echo.cgi"; f.method = "POST"; f.target = "_blank"; //Input作成 var inp = document.createElement("input"); f.appendChild(inp); inp.name = "data" inp.value = dat; //送信 f.submit(); } //--> </script> <title>保存テスト</title> </head> <body> <a href="javascript:test();void(0);">test実行</a> </body> </html> --------------------------------------------- echo.cgi(perl) --------------------------------------------- #!/usr/local/bin/perl binmode(STDIN); binmode(STDOUT); %arg = &read_argv(); $dat = $arg{'data'}; $dat = &url_decode($dat); $len = length($dat); $fname = "test.dat"; print "Content-Type:application/octet-stream\n"; print "Content-Disposition: attachment; filename=\"$fname\"\n"; print "Content-Length:$len\n"; print "\n"; print $dat; exit; sub read_argv(){ my($buf,@pair,%argv,$key,$value); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } @pair = split(/&/, $buf); foreach (@pair) { ($key,$value) = split(/=/,$_); $argv{&url_decode($key)} = &url_decode($value); } return %argv; } sub url_decode(){ my($data) = shift; $data =~ s/\+/ /g; $data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2",$1)/eg; return $data; } ---------------------------------------------

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>ブラウザのAPIなどと合わせて実現 そういうことならIEでVBScriptをつかってみるのも手かと。 もちろんfirefoxでは利用できませんが。 実際、データを保存させたいなら、#1の方法がスタンダードで 一度うけとってからファイルを保存させるという方法に固執する 必要はないと思いますが

mozori01
質問者

お礼

ご回答ありがとうございます。 FireFoxでも似たAPIを発見しましたので、色々調査してみたいと思います。 今回は、サーバ側で動的生成されたデータをクライアント側で保存させたいという目的のため、サーバデータをダウンロードする方法は使えませんでした。(サーバにもデータは保存されていないため) ご教授ありがとうございました。

すると、全ての回答が全文表示されます。
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

No1が言っているのはサーバが吐いているバイナリを直接保存させる場合の話だね。 もし受け取った後に「保存ボタンを押させて」とかになると無理。

mozori01
質問者

補足

ご回答ありがとうありがとうございます。 無理ですか・・・。 保存ボタンなどを押させる必要はないのですが、 受け取ったバイトデータ(ヘッダなどの情報なし)を、 勝手に名前をつけて、勝手なディレクトリに保存できればと思ってます。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>バイナリデータを受け取っている サーバー側でhttpのヘッダーでContent-typeを吐き出してやれば ダイアログがでるとおもいますよ。 (javascriptの機能ではありません)

mozori01
質問者

補足

ご回答ありがとうございます。 すいません、説明不足でした。 データの受け取りはHTTPではなく、SOAPリクエストに対するRPCの返値です。 ヘッダ等受け取らず、バイナリデータそのものを取得しています。 データそのものをJavascriptでファイル保存できればと思ったのですが、 可能なのでしょうか?

すると、全ての回答が全文表示されます。