• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:wmvファイルを保存するダイヤログを表示する)

JavaScriptを使用してwmvファイルを保存するダイヤログを表示する方法

このQ&Aのポイント
  • JavaScriptを使用してメディアプレイヤーを起動させずにwmvファイルを保存するダイヤログを表示する方法を解説します。
  • showModalDialogを使用するとJavaScriptを使用してダイヤログウィンドウを開くことができますが、直接指定すると真っ白いウィンドウが開き、何も反応しません。
  • JavaScriptを使用してメディアプレイヤーを起動せずにファイルを保存するダイヤログを表示することは可能です。

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

  • ベストアンサー
  • taseki
  • ベストアンサー率66% (155/233)
回答No.9

> Ano.4のCGIのソースを教えていただくという > ことはできないでしょうか? 本当に簡単な実験用にすぎないので、教えると言うほど大したものではないですが…。 以下がperlのソースです。ちなみに動かしたのはCGIではありません。 使い方は、まずページには以下のように書いておきます。 <a href="dl.cgi?http://~/xxx.wmv">WMVをダウンロード</a> 目的ファイルのURLをパラメーターで受け取って、HEADを調べ、 ●目的ファイルがバイナリなら、そのURLにジャンプさせて終了(何もする必要がないので)、 ●それ以外なら、ヘッダをバイナリ指定に変えてユーザーにデータを渡す、 という動作です。 つまり、WMVファイルに限らずHTMLやTEXTや画像ファイルなど…どんなファイルでも、すべてダウンロードダイアログを表示させます。 なお、あくまでも実験用に作ったもので、実用には、エラーチェック、バイナリファイルかどうかチェック、などの部分が十分でないと思います。 VBへの移植も同じ流れでいいと思います。InetやBASP21にあたるのがLWP::Simpleです。 「LWP::Simple」で検索すると、何をしているか、より解ると思います。 -------------- use LWP::Simple; $url = $ENV{'QUERY_STRING'}; $mime = (head($url))[0]; if ($mime eq 'application/octet-stream' || $mime eq 'application/zip') { print "Location: $url\n\n"; exit; } $dl_file = ($url =~ m|/([^/]+)$|) ? $1 : 'file.dat'; binmode STDOUT; print "Content-type: application/octet-stream\n"; print qq|Content-Disposition: attachment; filename="$dl_file"\n\n|; print get($url);

Rubellite
質問者

お礼

ソースのご教授、ありがとうございます! これを参考に、まず基本的な流れ、次にそれぞれの処理の意味を理解して、 ASPに移植してみたいと思います。 今回は本当に色々とありがとうございました!

その他の回答 (9)

  • taseki
  • ベストアンサー率66% (155/233)
回答No.10

ちなみに、VBにこだわらなければ、IISでもperlが使えるので、下のスクリプトをそのまま使う、というのも手の一つですね。 まぁしかし移植することで勉強にはなると思います。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.8

HEADを取得する方法は間違っていませんが、そのデータを取り出す方法が間違っています。 GetChunkメソッドを使いますが、そのページの「同期転送と非同期転送」をよく読むといいと思います。

Rubellite
質問者

お礼

GetChunkメソッドですね。了解しました! このあたりは全く使用したことがないので、自分の理解の範囲を 越えていますが、なんとかがんばって調べてみます。 ありがとうございました!

Rubellite
質問者

補足

誠に恐縮なお願いなのですが、Ano.4のCGIのソースを教えていただくという ことはできないでしょうか? ASPでもCGIでも基本的な流れは同じだという ことは、大変ご丁寧な解説をいただき、十分だとはいえませんが、とても よくわかりました。 色々と何度もご解説いただき、これ以上お手間をお掛けするのも申し訳な いような気がいたしまして、もし差し支えないようでしたら、ご教授いた だきましたCGIのソースを参考に、ASPのスクリプトをサイトや書籍を元に、 後は自分でもっと勉強をして、一から書いてみようと思うのですが。。。 本当に勝手なお願いだとは思いますが、どうぞよろしくお願いいたします。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.7

