2011-07-25 9 views
2

私は、ユーザーがアカウントを作成して画像をアップロードできるアプリケーションの開発を進めており、ディレクトリに保存され、公開されているアプリの一部です今私は本当に特定の条件が満たされた場合、つまりセッションが設定されているか、画像のdbの権限がpublicに設定されている場合にのみ、これらの画像にアクセスできるように画像を保護したいと思います。 。htaccessを使用してディレクトリへのアクセスを許可する前にPHPで妥当性を確認する

私が必要とするのは、そのディレクトリのイメージが読み込まれるたびに、htaccessファイルはそのディレクトリ内のphpファイルにイメージ名を渡します。 htaccessは画像をタグで読み込んだり、ブラウザのアドレスバーに入力したりして、画像を吐き出すことができます。

私は多くのポストを見つけましたが、何も見つかりませんでした。私はそれが不可能ではないと想像することはできませんので、ガイダンスを提供できる人は誰でも祈ってくれます。あなたが地元の人であれば、他のメリットが得られるかもしれません!

+0

これは可能です&静かで簡単ですが、これまでに試したことはありますか?あなたはあなたが望むものを知っているように思えますし、コーディングを始めると驚くかもしれません。 –

+0

['http://www.jasny.net/articles/how-i-php-x-sendfile/'](http://www.jasny.net/articles/how-i-php-x-sendfile/'参照。 jsny.net/articles/how-i-php-x-sendfile/) –

答えて

3

アップロードされた画像をウェブにアクセスできないフォルダに保存してから 書き換えルールを使用してリクエストをPHPに転送します。次のようなものがあります:RewriteRule ^images/([^/]+) /image.php?img=$1 [NC]

phpで妥当性チェックを行い、okであれば読めないフォルダからphp経由でイメージを転送します。何かのように

header('Content-type: '.$mime); 
header('Content-length: '.filesize($filename)); 
$file = @ fopen($filename, 'rb'); 
if ($file) { 
    fpassthru($file); 
    exit; 
} 
+0

私が読んでいたものについてreadfileで十分だと思います。しかし、私たちは複数のサーバー上で動作しており、専用のストレージボックスを持っているため、ファイルをWebアクセス可能なフォルダに格納する必要があります。 –

1

限り、私はあなたのケースを理解して、パスを取ること、すべての

から否定するの.htaccess

により、ファイルへの直接アクセスを閉じて、別のディレクトリにあるPHPのフロントエンドを作成する必要がありますかちょうど$ _GETからファイル名を画像と、たとえば、条件が満たされているかどうかをチェックし、画像を返す

header("Content-type: image/jpeg"); 
readfile("/path/to/my/images/$image"); 
+0

ありがとうGreenisha –

1

私があなただったら、私は特定のフォルダにすべての画像を移動してから、この呼ばれる画像のようなPHPスクリプトを構築します.php:

0123あなたの.htaccessのビットを変更することができ、要求が images/10.jpgのために作られたとき、それは代わりに iid=10.jpg

でスクリプトを呼び出すように

RewriteRule ^images/(.*)$ image.php?iid=$1 [L] 

:あなたが好きなあなたの.htaccessを設定することができ

<?php 

// You may want to use image name depending on 
// if you can fetch the name from the db from an id 
// You need the filename to open the image later 

$iid = 0; 
if(isset($_GET['iid'])) 
    $iid = (int)$_GET['iid']; 

// Check session 
// Check database permissions ect. 

// If you don't want this image to be output call die(); 

// If it's a go, output the image. 

// Change this to the type of the image you're about to output 
header('Content-Type: image/png'); 

readfile('images/'.$image_filename); 

?> 

idsやファイル名などを使用するかどうかによって、.jpgを渡したくない場合があります。スクリプトと同じです。ご質問がある場合はお知らせください:

+0

私が見る限り、アニメーションGIFがあればそれは壊れてしまいます。 – Greenisha

+0

@Greenisha True、それはちょっとしたことであり、簡単な修正です。 – Paulpro

+0

このような画像ライブラリを使用することは、非常に非効率的で実用的ではありません。すでに画像があります。サイクルを過ごす必要はありません。彼らが既に入っているフォーマットです。ファイル名のreadfile()を呼び出すだけです。 –

関連する問題