教えて下さい。

以下のような事がやりたいです。

windows up dataのように複数あるファイルから任意のファイルを
クライアントに選択してもらい、それをダウンロードさせる。
(リンクを張るのではなく)

当方の環境は、UNIX系OS、Apache、perlです。
JAVAは使った事がありません。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

Windows Update以外でも、ブラウザからファイルをダウンロードしたことはありますよね?あんな感じで、ファイルを開くか、ファイルをコンピュータン保存するか選択してください、というダイアログボックスがでて、保存を選ぶと保存先を選択するようにするやつです。

Windows Updateみたいなのではなく、普通のファイルダウンロードの保存中見たいなバーは出ますけど。

zipファイルの場合はタイプをx-zipにしてみてください。

例えばファイル名がarchive.zipで、ディレクトリの/home/httpd/html/filesにある場合は:

$filename = 'archive.zip';
$file = "/home/httpd/html/files/$filename";
$filetype = 'x-zip';

print "Content-Disposition: attachment; filename=\"$filename\"\n";
print "Content-type: application/$filetype\n\n";


open (FILE, "$file"); #実際はオープン失敗したときのエラー処理をつける。
while (<FILE>) {
print "$_";
}
close FILE;

こんな感じです。
    • good
    • 0
この回答へのお礼

ありがとうございます!
上記の方法でやれそうです。

また何かありましたら宜しくお願いいたします。

お礼日時:2002/03/17 11:57

おや、#3の方、サポートありがとうございます。


Parlは触れたことすらないので助かりました。

結構PHP似ているというのは本当ですね。
結構分かりやすいかも。。。

#3の方のやり方ができるなら、コレを応用してできませんか?
フォームで受け取ったファイル名を配列にでも入れておいて、ファイル名を配列から順に$filenameに入れていけば・・・。
たぶん、送信終了してから次のファイル転送を始めるという管理ができるかどうかがポイントだと思いますよ。

私がやるとしたら、

>$filename = 'archive.zip';
>$file = "/home/httpd/html/files/$filename";
>$filetype = 'x-zip';

>print "Content-Disposition: attachment; filename=\"$filename\"\n";
>print "Content-type: application/$filetype\n\n";

>open (FILE, "$file"); #実際はオープン失敗したときのエラー処理をつける。
>while (<FILE>) {
>print "$_";
>}
>close FILE;

この文に入る前にやっておくことは「フォームで受け取ったファイル名を、配列に入れておく」→「ファイル数を把握」です。
その後、上記の文を繰り返し文でくくります。
条件は、「ファイル数よりも繰り返し変数が小さい場合は繰り返す」で。
もしかしたら、もう少しスマートな方法があるかもしれませんね。

関数などが分からないので、言葉で書きましたが、通じたでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
とてもわかりやすいです。

こういう処理を行った場合、クライアント側へのダウンロードが終了するまでは、このプロセスは残りそうですね。
現役を引退したPCを使用しているのでapacheの設定で接続数を限定して運用しよう
と思います。
どうもありがとうございました。

お礼日時:2002/03/17 12:01

こんにちは。


WindowsではActiveXを使って既にインストールされているソフトの情況やら、インストールまでやらせているようですけど、そこまではPerlではできないですよね。。
せいぜい出きるのはクライアントが選択したファイルをPerlでオープンして、適当なヘッダを付けてブラウザに向けてprintさせてやる問い方法でですが、私がいつも使うヘッダは:

print "Content-Disposition: attachment; filename=\"$file\"\n";
print "Content-type: application/$c_type\n\n";

$file はファイル名、$c_type はexeファイルは "x-exe" だったりします。
一応、WindowとMacで動作確認はとれてます。

複数ダウンロードさせるにはファイルのリストを作っておいて、foreachでopenをループさせればできたと思います。

ヘッダに関してはあまり詳しくないので、もっとしっかりした知識をおもちの方、ヘルプお願いします。というか、私のはあっちこっちのスクリプトからもってきたもので、ちゃんと動いたものを使ってますので、本当のルールをご存知の方、ぜひ教えてください。(ひとの質問のところで厚かましい?)
    • good
    • 0