そうですね、どちらかというとASPよりも、まずはHTTPの基本的な部分を理解してからでなければ、ASPひいてはインターネットで何かをすることすべてで、進めない部分が出てくると思います。 基礎部分だけは、がまんして覚えておかないと、先回りしようとすると結局いきどまりに当たり、後戻りして時間がかかる結果になります。 今回の件では、概要としては大変簡単な流れです。 1.目的のサーバーのファイルの情報を得る 2.得た情報から、必要な付加ヘッダを判別する 3.あわせてユーザーに返す たったこれだけです。 で、1,2,3すべてで、やはりHTTPの知識が必要になります。というより、何しろ今回の「ブラウザにファイル保存ダイアログを出させる」こと自体が、HTTPによるものですから。 動作環境になるASPも、言語になるVBも、それほど難しい部分は必要ありません。 たとえば、通信に使うのはBASP21でもInetでもいいですが、 Set objInet = Server.CreateObject("InetCtls.Inet") としてオブジェクトを作成し、 objInet.Execute URL, "HEAD" などとしてMIME-Typeを取得し、それに応じて「application/octet-stream」や「Content-Disposition: attachment; filename=~」を付加、あとは受信したデータをそのまま出力していく、というような流れになります。 特にANo.5に書いた事柄は核心部分にもなると思うので、できればもう一度よく読んで少なくとも理解できないと、今回の件は実現させるのは難しいと思います。 以上を踏まえておすすめするとしたら、まずHTTPの基礎的な解説などを読んで理解し、次にBASP21またはInetなど実際のコンポーネントについて調べていく、というのが良いかと思います。

Rubellite
質問者

お礼

ご回答ありがとうございます。まずInetコントロールについて調べてみたところ、 http://www.microsoft.com/japan/developer/library/vbcon98/vbconusinginternettransfercontrol.htm のサイトが一応すべて載っているような気がしたので、ここを参考にして、ANo.7の ヘッダーを読み取る、というのを書いてみました。 <% Set objInet = Server.CreateObject("InetCtls.Inet") URL = "http://www.***.co.jp/index.html" objInet.Execute URL, "HEAD" %> これを実行すると、 Inet エラー '800a8ba8' URL が不正です。 と表示されてしまいました(>_<) 一番最後の文を、 objInet.Execute "http://www.***.co.jp/index.html", "HEAD" とすると、エラーは表示されませんが、白紙のページになります。 白紙のページになるのは、受け取ったヘッダー情報を、htmlに表示してやる処理が ないためでしょうか? 受け取ったヘッダーを表示するために、 headerdata=objInet.Execute ("http://www.***.co.jp/index.html", "HEAD") Response.Write headerdata としても、やはり真っ白のままです(>_<)

  • taseki
  • ベストアンサー率66% (155/233)
回答No.6

> >filenameは、デフォルトの保存名です。つまりサーバーのローカルファイ > >ルではなく、「ファイル保存」ダイアログボックスにデフォルトで表示さ > >れるファイル名です。なので不要なら別に付けなくても問題ないです。 > > とのことですが、もし付けなかった場合、どのファイルであるかどうやって > 指定するのでしょうか? 繰り返しになりますが、filenameは、ユーザーが保存するときにデフォルト表示されるだけの保存名なわけです。サーバーが出力するファイル名じゃありません(ANo.5 をお読みください)。 ですから、付けなかった場合はブラウザが適当な名前(たいていはURLのファイル名)を表示して、で、ユーザーがファイル名を決めます。 言ってしまえばfilenameはサーバー上のファイルと全く関係ありません。 ★まずはこの点を理解されていないと、先に進めないかと思いますよ。 次に、ちょっと余談ですが、そのスクリプトはADODB.Streamに一度ファイルを読み込んでから出力してますよね。 もしASP.NETならWriteFileが使えますよ。 直すなら以下のように書くだけです。 Response.ContentType = "audio/x-ms-wma" Response.AddHeader "Content-Disposition", "attachment;filename=***.wma" Response.WriteFile ("D:\***.wma") 次に、 > strFilePath = "http://***.co.jp/***.wma" > > とやっても、ダメでした。 上記ですが、率直に言って、ご自分で書かれたスクリプトを理解されていないのでは…(違ったらすみません)。 前述のように、このスクリプトはADODB.Streamに一度ファイルを読み込んでますよね。そこにURLを指定したところで、意味不明と言いますか…。他サーバーから取得する処理がそっくり抜けています。 見たところVBをお使いのようですが、一番手っ取り早いのはInetコントロールを使うのがいいでしょう。 InetコントロールのHEADで、目的の外部サーバーのファイルのMIME-Typeを調べ、必要に応じてContentTypeやContent-Dispositionを付け、データを取得して出力、不要ならリダイレクトを送る、という流れです。

