CGI-BBS > CGI > Perl > クライアント側からのファイルの受信について


カレッヂ
カレッヂ


質問者 perler  投稿日 5/16(水) 16:13:48
はじめまして。検索していたところこのHPを
発見して分からないところがあるので質問してみることにしました。
よろしくお願いします。m(__)m
クライアント側からファイルをダウンロードをさせたいのですが、
IDとパスワードを入力した人だけにダウンロードさせるようにしたいんです。
単純にファイルにリンクを張るだけではなくて。
ヤフーのメールなどはファイルを添付してみて、それをしようとすると、引数やらなにやらの
パラメータを受け渡して、ちゃんとCGIが起動?したうえで
ファイルの受信が始まってるようなんですが・・。
モジュールがあれば手っ取りはやいんですが、このようなやり方を
ご存知の方いればご教授ください。よろしくお願いします。
回答者 まさ  [削除]  投稿日 5/16(水) 23:37:31
モジュール等使わなくても簡単にできますよ。

ようはIDとPASSの入力を促す画面処理。
そのIDとPASSが正常かどうか処理する部分。
ファイルをダウンロードする部分。

この3つを作ればいいのでは。
IDとPASSが違っている場合の処理も必要なので正確には4つかな。

これらを作るのはそんなに難しくはないと思います。

質問者 perler  [削除]  投稿日 5/16(水) 23:47:37
早速の返答ありがとうございました。
ただ、まだ分からない・・のでもう少々おつきあい
頂ければ幸いです・・m(__)m

>ようはIDとPASSの入力を促す画面処理。
>そのIDとPASSが正常かどうか処理する部分。
>ファイルをダウンロードする部分。

この3つは1つの同じスクリプト内で動く・・ということですよね。
前の2つは分かるのですが、
「ファイルをダウンロードする部分」というのは具体的に
どのように書けばいいのでしょうか?????????
もしかしたら、パールの標準関数の中に、
download("ファイル名");なんていう関数があって、
それを実行するとクライアント側がダウンロードする体制に
なって、自動的にファイルの保存ダイアログボックスなんかが
表示されてダウンロードが実行されるようなら大変ありがたいのですが・・^^;
回答者 まさ  [削除]  投稿日 5/17(木) 13:19:57
そうです。すべてひとつのスクリプトです。

ファイルのダウンロードはそのファイルへの相対(絶対)パスを$urlに入れて、

print "Location: $url\n\n";

でできます。

質問者 perler  [削除]  投稿日 5/17(木) 19:16:41
感動しました・・・・。
なんとそんなやりかたがあったなんて!!!
難しく考えすぎてました・・。
うーん・・目から鱗が落ちたってのはこのことを言うんですね^^;
printですか!^^; 基本中の基本ですね・・^^;;
ホント助かりました。質問BBSに投稿すること自体久々なんですが、
これだけはっきり教わったのも久々の久々といった感じですToT
どうもありがとうございました!m(__)mさっそくその方法を
使わせていただきたいと思います。ほんとありがとうございました^^/
回答者 イチロー  [削除]  投稿日 5/30(水) 11:03:51
print "Location: $url\n\n";
だとファイルのパスがわかってしまい、次回からID、PASSの入力なしに直接ファイルがダウンロード出来てしまいますよね。
クライアント側からはファイルのパスがわからないように、ダウンロードできる方法はないものでしょうか?
ご存知の方がいらっしゃればお教え頂ければと思います。どうぞよろしくお願いします。
回答者 まさ  [削除]  投稿日 5/30(水) 11:35:28
わたしは普段NC4.73を使っていますが、Locationのやり方だとIDとPASSを
入れた後ダウンロードのダイアログが出てきてブラウザー上にはパスは表示されません
けど、IEではそうなるのでしょうか?

もしIEでそうなるのでしたらJavaScriptでURLの欄を表示しないようにすれば行け
るような気がしますけど。

実はわたしも自分のホームページにダウンロードコーナーがあって、それにはIDと
PASSを入力してもらわないとダウンロードできないようにしています。

しかしわたしの場合はIDとPASSが分かっている人ならURL直接入力でDLして
もらっても構わないと思っていますけど、そういう問題ではないのでしょうか?
これなら少なくてもIDとPASSが分からなければ1回もDLすることができません
よね。

回答者 イチロー  [削除]  投稿日 5/30(水) 13:03:00
早速の回答ありがとうございます。

「FlashGet」などのダウンロードを補助してくれるソフトウェアをインストールしているとフルパスがわかってしまいます。
ダウンロードされるファイルのパスがわかるだけならいいのですが、同じディレクトリに保存してあるファイルのパスも推測してダウンロードされる可能性があるので、それを防ぎたいと考えています。

open(TMP,"$url");
print "Content-type: 〜\n\n";
binmode(TMP);
binmode(STDOUT);
print <TMP>;
close(TMP);
※〜の部分はファイルのメディアタイプ

として、直接ファイルを読み込んで転送する方法でも良いかと思ったのですが、保存するファイル名がCGIのファイル名になってしまいます。
クライアント側で保存するファイル名を書き換えてもらえばいいんですが、出来れば最初からファイル名を正しいものにしたいと思っています。
どなたご存知の方いらっしゃいませんでしょうか?
回答者 あけび  [削除]  投稿日 5/30(水) 14:47:09
うちの汎用ダウンローダでは
こうしてます。

print "Content-type: application/octet-stream\n";
printf "Content-Disposition: filename=\"$filename\"\n\n";
  :
  :
回答者 あけび  [削除]  投稿日 5/30(水) 14:52:17
2行目が print ではなく printf になってますが、
単に投稿用に編集した時の見落としです。(^^;
回答者 イチロー  [削除]  投稿日 5/30(水) 15:31:28
なるほど「Content-Disposition」を出力するのですね。
こんなに早く回答を頂けてびっくりです。
あけびさん、ありがとうございました。助かりました。
質問者 perler  [削除]  投稿日 5/30(水) 18:24:48
元質問者のものです。
実はイチローさんと同じ考えで詰まってました・・^^;;
ロケーションでもいいとは思ったんですが、
完璧に謎が解けました^o^//
ありがとうございました!!!!!!!!!!

返信(回答)する


Web裏技