この回答へのお礼

ありがとうございます。
openを使用した場合、クライアント側では"ファイルの保存中です"など、windows up date のような感じでダウンロード可能でしょうか?
複数の選択されたファイルをzipで圧縮してそれをsubmitを契機にダウンロードさせたいです。zipファイルを指定しopenを使用すればダウンロードされるのでしょうか?
質問ばかりで申し訳ありません。
もう少し教えてください。

お礼日時:2002/03/16 20:05

チェックボックスを使って選択されたものをまとめてダウンロードとかする方法をとってみては?


ただ、そのままインストールするのであえば勝手は違ってきますが。

それとParlご使用とのことですが、結構使われていますか?
これから勉強するとか、かなり使っているというなら、PHPもいいですよ。
Apacheで使えるし、CGIよりも高速です。
PostgreSQLやMySQLなどのオープンソースのデータベースとの連携もスムーズです。
もともと簡単だけど、CやParlの形式に似ているから、経験者ならなおさら簡単に感じるかも。
気が向いたら調べてみてください。
http://www.php.gr.jp/
    • good
    • 0
この回答へのお礼

ありがとうございます。
"チェックボックスを使って選択されたものをまとめてダウンロード"これです!
これがやりたいのですが、ファイル名の取得まではなんとかできるのですが、そのファイルをクライアントへ送信(ftpではなくhttpで)する方法がわかりません。
もう少しアドバイスお願いいたします。

お礼日時:2002/03/16 19:51

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

このQ&Aと関連する良く見られている質問

QUNIXっぽくCUIでPerlをWindowsで

ちょっとすごいタイトルになってしまいましたが、
今読んでいる書籍が、UNIXのコマンドラインを使用してのPerlの解説がされている本なので、
それをWindowsでも同じようにコマンドを打っていくだけで体感できないかと思っているのですが、
無理でしょうか?

コマンドプロンプトを使って、perlの処理をあれこれと試すことはできますでしょうか?

Win32 GNUというシェルがウィンドウズにも存在するとのことですが、これをいれればperlをコマンドラインで実現できるのでしょうか?

そもそもCUIじゃないと、
#!/usr/local/bin/perl -w
というエラーチェックのwを記述しても意味がない気がするのですが、どうなのでしょう。

アドバイスお願いします。

Aベストアンサー

Perlに関して、Unixのコマンドラインでできることは、Windowsのコマンドラインでもできます。
perl test.pl 引数1 引数2 ...
とやれば、test.plが実行されるでしょう。.plや.cgiがActivePerlに関連づけられていれば、
test.pl 引数1 引数2 ...
とやるだけで、実行されるでしょう。
とにかくWindowsのコマンドラインで一度使ってみてください。そして、どのように使って、どういう結果(エラー?)になったか教えてください。

ちなみに、Unix上でCGIの動きを確認する際も、同じようにブラウザからテストするのが普通だと思います。そうでなければ、CGIの実行に必要な環境変数をセットするようなシェルスクリプトでも作って、コマンドラインでテストするんじゃないかな。Windowsでも同じようにできますよ。

QPerlでファイル書き込みの際の不思議

WEB上でPerlCGIを稼働し、ファイル(file.dat)からデータを読み込み、
@line=(0001,0002,0003) とします。
このときファイルの中身は
0001
0002
0003
という風に改行されています。

そして、@lineをいろいろ操作し、最終的に
@newline=(0001,0003) とし、 (実際には各要素には改行がついています)
これを

open(OUT,">file.dat")
print OUT @newline;
close (OUT);

と言う風に書き込み処理しました。
すると、ファイルの中身はなぜか
0001
0003
0001
0002
0003
もしくは
0001
0003
00001
0001
0002
0003
となってしまいます。(この違いはいろいろ試しているうちに発生しました)
もちろん上書きオープンです。
試しに @newline を空にして書き込むとファイルは空になりました。

どう試してみても、新しいデータと古いデータが書き込まれてしまうのです。
場合によっては心当たりの無いデータまで・・・

