2012-02-28 2 views
0

私はYiiフレームワークを使用してウェブサイトを開発しています。私のウェブサイトには、ユーザープロファイルがあります(既に実装されています)。私はユーザーがプロフィール画像をアップロードできるようにファイルアップローダーを持っています。一部のプロファイルは一般に公開されているものもあれば、非公開のものもあります。プライベートプロファイルには公開ユーザーがアクセスできないようにする必要があります。このプロファイルの画像には、プロファイルの所有者以外の誰もアクセスできない場合があります。プロファイルの所有者だけがアクセスできるように、ユーザーのプロファイルイメージを非公開で保存する方法はありますか?

MySQLデータベースに画像を保存するのは悪い考えです。パフォーマンスが低下し、ウェブホストで画像が許可されない可能性があります。私は私の保護されたディレクトリに画像を格納することを考えたが、ここで完了した場合、私はすべての画像にリンクすることはできません。有効なプロフィール(公開プロフィール、またはユーザに属するプロフィール)に画像を表示するにはどのようにすればいいですか?

ヒントやアイデアは、Yii、phpまたは他のものに関係します。私の質問が不明な場合は教えてください。ありがとうございました。

*私は正式なウェブ開発コースを経験したことがなく、他の多くの人と同じように自分の時間に知っていることをすべて学んだので、非常にシンプルで明白な解決策が見当たりません。

+1

は、あなたが取り組む必要があるarhcitectureの実装のように聞こえます。あなたは、彼らがプライベートまたはパブリックであるユーザーの種類を格納し、次に視聴者が他のユーザーのプロファイルを表示しようとしたときにそれを確認する必要があります。彼らが表示しようとしているプロファイルの(プライベート)ユーザーとしてログインしていない場合は、何も表示しないでください。 – thescientist

+0

返事をありがとう。私はこれについて完全にはっきりしていなかったと思う。あなたが提案したように私はすでに実装しています(プライベートユーザとパブリックユーザ、そしてURLをハックしたユーザは、いくつかのエラーページ/アクセス拒否ページに送られます)。しかし、私は、「賢い」ユーザーが(画像がパブリックドメインに保存されているので)いくつかのURLのハックを介してプライベートユーザーの画像にアクセスすることが依然として可能かもしれないと心配しています。上記のように、保護ドメインに保存したくない理由は、ユーザーのページに画像を表示できないことですが、これを考えて間違っているのでしょうか? – Denzil

答えて

1

ユーザーが画像をアップロードした後、ランダムな画像名を取得します。 mt_rand(30,999)。 imageExtension。
この値をユーザイメージ名としてimageテーブルに格納します。画像テーブル には、それ自身のiduser_id、およびnameの各列が含まれています。

Yiiイメージモデルでは、イメージをファイルシステムに保存するprotected function afterSave()メソッドを作成します。ファイルシステムの実際のイメージ名は、データベースのイメージIDとデータベースのイメージ名で構成されます。
は、この関数にfollowinの行を追加することを忘れないでください:

return parent::afterSave(); 

例:
あなたはme.jpg
mt_rand(30999)と呼ばれるJPGイメージだからあなたはあなたのjpg画像を保存する私たちに421
を与えていデータベース。
行には値があります。

これで、画像は7_421.jpgの名前で保存されます。
画像名の最初の部分で使用するidが一意であるため、画像を同じ名前にすることはありません。また、誰も画像の名前を知りません。なぜなら、彼女はidと乱数の両方を必要とするからです。

を行うことによってのみ、あなたがログインしたユーザーIDが user_id と同じである比較所有者のための画像を表示するには:

if(Yii::app()->user->id === $image->user_id) { 
// display photo 
} 

あなたはセッションの世話をする必要はありません。 Yiiはあなたのためにあります。

+0

私はすでにそれが働いていますが、やや異なった方法です。私はあなたの答えを受け入れていますが、あなたはそれに多くの考えを入れていたようで、私の意見では最も明白です。私の現在の実装では、パブリックドメインの手の届かない場所に画像を保存し、PHPファイルを通して画像を提供します。私は少し変えていくつもりだと思いますが、最終的にはある程度までになっていなければなりません。 – Denzil

2

は、ユーザーがランダムに画像の名前を変更し、ユーザーテーブルにランダムなファイル名を格納し、彼の写真をアップロードした後、彼らは現在のセッションが権限

+0

ありがとう。私はこれをどうやって行うのか分かりませんが、私はそれを調べます。 – Denzil

2

を持っているかどうかを確認することができますPHPファイルスルー画像を提供しています。

ユーザーがログインした後、もちろんセッション(少なくともユーザーID)を設定します。

image_profile.phpを作成し、そのファイルのセッションからuser_idを取得します。その後、このようなクエリを実行し、その後

SELECT `profile_image_filename` 
FROM user WHERE user.id = {$SESSION['user_id']} 
LIMIT 1; 

image_profile.phpの結果は、ログインしているユーザーのプロファイル画像となるよう{$profile_image_filename}.jpgを送信します。 (画像を動的に出力する方法?Output an Image in PHP

+0

これは、私のために学習するという点であまりにも多くの仕事をすることなく、できることのように思えます。助けてくれてありがとう! – Denzil

+1

では、ファイル名をランダム化するのではなく、サーバーが読み取れるアクセスできないパスにイメージを格納してください。本当に「プライベート」になります。 – miki

関連する問題