PHP ile Kullanıcı Profil Resmini Çekmek

Merhaba! Bu yazıda çok fazla konuşmayacağım ve bir üyelik sisteminde, kullanıcılara tanımlayacağınız “profil resmi yükleme” ile ilgili PHP tarafında yapacaklarınızı paylaşacağım. Kaynak olması açısından, ben her halükarda “resim yükleme / profil resmi yükleme” kodlarını da paylaşacağım ki; kod yazmaya yeni başlayan kitle daha fazla vakit kaybetmesin 🙂

Üyelik sistemine sahip veya sahip olmak isteyen herkes şu mantıkta gitmeyi arzular: bir görsel yüklediyse o görsel çıksın, yüklemediyse default görseli çıksın. Ben işi biraz daha değiştirerek, şayet hiç görseli yoksa ve yüklemeye de niyetlenmediyse diye Gravatar’ı işe dahil edeceğim. Bu sayede sistemimzide default görsel neredeyse sıfır olacak.

İlk önce “PHP ile resim yükleme”

Bu Bootstrap‘ta hazırlanmış bir form örneği, HTML kodu.

<form method="post" enctype="multipart/form-data">
    <div class="form-group-attached">
        <div class="form-group form-group-default">
            <input type="file" class="form-control" name="profile_pic">
        </div>
    </div>
    <hr>
    <input type="submit" class="btn btn-primary btn-block m-t-5" name="submit">
</form>

PHP kısmına geçmeden önce iki aşamayı hatırlatmak isterim, form’da bir action adresi yok. Yani aynı dosya içinde PHP’i çalıştıracağım. Siz bir .php dosyasına göndermek isterseniz action adresi eklemelisiniz. Ayrıca bunları yapmadan önce bir uploads klasörü açmanız ve dosya izinlerine 777 vermeniz gerekiyor. 

Hepsi tamamsa, PHP kısmına geçelim!

if ($_POST) {
    if(!empty($_FILES['profile_pic'])){
        $path = "uploads/";
        $path = $path . $member_key.'.jpg';

        if(move_uploaded_file($_FILES['profile_pic']['tmp_name'], $path)) {
            echo 'Resim Yüklendi';
        } // yada else
    }
}

Yukarıdaki PHP kodları için de bir not eklemek istiyorum: en basit, güvenliksiz ve saf halidir. Bu nedenle kendinizi geliştirerek hem güvenlik (maks. resim boyutu, resim tipi ve uzantısı gibi) seçenekler kullanmanızı ve bunları bulmak için araştırma yapmanızı tavsiye ederim.

Yukarıda ne yaptık?

Üye girişi yapmış bir kişinin member_key (yada uye_id vs.) bilgisiyle, yüklediği görselin ana dizin ismini değiştirdik ve sunucudaki uploads klasörüne kayıt ettik.

Bu yazıda varsayılan member_key : abc123 olsun. Varsayılan mail adresi de: [email protected] olsun.

Şimdi, yüklenen görseli çekelim (veya daha öncesinde bir görsel yüklenmiş mi diye kontrol edelim)

function getProfPic($member_id, $member_mail, $gravatar){
 $file = $_SERVER['DOCUMENT_ROOT'].'/uploads/'.$member_id.'.jpg';

 if (file_exists($file)) {
 return '/uploads/'.$member_id.'.jpg';
 }elseif ($gravatar == 2) {
 return 'https://www.gravatar.com/avatar/'.md5($member_mail).'?s=200&d=monsterid&f=y';
 }else{
 return '/uploads/default.jpg';
 }
}

echo getProfPic("abc123", "[email protected]", 2);
// sondaki değer 1 olursa, gravatar kapalı, 2 olursa gravatar açık demek.

Sonuç olarak ne yaptık?

İlk önce member_id ile sunucunun uploads klasöründe bir görsel var mı diye sorguladık. Eğer gravatar durumunu aktif ettiysek (ki yukarıdaki kodda aktif), kullanıcının mail adresiyle gravatar’da bir görseli var mı diye kontrol ettik. Zaten gravatar’da görseli yoksa bile (wordpress yorumları tarzında) otomatik oluşturulmuş birkaç default görseli yayına soktuk. Ama gravatar’ı kapatmış olsaydık, direk sunucumuzun uploads klasöründeki default görsel ekrana yazdırılacaktı. 

Önemli bir güvenlik açığı olarak: $_SERVER[‘DOCUMENT_ROOT’] kodunu, return alanına; yani ziyaretçilerin ekranına yazdırılacak kod satırına eklememelisiniz. Kötü niyetli ziyaretçilerin, sunucu dizininizi öğrenmesi pek hoş olmayabilir.

Kolay gelsin!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir