• ベストアンサー

windows up dateのようなダウンロード方法

教えて下さい。 以下のような事がやりたいです。 windows up dataのように複数あるファイルから任意のファイルを クライアントに選択してもらい、それをダウンロードさせる。 (リンクを張るのではなく) 当方の環境は、UNIX系OS、Apache、perlです。 JAVAは使った事がありません。 宜しくお願いします。

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

  • ベストアンサー
  • nak205
  • ベストアンサー率60% (40/66)
回答No.3

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; こんな感じです。

update
質問者

お礼

ありがとうございます! 上記の方法でやれそうです。 また何かありましたら宜しくお願いいたします。

その他の回答 (3)

  • po-net
  • ベストアンサー率36% (172/477)
回答No.4

おや、#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; この文に入る前にやっておくことは「フォームで受け取ったファイル名を、配列に入れておく」→「ファイル数を把握」です。 その後、上記の文を繰り返し文でくくります。 条件は、「ファイル数よりも繰り返し変数が小さい場合は繰り返す」で。 もしかしたら、もう少しスマートな方法があるかもしれませんね。 関数などが分からないので、言葉で書きましたが、通じたでしょうか?

update
質問者

お礼

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

  • nak205
  • ベストアンサー率60% (40/66)
回答No.2

こんにちは。 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をループさせればできたと思います。 ヘッダに関してはあまり詳しくないので、もっとしっかりした知識をおもちの方、ヘルプお願いします。というか、私のはあっちこっちのスクリプトからもってきたもので、ちゃんと動いたものを使ってますので、本当のルールをご存知の方、ぜひ教えてください。(ひとの質問のところで厚かましい?)

update
質問者

お礼

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

  • po-net
  • ベストアンサー率36% (172/477)
回答No.1

チェックボックスを使って選択されたものをまとめてダウンロードとかする方法をとってみては? ただ、そのままインストールするのであえば勝手は違ってきますが。 それとParlご使用とのことですが、結構使われていますか? これから勉強するとか、かなり使っているというなら、PHPもいいですよ。 Apacheで使えるし、CGIよりも高速です。 PostgreSQLやMySQLなどのオープンソースのデータベースとの連携もスムーズです。 もともと簡単だけど、CやParlの形式に似ているから、経験者ならなおさら簡単に感じるかも。 気が向いたら調べてみてください。 http://www.php.gr.jp/

update
質問者

お礼

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

関連するQ&A