dポイントプレゼントキャンペーン実施中!

2つ下のアクセス制限でも質問していますが、圧縮ファイルのダウンロードについて、ログインで認証を与えられた人物以外にはダウンロード不可としたいのですが、phplibで実現させる方法が分かりません。

自分で調べた限りでは、ページの表示に対する制限などはかけられるみたいですが、圧縮ファイルなど、プログラムの書けないファイルへの制限方法が分かりません。

phplibでの制限方法が分からなかったので、代わりの方法としてダウンロードしたいファイルのアクセス権を所有者として、ログインが成功した時点でApacheのユーザーをnobodyから所有者に変更するなど考えて見たのですが、うまくいきません。

良い方法をご存知の方、教えて頂けないでしょうか?

A 回答 (4件)

$file=i18n_convert($file,SJIS);


> header("Content-Disposition: inline; $filename=\""."pack.exe"."\"");
これはタイポてすか?
filenameが$filenameと変数になっています。
もしタイポじゃないのであれば、これが名前がおかしい原因かも

> header ("Content-Length: $fs");
私はこの記述が抜けていましたね(^^;

> $fp=fopen($file,"rb");
> @fpassthru($fp);
> fclose($fp);
> exit;
この記述の意味が分かりません。なぜ、新たなファイルに書き込んでいるのでしょう?
後細かいことですが、fpassthru()を利用するのであれば、クローズしなくて良かったような気がします。

まずはこの辺りを見直してください。
    • good
    • 0
この回答へのお礼

kusukusuさん ありがとうございます。

無事、解決しました。

$filenameの記述は、確かに見落としていました。
ファイル名の問題は、$を取るだけで解決しました。

ファイルの破損は、fclose($fp)を削除する事で、正しくダウンロードされました。
元となったソースに付いていたので、てっきり必要と思って、自分で調べるのを疎かにしていました。
fopenの記述を行ったのは、これを入れないと、0バイトファイルとしてダウンロードされた為です。

結局最後まで、kusukusuさんに助けて頂いて、どんなに感謝してもし足りません。

本当にありがとうございました。

お礼日時:2003/03/28 19:10

> タグの<A HREF="http~


> のアドレス部分に、$fileを直接貼るわけにもいかないと思いますし
これは私がNo1で書いたdownload.phpで制御することです。
凄く簡単な一例を挙げると、

function download_file($file) {
  header("Content-Disposition: inline; filename=\"".basename($file)."\"");
  header("Content-Length: ".$content_length);
  header("Content-Type: application/octet-stream");
}
とダウンロードする関数を作り(多分何度も同じ行為をすると思うので、関数化した方がいいですよ。)必要なファイルを呼び出します。

$path="/home/user/file";
(snip)
$file=$path."/hogehoge.txt";
download_file($file);
と言った感じです。

この回答への補足

kusukusuさん 何度もすみません。

教えて頂いたコードを元に、色々調べてみました。
それで、後少しの所まで来ていますが、2点問題が発生します。

1.ダウンロードしたファイルが、PHPのファイル名としてダウンロードされる
2.ダウンロードしたファイルが破損している

元ソースは、他のカテゴリに似た物があったので、それを使用しました。
ダウンロードするファイルは、pack.exeと言う自己解凍の圧縮ファイルです。
PHPのファイルは、download.phpと言うファイルで、以下のコードのみ記述しています。

ファイルの保存は出来る様になったのですが、ファイル名がdownload.phpとなり、ダウンロード後にpack.exeにリネームしても、実行時にエラーになります。
ファイルサイズから考えて、pack.exeをダウンロードしているのは間違い無いみたいです。

ちなみにブラウザは、IE5.5 SP2を使用しています。
記述方法に謝りがあれば、ご指摘下さい。
-------------------------------------------------------------
$file = "/usr/local/pack.exe";
$file=i18n_convert($file,SJIS);
$fs=filesize($file);
//header("Content-Disposition: inline; $filename=\"".basename($file)."\"");
header("Content-Disposition: inline; $filename=\""."pack.exe"."\"");
header("Content-Type: application/octet-stream");
header ("Content-Length: $fs");
$fp=fopen($file,"rb");
@fpassthru($fp);
fclose($fp);
exit;
-------------------------------------------------------------

補足日時:2003/03/28 15:53
    • good
    • 0

> pacheの方も、まだまだ勉強不足で、サーバー側の設定が必要な気がしています。


サーバーの設定は必要ありません。
パスを絶対パスで指定してあげればいいだけです。
$path="/home/user/file";
(snip)
$file=$path."/hogehoge.txt";

と言った感じです。

この回答への補足

kusukusuさん 素早い回答ありがとうございます。

>パスを絶対パスで指定してあげればいいだけです。
>$path="/home/user/file";
>(snip)
>$file=$path."/hogehoge.txt";
確かに、PHPの内部でファイルの読み込みを行う際は、大丈夫だと思いますが、正式にログインした人が、ファイルをダウンロードしたい場合は、どの様にリンクを貼ったら良いのでしょうか?

タグの<A HREF="http~
のアドレス部分に、$fileを直接貼るわけにもいかないと思いますし、何度も申し訳ありませんが、宜しくお願いします。

補足日時:2003/03/28 11:41
    • good
    • 0

ようは、直接ファイルにアクセスされたくないと言うことですよね?


この場合は、DLさせるファイルを、httpdの範囲外のディレクトリに置きます。
例:
/home/user/public_html をドキュメントルートとすると、
/home/user/file
の様に、public_htmlの外にディレクトリを作る。
そうしておけば、ファイルに直接アクセスされるおそれはありません。
download.php等の認証済みユーザーしか開けないファイルを作り、そこから上記 files/以下のファイルにアクセスするようにすればOKです。

この回答への補足

kusukusuさん 回答ありがとうございます。

それで、もう少し教えて欲しいのですが、ドキュメントルートの外にファイルを格納した場合、そのファイルへのアドレスはどの様に指定したら良いのでしょうか?

普通にアドレスを指定しても、ドキュメントルートの外ではアクセス出来ません。
Apacheの方も、まだまだ勉強不足で、サーバー側の設定が必要な気がしています。
ポイントだけでも教えて頂ければ、自分で調べて見ようと思いますが、今のところ、どこから調べて良いか、検討が付きません。

初心者の質問で申し訳ありませんが、宜しくお願いします。

補足日時:2003/03/28 09:11
    • good
    • 0

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