書き込みの前後で@newlineを画面表示してみましたが、
書き込みの前も後も問題なく表示されています。
つまり、書き込まれたデータだけが異常なのです。

今まで、データの更新→書き込み というのを
いろいろやってきましたが、このような現象は初めてです。

原因として考えられることを教えてください。
よろしくお願いします。

WEB上でPerlCGIを稼働し、ファイル(file.dat)からデータを読み込み、
@line=(0001,0002,0003) とします。
このときファイルの中身は
0001
0002
0003
という風に改行されています。

そして、@lineをいろいろ操作し、最終的に
@newline=(0001,0003) とし、 (実際には各要素には改行がついています)
これを

open(OUT,">file.dat")
print OUT @newline;
close (OUT);

と言う風に書き込み処理しました。
すると、ファイルの中身はなぜか
0001
0003
0001
0002
0003
もしくは
0001
00...続きを読む

Aベストアンサー

これだとどうでしょうか?(確証はなくてすみませんが)

@newline = ("0001\n","0003\n");

$string_length = 0;
foreach $num (@newline)
{
$string_length += length ($num);
}


open (OUT,">file.dat");
seek (OUT,$string_length,0);
print OUT @newline;
close (OUT);

Qperl使用のCGIでのデータファイルの取り扱いについて

こんにちは、
perlでCGIを動かしているんですが
掲示板やアクセスログなどのデータファイルの置き場所についてこまっています
perlのopen関数などでファイルを開くことはできても、直接URLを指定すれば
見ることができてしまいまます。
内部の実行からは読み書きできて、直接URLを指定したら、アクセス拒否にする
というパーミッションの設定or.htaccessなどの設定方法があれば教えてください。

Aベストアンサー

えっと、パーミッションは 606 で良いはずです。

一般的な場合として apache を見ますと、apache は各プロセスを指定のユーザ
権限で実行します。nobody や www といった名前を持つものだったりしますが
これは、一般のユーザではないです。で、660 がいけない理由ですが、
CGIの実行権限はステッキービットなどがセットされない限りは other 権限。
つまり最後の部分です。よって、 705 のCGIファイルを実行すると 660 ファイルは
読み込めません。other 権限では パーミッションは 0 であるからです。

でぇ、アクセスの制限で一般的なのは、プロバのユーザの場合、
public_html のような公開用ディレクトリと同じ位置に置けば(普通はpublic_html以下)、
アクセスできません。(CGIからは覗けます。)

.htaccess も良い方法です。設定例も結構あるので検索すれば普通に出ますよね。

QApachでCGI(Perlスクリプト使用)を動かすときに先頭の#!に関係なく実行できるようにするには。

ApachでCGI(Perlスクリプト使用)を動かすときに先頭の#!のPerlを動かす場所(?)を指定する行が無かった場合や、違う場合でも、Apachが勝手にperlの場所を解釈しスクリプトを実行してくれるようになるhttpd.confの設定方法ってありますか?

Aベストアンサー

> CGI(Perl使用)の部分もあるので、ローカルで実際に動かしてからサーバにアップしています。
> ローカルでの実行環境がApach(for win32)+ActivePerlで、サーバにアップするときにわざわざ#!部分を変更しなければなりません。それが少々めんどくさいので
> 質問したわけであります。

発想の転換をしてみてください。
要するに「she-bang 書き換えが面倒くさい」だけなんですよね?

Apache に依存させるのではなく、ActivePerl を入れなおして、ディレクトリをあわせてみてはいかがでしょうか。
ActivePerl をインストールする際に、例えばサーバ側が
/usr/bin/perl
だった場合、
c:\usr
フォルダを作っておいて、インストール先を c:\usr にしておけば、perl インタプリタの実行ファイルが c:\usr\bin\perl.exe になります。
she-bang を #!c:\usr\bin\perl とすればいいのは勿論なんですが、Apache を介せば、UNIX 表記でも問題ないので、#!/usr/bin/perl と記述することが可能です。当然それなら、いちいち書き換えなくても、サーバ側でそのまま利用することが可能です。

