WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:ブラウザからファイルをダウンロ

ファイト [WriteDate : Mon May 14 20:12:15 2001]

はじめまして。いつも読ませていただいています。

質問ですが、
「ブラウザからファイルをダウンロードする」ということは、
cgiを使って出来るでしょうか。
ご存じの方いらっしゃいましたら、教えて下さい。
また、その場合どのような方法を採るのか、教えて下さると幸いです。
よろしくお願いします。


ちゃいぱ [WriteDate : Mon May 14 20:48:38 2001]

通常、マウスのカーソルをアンカーにオンして、マウスの右クリックで出るメニューでできますよ!


ファイト [WriteDate : Mon May 14 22:54:29 2001]

ちゃいばさん、どうもありがとうございます。
すみません。質問の仕方が悪かったかもしれません。
私が質問したのは、cgiを使って、
フォームからサーバにあるファイルを選択し、
ボタンを押してそれをダウンロードするプログラムを作ることが
可能かどうか、ということだったのです。
ブラウザから、というかフォームからファイルをアップロードする
スクリプトはありますよね。
逆に、ダウンロードさせるcgiスクリプトを書きたいのです。

ご存知の方いらっしゃいましたらご回答よろしくお願い致します。


Nobu3 [MAIL] [URL] [WriteDate : Mon May 14 23:46:24 2001]

普通にファイルを読んで、普通に出力すればいいんでは?
Content-Typeに気をつければ大丈夫でしょう。たぶん。


ふじ [URL] [WriteDate : Tue May 15 02:51:40 2001]

>普通にファイルを読んで、普通に出力すればいいんでは?
IE は自分が知ってる(と認識した)ファイルタイプのものは
(Content-Type 指定を無視して)それなりに表示しようとするので、
Content-Type: octet-stream
などとしてもダウンロードになりません。
Content-Disposition ヘッダでファイル名を指定してやると、ダウンロードの
ダイアログを開いてくれるようです。
# 過去にここで回答した覚えがあるので、検索してみてください。


ふじ [URL] [WriteDate : Tue May 15 02:54:59 2001]

> Content-Type: octet-stream
Content-Type: application/octet-stream
ですね。失礼。


ファイト [WriteDate : Tue May 15 05:45:04 2001]

Nobu3さん、ふじさん、ご回答どうもありがとうございました。

重ね重ね質問してしまいますが、
「普通に出力」する先のファイルは、
どのように指定するのでしょうか・・・。
あと、<form>タグの中で、例えばアップロードの時は
<input type="file">ですが、
ダウンロードの時のinput typeは何になるのでしょうか。


ファイト [WriteDate : Tue May 15 08:29:26 2001]

すみませんでした。
ふじさんの
> # 過去にここで回答した覚えがあるので、検索してみてください。
という文を見落としてしまい、今朝質問してしまいました。
検索して見つかりました。
ヒントを頂いたので、自分で試してみますね。

どうもありがとうございました。


Nobu3 [MAIL] [URL] [WriteDate : Tue May 15 08:36:23 2001]

type=textでいいです。サーバーに要求が伝われば良いので。
>フォームからサーバにあるファイルを選択し、
これだけを見ればselectの方が良いのかもしれません。

当然formのactionはそのCGIにしなければなりません。
methodはgetでもpostでもお好みで。

CGIの質問かと思ったらHTMLの質問だったんですね。


ファイト [WriteDate : Tue May 15 10:06:33 2001]

すみません、一度完了しておきながらまた質問させてください。

Nobu3さん、ありがとうございました。
とりあえず、コピー元のファイルはselectのほうを選択しました。
で、PC側、というかダウンロードする人の側の、
どこのディレクトリの下に置くかというのは、どのようになるのでしょうか。

検索して、
----引用----------------------------------------
print "Content-Type: application/vnd.ms-word\n";
print "Content-Disposition: attachment; filename=test.doc\n\n";

open IN, "< test.doc" or die $!;
binmode IN;
read IN, $buf, -s "test.doc";
print $buf;
close IN;
--------------------------------------
を見つけたのですが、$bufというのはサーバ上ではなく、
見ている側のPCのファイルなのですよね。
その辺がいまいち解らないのですが・・・。

>CGIの質問かと思ったらHTMLの質問だったんですね。
私もcgiの質問のつもりだったのですが、
htmlの質問になっていたようですね。すみませんでした。


安芸川晴海 [MAIL] [URL] [WriteDate : Tue May 15 10:59:46 2001]

いや、サーバー側のファイルでしょう。

Content-Type: application/vnd.ms-word
Content-Disposition: attachment; filename=test.doc

というヘッダをつけて、ファイル"test.doc"の全内容をSTDOUTに出力しているわけですから。
read IN, $buf, -s "test.doc";
で$bufにtest.docからtest.docの大きさ分(bytes)読込んで、次の行で$bufをSTDOUTに出力しているわけで。

ですから、ご相談の件ではformからのsubmitを受けて"test.doc"を適宜置き換えればそのまま使えるでしょう。


ファイト [WriteDate : Tue May 15 11:13:06 2001]

安芸川晴海さん、ありがとうございました。
>いや、サーバー側のファイルでしょう。
その通りでした。私も間違いに気付きました。すみません。

で、テストしてみたのですが、ダウンロードされるファイルが
そのcgiそのものの名前になってしまい、内容もcgiが出力する
htmlだけが書かれていました。

また自分でも原因を少し調べてみます。


Nobu3 [MAIL] [URL] [WriteDate : Tue May 15 11:39:22 2001]

多分、実行環境くらいを書いたほうが良いでしょう。

>内容もcgiが出力するhtmlだけが書かれていました。
これ変です。
CGIが出力しているのは「ファイルの中身」のはず。


ファイト [WriteDate : Tue May 15 13:21:10 2001]

おなじプログラムでWinで実行してみたら、ダウンロードされました。
macだとうまく行かないだけみたいです。
とりあえず、Winでしか使うことはあり得ないので、一段落です。

が、ダウンロードされたファイルの中身が空でした。
元のファイルはCSVファイルです。

    open (BFILE,"$bfile");
    flock(BFILE,1);
    binmode (BFILE);
         print "Content-Type: application/octet-stream; name=\"$sfile\"\n";
        print "Content-Disposition: attachment; filename=$sfile\n\n";

        open IN, "< $sfile" || exit;;
        binmode IN;
        read IN, $sfile, -s "$sfile";
        print $sfile;
        close IN;
    close(BFILE);

どこか、おかしいのでしょうか・・・。
お気付きの点があればよろしくお願いします。


ファイト [WriteDate : Tue May 15 13:54:25 2001]

すみません、その後修正しまして、
    $sfile = "file.csv";
    $bfile = "temp/file.csv";


print "Content-Type: text/plain; name=\"$sfile\"\n";
print "Content-Disposition: attachment; filename=$sfile\n\n";

        open IN, "< $sfile" || exit;
        binmode IN;
        read IN, $bfile, -s "$sfile";
        print $bfile;
        close IN;

のように書き換えたら、
ファイル名だけが書かれたファイルがダウンロードされるようになりました。


ファイト [WriteDate : Tue May 15 14:04:20 2001]

すみません。
下のようにしてCSVファイルのダウンロードに成功しました。

$sfile = "file.csv";
$bfile = "temp/file.csv";

         print "Content-Type: text/plain; name=\"$sfile\"\n";
        print "Content-Disposition: attachment; filename=$sfile\n\n";

        open (BFILE,"$bfile") || exit;
        flock(BFILE,1);
        while (<BFILE>) {
            print "$_";
        }

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]
ChaichanPAPA's World