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