- ベストアンサー
phplibの権限について
- phplibを使用して圧縮ファイルのダウンロード制限を実現したいが方法が分からない
- ページの表示には制限がかけられるが、プログラムの書けないファイルへの制限方法が不明
- ダウンロードしたいファイルのアクセス権を所有者として、ログイン時にApacheユーザーを変更する方法を試してもうまくいかない
- みんなの回答 (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()を利用するのであれば、クローズしなくて良かったような気がします。 まずはこの辺りを見直してください。
その他の回答 (3)
- kusukusu
- ベストアンサー率38% (141/363)
> タグの<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; -------------------------------------------------------------
- kusukusu
- ベストアンサー率38% (141/363)
> 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を直接貼るわけにもいかないと思いますし、何度も申し訳ありませんが、宜しくお願いします。
- kusukusu
- ベストアンサー率38% (141/363)
ようは、直接ファイルにアクセスされたくないと言うことですよね? この場合は、DLさせるファイルを、httpdの範囲外のディレクトリに置きます。 例: /home/user/public_html をドキュメントルートとすると、 /home/user/file の様に、public_htmlの外にディレクトリを作る。 そうしておけば、ファイルに直接アクセスされるおそれはありません。 download.php等の認証済みユーザーしか開けないファイルを作り、そこから上記 files/以下のファイルにアクセスするようにすればOKです。
補足
kusukusuさん 回答ありがとうございます。 それで、もう少し教えて欲しいのですが、ドキュメントルートの外にファイルを格納した場合、そのファイルへのアドレスはどの様に指定したら良いのでしょうか? 普通にアドレスを指定しても、ドキュメントルートの外ではアクセス出来ません。 Apacheの方も、まだまだ勉強不足で、サーバー側の設定が必要な気がしています。 ポイントだけでも教えて頂ければ、自分で調べて見ようと思いますが、今のところ、どこから調べて良いか、検討が付きません。 初心者の質問で申し訳ありませんが、宜しくお願いします。
お礼
kusukusuさん ありがとうございます。 無事、解決しました。 $filenameの記述は、確かに見落としていました。 ファイル名の問題は、$を取るだけで解決しました。 ファイルの破損は、fclose($fp)を削除する事で、正しくダウンロードされました。 元となったソースに付いていたので、てっきり必要と思って、自分で調べるのを疎かにしていました。 fopenの記述を行ったのは、これを入れないと、0バイトファイルとしてダウンロードされた為です。 結局最後まで、kusukusuさんに助けて頂いて、どんなに感謝してもし足りません。 本当にありがとうございました。