アプリ版:「スタンプのみでお礼する」機能のリリースについて

IEおよびFireFox環境で動くページを作成しています。(バージョンは現在の最新)
HTMLとJavaScriptのみで作られたページです。

あるサーバにメソッドをコールして、バイナリデータを受け取っているのですが、
受け取ったデータをローカルにファイル保存する事は可能でしょうか?

ダイアログの表示/非表示の有無は問いません。

ご教授、お願い致します。

A 回答 (5件)

>バイナリデータを受け取っている



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

この回答への補足

ご回答ありがとうございます。

すいません、説明不足でした。
データの受け取りはHTTPではなく、SOAPリクエストに対するRPCの返値です。
ヘッダ等受け取らず、バイナリデータそのものを取得しています。

データそのものをJavascriptでファイル保存できればと思ったのですが、
可能なのでしょうか?

補足日時:2007/11/27 14:30
    • good
    • 0

No1が言っているのはサーバが吐いているバイナリを直接保存させる場合の話だね。


もし受け取った後に「保存ボタンを押させて」とかになると無理。

この回答への補足

ご回答ありがとうありがとうございます。

無理ですか・・・。

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

補足日時:2007/11/27 17:04
    • good
    • 0

>勝手に名前をつけて、勝手なディレクトリに保存できれば


これができたらウィルス仕掛け放題。
だからできないようになってるわけで、
リンクをクリックすると「ダウンロードファイルを保存しますか?」のアレしかできないって話。
    • good
    • 0
この回答へのお礼

度々のご回答ありがとうございます。

手段はどうあれ、受け取ったバイナリデータを、
HTMLとJavaScriptの機能のみで保存は不可ということですね。

ブラウザのAPIなどと合わせて実現できないか検討してみます。

お礼日時:2007/11/28 09:26

>ブラウザのAPIなどと合わせて実現



そういうことならIEでVBScriptをつかってみるのも手かと。
もちろんfirefoxでは利用できませんが。

実際、データを保存させたいなら、#1の方法がスタンダードで
一度うけとってからファイルを保存させるという方法に固執する
必要はないと思いますが
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

FireFoxでも似たAPIを発見しましたので、色々調査してみたいと思います。

今回は、サーバ側で動的生成されたデータをクライアント側で保存させたいという目的のため、サーバデータをダウンロードする方法は使えませんでした。(サーバにもデータは保存されていないため)

ご教授ありがとうございました。

お礼日時:2007/11/28 10:28

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;
}
---------------------------------------------
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!