コツとしては、perl のパスの bin ディレクトリの上位まで、Windows 上に作っておいて、インストール先として、そこまで指定します。

/usr/local/bin/perl としたい場合は、c:\usr\local フォルダを作っておいて、インストール先として c:\usr\local を指定すれば、自然と bin ディレクトリが作られ、その中に perl.exe がインストールされます。
で、CGI として使用したいファイルの先頭を
#!/usr/local/bin/perl とすれば、サーバでも Win 環境でも共用できる she-bang が書けますので、そういうことを気にしなくてもいいと思います。
私はかれこれ 3 年間、この方法を使ってます。

> CGI(Perl使用)の部分もあるので、ローカルで実際に動かしてからサーバにアップしています。
> ローカルでの実行環境がApach(for win32)+ActivePerlで、サーバにアップするときにわざわざ#!部分を変更しなければなりません。それが少々めんどくさいので
> 質問したわけであります。

発想の転換をしてみてください。
要するに「she-bang 書き換えが面倒くさい」だけなんですよね?

Apache に依存させるのではなく、ActivePerl を入れなおして、ディレクトリをあわせてみてはいかがでしょうか。
A...続きを読む

QPerlのCGIでフォームのテキスト配列をPerlで取得するには?

フォームで通常は同じ名前のデータを取得することは無いのですが
表計算のように同じ名前の場合、データの取り出し方がわかりません。
以下、通常の1件の場合のソースです。


#!/usr/bin/perl

$| = 1;

use strict;
our %in;

use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
require 'jcode.pl';
require 'cgi-lib.pl';
#

#-----分岐-----

&ReadParse;

# 配列でない場合
my $namae = $in{'namae'}
print "$namaeで名前が1件表示される";
# これをフォームで namaeが配列になった場合、
#<input type="text" name ="namae">
#<input type="text" name ="namae">
#<input type="text" name ="namae">
# のような場合、3件取得する場合

exit;

__END__

フォームで通常は同じ名前のデータを取得することは無いのですが
表計算のように同じ名前の場合、データの取り出し方がわかりません。
以下、通常の1件の場合のソースです。


#!/usr/bin/perl

$| = 1;

use strict;
our %in;

use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
require 'jcode.pl';
require 'cgi-lib.pl';
#

#-----分岐-----

&ReadParse;

# 配列でない場合
my $namae = $in{'namae'}
print "$namaeで名前が1件表示される";
# これをフォームで namaeが...続きを読む

Aベストアンサー

パラメータのデコード処理で使用するモジュールによって、やり方は変わってきますが、cgi-lib.pl と CGI.pm の場合は下記のようになります。

cgi-lib.pl :
 対象のパラメータが収納された変数を \0 を区切り文字として分割する。

CGI.pm :
 リストコンテキストで値を受け取る。


例) cgi-lib.plを使う場合 ----------------------------
require "cgi-lib.pl";

&ReadParth; # デコード処理
@hoge = split(/\0/, $in{hoge}); # \0 で分割
------------------------------------------------

例) CGI.pmを使う場合 --------------------------------
use CGI;

$query = new CGI; # 新しいCGIオブジェクトの作成
@hoge = $query->param('hoge'); # パラメータhogeの内容の受け取り
------------------------------------------------

参考URL:http://www.futomi.com/lecture/form/cgilib.html#3.2,http://member.nifty.ne.jp/hippo2000/perltips/Cgi.htm#FETCHING_THE_VAL

パラメータのデコード処理で使用するモジュールによって、やり方は変わってきますが、cgi-lib.pl と CGI.pm の場合は下記のようになります。

cgi-lib.pl :
 対象のパラメータが収納された変数を \0 を区切り文字として分割する。

CGI.pm :
 リストコンテキストで値を受け取る。


例) cgi-lib.plを使う場合 ----------------------------
require "cgi-lib.pl";

&ReadParth; # デコード処理
@hoge = split(/\0/, $in{hoge}); # \0 で分割
---------------------------------------...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報