2つ下のアクセス制限でも質問していますが、圧縮ファイルのダウンロードについて、ログインで認証を与えられた人物以外にはダウンロード不可としたいのですが、phplibで実現させる方法が分かりません。
自分で調べた限りでは、ページの表示に対する制限などはかけられるみたいですが、圧縮ファイルなど、プログラムの書けないファイルへの制限方法が分かりません。
phplibでの制限方法が分からなかったので、代わりの方法としてダウンロードしたいファイルのアクセス権を所有者として、ログインが成功した時点でApacheのユーザーをnobodyから所有者に変更するなど考えて見たのですが、うまくいきません。
良い方法をご存知の方、教えて頂けないでしょうか?
No.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()を利用するのであれば、クローズしなくて良かったような気がします。
まずはこの辺りを見直してください。
kusukusuさん ありがとうございます。
無事、解決しました。
$filenameの記述は、確かに見落としていました。
ファイル名の問題は、$を取るだけで解決しました。
ファイルの破損は、fclose($fp)を削除する事で、正しくダウンロードされました。
元となったソースに付いていたので、てっきり必要と思って、自分で調べるのを疎かにしていました。
fopenの記述を行ったのは、これを入れないと、0バイトファイルとしてダウンロードされた為です。
結局最後まで、kusukusuさんに助けて頂いて、どんなに感謝してもし足りません。
本当にありがとうございました。
No.3
- 回答日時:
> タグの<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;
-------------------------------------------------------------
No.2
- 回答日時:
> 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を直接貼るわけにもいかないと思いますし、何度も申し訳ありませんが、宜しくお願いします。
No.1
- 回答日時:
ようは、直接ファイルにアクセスされたくないと言うことですよね?
この場合は、DLさせるファイルを、httpdの範囲外のディレクトリに置きます。
例:
/home/user/public_html をドキュメントルートとすると、
/home/user/file
の様に、public_htmlの外にディレクトリを作る。
そうしておけば、ファイルに直接アクセスされるおそれはありません。
download.php等の認証済みユーザーしか開けないファイルを作り、そこから上記 files/以下のファイルにアクセスするようにすればOKです。
この回答への補足
kusukusuさん 回答ありがとうございます。
それで、もう少し教えて欲しいのですが、ドキュメントルートの外にファイルを格納した場合、そのファイルへのアドレスはどの様に指定したら良いのでしょうか?
普通にアドレスを指定しても、ドキュメントルートの外ではアクセス出来ません。
Apacheの方も、まだまだ勉強不足で、サーバー側の設定が必要な気がしています。
ポイントだけでも教えて頂ければ、自分で調べて見ようと思いますが、今のところ、どこから調べて良いか、検討が付きません。
初心者の質問で申し訳ありませんが、宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPで複数ファイルのダウン...
-
Word Press) 日本語ファイル名...
-
指定したURLからファイル(PDF...
-
ファイル一覧を表示しその画面...
-
csvをダウンロードする際、いき...
-
ダウンロードファイル名の文字...
-
透過PNGが透過されない!!
-
データベースへの持続的接続
-
onedrive にexcelファイルをア...
-
MySQLのdatetime型の月日0を削...
-
ラッパークラスって何ですか?
-
.phpと.incファイルの違いはな...
-
ファイルの行数取得
-
バッチを用いたフォルダの自動移動
-
Subversionのリポジトリの削除
-
リンク先を隠す方法はないでし...
-
FTPコマンドでディレクトリごと...
-
include先でのinclude元の変数...
-
PHPで新しいウインドウで開く命...
-
FORMで送信ボタンと戻るボタン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPで複数ファイルのダウン...
-
ダウンロードファイル名の文字...
-
PHPでファイルのダウンロードす...
-
phpでzipファイルダウンロード...
-
ファイルのダウンロードのイベ...
-
zip圧縮の種類について
-
PHPでファイルをダウンロードさ...
-
libxml2のインストール
-
PHPでGoogle TTSからMP3ダウン...
-
eclipseでコメントアウトができ...
-
HTTPで返されるファイル名の取...
-
cakephpでのダウンロード機能の...
-
phpでうまく画像がダウンロード...
-
【PHP】ダウンロードサイト作成...
-
ブラウザでExcelをダウンロード...
-
VB.NETのFTPダウンロードについて
-
複数ファイルを連続でダウンロード
-
PHPのFTP関数ftp_fgetエラーに...
-
ファイル一覧を表示しその画面...
-
PHP 検索結果のCSVダウンロード
おすすめ情報