Rubellite
質問者

お礼

今日は本当に何度も何度も丁寧なご回答を書いてくださいまして、 ありがとうございます。なにぶんASPも独学で学んだところが多く、ASP.NET などにも移行していない、昔の知識のまま止まっております。 そのため、基本が抜けている分、ちょっと技術が進化すると、勉強して調 べようにも、何を手がかりにして良いかわからなくなってしまい、しょっち ゅう難儀しています。今日は、お手間をお掛けいたしまして、本当にすみ ません。 >言ってしまえばfilenameはサーバー上のファイルと全く関係ありません。 >★まずはこの点を理解されていないと、先に進めないかと思いますよ。 まず、この点の理解が一番間違っていたようです。なるほど、あくまでも ダイヤログ上に表示される名称という事で、サーバー上のファイルのこと ではないんですね。 >言いますか…。他サーバーから取得する処理がそっくり抜けています。 この他のサーバーから取得する、というのは先のご回答にありましたように、 自分のサーバーにダウンロードしてきて、という意味ではないんですよね? 根本的にわかってないところが、 http://***.co.jp/***.wmv というアドレスを受けて、どうやってこれに Response.ContentType = "application/octet-stream" Response.AddHeader "Content-Disposition", "attachment;filename=***.wmv" というのをつけて、データーを出力するのかがわかっていないのだと思い ます。 基本中の基本かも知れませんが、一から勉強し直す意味で、何かもうすこし ASPの基本的な処理を理解できるサイトなどはありますでしょうか?

  • taseki
  • ベストアンサー率66% (155/233)
回答No.5

> えっ、CGIではヘッダーを追加するだけでファイルに保存、のダイヤログが > 表示されるのですか?? CGIとかASPとかは関係なく、これはHTTPの仕様です。当然ASPもです。 念のため、誤解のないように説明しますと、そもそも「~を追加するだけでファイルに保存、のダイヤログが~」とおっしゃっている部分、少し勘違いされているかもしれません。 まずそもそも、データを受け取った後のブラウザの動作を決めるのは、ブラウザです。 受け取ったデータがHTMLならそのまま表示、Excelデータなら埋め込み表示、動画や音楽などのデータなら再生ソフトを起動、バイナリデータならファイル保存ダイアログを表示、などなど、各環境に応じてあらかじめ設定された動作をするだけです。 で、どうやってブラウザが、それらの「データの種類」を見分けているかと言うと、受け取ったデータのヘッダに書かれたMIME-Typeを見ています。 言い換えれば、HTTP通信では必ずヘッダを付けることになっている、ということです。 これはCGIやASPなどの環境とは関係なく、HTTPの仕様(RFC)によって決められています。つまりCGIもASPもブラウザも開発者も、RFCのルールに従っている、ということです。 通常、Webサーバーに置いただけのファイルに直接アクセスすると、MIME-Typeはサーバーが自動的に付けてくれます。その付け方の設定を変える、というのを利用したのが、ANo.1に書いたhtaccesやIISの「MIMEの種類」設定を変える案です。 wmvファイルを「バイナリデータ」だということにしてブラウザに送ると、通常ブラウザはファイル保存のダイアログを表示します。それを利用しています。 で、もうひとつの「サーバーにパイプさせる」案は、他サーバーが付けたであろうMIME-Typeを、必要に応じて付け替えてユーザーに渡す、という方法です。 ですから、 > CGIではヘッダーを追加するだけで~ とおっしゃる部分、ASPもヘッダを追加するだけです。というより、ブラウザから見たらCGIだろうがASPだろうが同じ、極端な話、HTMLだろうがwmvだろうがtxtだろうが、とにかくヘッダを見て判断しています。 これはおっしゃるように「Response.ContentType」で指定できますが、「Response.AddHeader」のほう、ちょっと勘違いされていると思いますが、「Content-Dispositon」はデータの形態を示すもので、その意味では間違っていませんが、 > filenameのところが、サーバーのローカルファイルでないとうまくいかな > かったのですね。 filenameは、デフォルトの保存名です。つまりサーバーのローカルファイルではなく、「ファイル保存」ダイアログボックスにデフォルトで表示されるファイル名です。なので不要なら別に付けなくても問題ないです。 そしてちなみに、MIME-Typeに「application/x-unknown」を指定しても問題なさそうですが、バイナリデータという指定は通常「application/octet-stream」だと思います。このほうがおそらく無難だと思いますが、この点は確認が必要かもしれません。

