アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。PHP5を勉強して約半年のものです。PHP5でフォルダ内のファイルを表示し、そこで選択したファイルをダウンロード、または保存用のダイアログを開くプログラムを作成するにはどうすればよいのでしょうか?
フォルダ内のファイルの一覧を表示し、<a href>を利用して指定したファイルにアクセスすること、http://opqr.jp/2007/09/php.htmlのサイトなどを参考にクリックしてファイルの保存ダイアログを開いたり、単純な保存の仕方などはできるのですが、質問の通りファイル一覧表示からファイル名をクリックした際、その(クリックした)ファイルをダウンロードするにはどうすればよいのでしょうか?

A 回答 (5件)

つまり、管理用のphpなので生データが見えてもOKということですね?



であればこんな感じで、パラメータとして渡してやればいいでしょう。
(仮に自分自身をhoge.phpとします)

<?php
$rep = 1; // 最終更新日(表示=1 非表示=0)
$sze = 1; // ファイルサイズ(表示=1 非表示=0)
$lst = "./list"; // 表示するリストの名前(パス)

$f=$_GET["f"];
if(file_exists($f)){
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($f));
$fp=fopen($f,"r");
while(feof($fp)===false){
print fread($fp,1024);
}
exit;
}

$drc=dir($lst);
print("<OL>");
while($fl=$drc->read()) {
$lfl = $lst."/".$fl;
$din = pathinfo($lfl);
if(is_dir($lfl) && ($fl!=".." && $fl!=".")){
print("<LI>".$din["basename"]."<FONT size='-1'> (ディレクトリ)</FONT></LI>");
} else if($fl!=".." && $fl!=".") {
print("<LI>");
print("<a href=hoge.php?f=".urlencode($lst."/".$fl).">".$fl."</a>");
// ファイル更新日
if($rep == 1 || $sze == 1) print("<FONT size='-1'> (");
if($rep == 1) echo date("m/d",filemtime($lfl));
if($rep == 1 && $sze == 1) print(", ");
// ファイルサイズ
if($sze == 1) echo round(filesize($lfl)/1024)."KB";
if($rep == 1 || $sze == 1) print(")</FONT> ");
print("</LI>");
}
}
print("</OL>");
$drc->close();
?>
    • good
    • 0
この回答へのお礼

疑問点がすっきり解決しました。プログラムも記述していただき、ありがとうございます。まさか自身(hoge.php)を<a href>で指定し、自身に値を受け渡すことで、できるとは思ってもいませんでした。今回記述していただいたプログラムのように自身にデータ(値)を送信する方法は他のプログラムでも利用できそうです。一つの解答で複数の課題が解決できるような、ピンポイントの解答、ありがとうございます。

お礼日時:2010/02/15 17:23

一覧を表示する時に、form内に一覧を入れて、radioボタンを各ファイル名の先頭に表示して、送信ボタンでダウンロード実行させる方法もあります。


<form action="dl.php" method="post">
<input type="radio" name="dlnumber" value="1">ff.ttt
...
<input type="submit" value="一個ずつダウンロード">
</form>
複数ファイルを一遍にダウンロードするには、zipアーカイブなどを作成してからでないと、なりませんが、もしかしてそのこと?。
PEAR::File_Archive でzip を作成してダウンロードも、補足に提示されたサイトにありますね?
form の複数指定の方ですか?
それぞれinput要素のname にも連番つけちゃうか、 name="dl[]" とかすれば、$_POST['dl'][] のように配列に取得できますよ。
http://jp.php.net/manual/ja/language.variables.e …
    • good
    • 0

一覧の表示のしかたがわからないのですか?


ダウンロードのしかたがわからないのですか?
また、ダウンロードいっても、ソースのダウンロードをさせたいのか、
パース後のデータをダウンロードさせたいのかによってもだいぶ
違うと思います。
つまり、test.phpが
<?PHP
print "test";
?>
だったばあい、ソースならそのまま、パース後ならtestがファイルの
中身になります。
もし前者を希望とすると結構まずいことになると思いますが・・・

この回答への補足

すばやい解答ありがとうございます。そしてわかりづらい質問で申し訳ありません。自身がやりたいこととして、まずhttp://php.eweb-design.com/0206_di.phpのサイトと同様の方法でファイルの一覧をブラウザに表示する。(ここまではできます。)その一覧からユーザが欲しいファイルをダウンロードするにはどうすればよいのでしょうか?通常のファイルのダウンロードはできるのですが、ファイル一覧を確認してからユーザがいちいちプログラムを作成し、ダウンロードさせるのは手間がかかるので省略できないかと考えて、フォルダ内のファイル一覧の表示ページから、そのままファイルをダウンロードする方法を探しています。できればファイル一覧を表示してから​http://opqr.jp/2007/09/php.html​のようにクリックしてそのファイルがダウンロードできたらいいと思っています。また、ファイル管理システムなのでファイル内には50個ぐらいファイルが存在しています。

補足日時:2010/02/15 10:36
    • good
    • 0
この回答へのお礼

すみません。この回答への補足の3行めに書いた通常のファイルのダウンロードとはhttp://d.hatena.ne.jp/litt/20070905/p1のようにファイル名を指定する基本的なダウンロードのやり方を知っているということです。ファイル一覧表示からダウンロードできるわけではありません。(むしろファイル一覧表示からダウンロードしたい)このような場所に記述して申し訳ありません。このような内容がわかりづらい質問に解答していただきありがとうございます。

お礼日時:2010/02/15 12:19

#1です。

度々すみません。

そちらの提示してあるサイトでやっている事を、回答としてあげてしまったようで、すみません。
ちょっと、そちらのやろうとしている事が自分の頭で把握できない為、#1は聞き流しでお願いします。
    • good
    • 0

ヒント : header();



http://php.net/manual/ja/function.header.php

以下、抜粋 コピペです。

PDF ファイルを生成した場合など、 それをダウンロードするかの確認ダイアログを表示させたいことがあるでしょう。 そんな場合は、» Content-Disposition ヘッダを使用してファイル名を指定すると、ブラウザ側でダイアログを表示させることができます。

<?php
// PDFを出力します
header('Content-type: application/pdf');

// downloaded.pdf という名前で保存させます
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// もとの PDF ソースは original.pdf です
readfile('original.pdf');
?>
    • good
    • 0

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