Rubellite
質問者

お礼

MIME-Typeについては、ご指摘の通り「application/octet-stream」で 大丈夫だと思います。 >filenameは、デフォルトの保存名です。つまりサーバーのローカルファイ >ルではなく、「ファイル保存」ダイアログボックスにデフォルトで表示さ >れるファイル名です。なので不要なら別に付けなくても問題ないです。 とのことですが、もし付けなかった場合、どのファイルであるかどうやって 指定するのでしょうか? 以前、 <% Response.Buffer = True Response.Clear Response.ContentType = "audio/x-ms-wma" Response.AddHeader "Content-Disposition", "attachment;filename=***.wma" Const adTypeBinary = 1 Dim strFilePath strFilePath = "D:\***.wma" Set objStream = Server.CreateObject("ADODB.Stream") objStream.Open objStream.Type = adTypeBinary objStream.LoadFromFile strFilePath Response.BinaryWrite objStream.Read objStream.Close Set objStream = Nothing %> といった方法で、サーバーのローカルHDDからのダウンロードはうまく行った わけですが、この後半の部分を違う書き方にすることで、別のサーバーの ファイルにMIME-Typeを指定して、クライアントのブラウザーに送信する、 ということになるのでしょうか? 上記のソースの場合、 strFilePath = "D:\***.wma" を strFilePath = "http://***.co.jp/***.wma" とやっても、ダメでした。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.4

> サーバーにたまっていくファイル どうやら、キャッシュ保存する言わばプロキシサーバーのようなものをお考えのようですが(違っていたらすみません)、私がご提案したのは、もっと単純なもので、ダウンロードダイアログを出させるためにヘッダを付加するだけのものです。 ファイルを貯めこまずに、パイプの役割を果たすだけです。 ★今ためしに私の環境で簡単なものを作ってみましたが、特に問題なくダウンロードダイアログが表示されました。 たとえば「<a href="dl.cgi?url=http://xxx/file.wmv">ダウンロード</a>」とリンクを張る形で、目的ファイルのURLをパラメータで渡します。 他サーバーのファイルを取得する前にHEADだけ取得して、もしヘッダ付加が不要(黙っててもダウンロードダイアログが表示されるタイプのファイル)だったら、そのままリダイレクトして渡すだけ、必要ならヘッドを付けて渡すだけ、という簡単なものです。サーバーのディスクに保存もしません。 とりあえずApache+perlで試したのですが、IIS(ASP)+vbscriptなどでも同様と思います。 上記ではダウンロード完了のタイミングを知る必要はありませんが、ちなみに、 > さすがにユーザーの > ファイルの転送状況を知るためには、専用のダウンロードコントロールを > 開発しないと難しいと思います。 BASP21のOnProgressイベントで知ることができるのでは?(未確認) 下にも書きましたが、上記のご提案は、あくまでも参考までに、javascriptなどでは不可能だった場合、という前提です。 なので、どなたかが良い策を回答してくれれば、それが最善策ですよね。

Rubellite
質問者

お礼

えっ、CGIではヘッダーを追加するだけでファイルに保存、のダイヤログが 表示されるのですか?? 私はASPしか知らないので、非常にお話がもどかしくなってすみません。 ASPでヘッダーを指定してフィイルを送信するというのは、 ―例―ASP―――――――――――――――― Response.ContentType = "application/x-unknown" Response.AddHeader "Content-Disposition", "attachment;filename=***.wmv" ――――――――――――――――――――― という様にする、このヘッダーの事でしょうか? この例の場合、 filenameのところが、サーバーのローカルファイルでないとうまくいかな かったのですね。 それとも、ヘッダーを追加して渡す、という意味を勘違いしてしまっている のでしょうか? 今tasekiさんがお作りになられたCGIの機能があれば十分なのですが、 できればそれをASPつくれれば、JavaScriptでなくても問題はないのですが。。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.3

特にBASP21は必要と言うわけではないと思います。単に他サーバーのファイルを取って来るだけですから。 逆に、もしクライアントにBASP21などのActiveXやプラグインをインストールさせる、という方法なら、それこそファイル保存など自由にできるかもしれませんね(これはやったことはないですが、DownLoadメソッドなど?)。 ただあまり良い方法ではないとは思いますが。 ファイルサイズに応じてダウンロード時間が長くなるのは、これはもう仕方がないと思います。ただ、一般的にWebサーバーの接続環境は余裕を持たせてあるので、ある程度なら可能でしょう(お使いの環境を知りませんし、これは程度の問題なので目的次第の判断でもあると思います)。 > ユーザーがダウンロード完了した > ことをサーバー側でどうやって知るのか これは、すみません、よく解らなかったのですが、知る必要がある理由は何ですか?

Rubellite
質問者

お礼

>これは、すみません、よく解らなかったのですが、知る必要がある理由は >何ですか? ファイルを送信するサーバーにたまっていくファイルを、どのタイミングで 削除していくのか、という事を考えると、できればユーザーがファイルを ダウンロードし終えたタイミングが一番いいのですが、さすがにユーザーの ファイルの転送状況を知るためには、専用のダウンロードコントロールを 開発しないと難しいと思います。 なので、とにかく目的としていることは単純なので、 「メディアプレイヤーを起動させずに、ファイルを保存できるようにしたい」 これだけなのですね。サーバーのローカル内にあるファイルであれば、確 実にファイルに保存、のダイヤログを表示させることが出来るのですが、 外部にあるファイルとなると、ダイヤログ一つの問題なのですが、 なかなかメディアプレイヤーを起動させずにファイルをダウンロードして もらう、というのが難しいのです(>_<)

  • taseki
  • ベストアンサー率66% (155/233)
回答No.2

> Windowsサーバーを使用し、かつIISが稼働している環境下~ お使いの環境では、おっしゃるとおり「MIMEの種類」の設定が、Apacheで言うところのhtaccessにあたります。 ただ、設定するのは「サーバーのプロパティ」とか「サイトのプロパティ」、「HTTPヘッダー」とか、数箇所を設定する必要があったように記憶しています(ちょっと正確には覚えてませんが…)。 > ダウンロードしてもらうファイルが、 > 自社サーバー内にあるとは限らない これは難しそうですね…。 残念ながら私は知りません…。 もしJavaScriptで不可能な場合ですが、「他サーバーのファイルをダウンロードして、それにMIME-Typeを付加してダウンロードさせる」というスクリプトを、自サーバーに設置する、という方法もありますね。 つまりユーザーは、内部的にはAサーバーにアクセス、AサーバーがBサーバーのファイルを取ってきて、MIME-Typeを付加してユーザーに渡す、というイメージです。

Rubellite
質問者

お礼

>「他サーバーのファイルをダウンロードして、それにMIME-Typeを付加して >ダウンロードさせる」というスクリプトを、自サーバーに設置する、という方法 BASP21のコンポーネントを使用すれば、可能な技術になりますね。この場合 二つだけ難点がありまして、対象のファイルが大きいと、それをダウンロード してくるまでに時間が必要となる、のと、ユーザーがダウンロード完了した ことをサーバー側でどうやって知るのか、というのがわからないので、 少し保留にしていました。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.1

showModalDialogというのは、「ダイアログを開く」と言うより「ページをダイアログ・ウィンドウで開く」ためのものです。 なので、そのダイアログに表示されるページ(今回の場合はダウンロードさせる仕組み)を作っておく必要があります。 単純にwmvファイルをダウンロード保存させたいなら、.htaccessファイルを使ってはどうでしょうか。 --------------------------- AddType application/octet-stream wmv --------------------------- という1行を書いて(末尾は改行)、「.htaccess」というファイル名でwmvファイルと同じディレクトリに保存するだけです。 「application/octet-stream wmv」でうまくいかない場合は「application/zip wmv」などためしてみてください。 なお、環境によって.htaccessファイルが使えない場合があります。いずれにしても試してみると分かります。

Rubellite
質問者

お礼

ご回答ありがとうございます。サーバー側で処理する場合は、ASPなどを 使用してファイルを保存する、のダイヤログを表示させることが出来る のですが、今回ご提案いただきました「.htaccess」ファイルは、サーバー 側に置くファイルになりますよね? Windowsサーバーを使用し、かつIISが稼働している環境下でも.htaccess ファイルを使用したやり方はできるのでしょうか? IISには、MIMEの種類 という項目で似たような設定を行うことが出来ますが、残念ながらMIMEの種類 をapplication/octet-streamなどに変更しても、メディアプレイヤーが 起動するのは変わりませんでした。 あと、もっと根本的な問題としまして、ダウンロードしてもらうファイルが、 自社サーバー内にあるとは限らないということがあります。

関連するQ&A