/ Else düzgün çalışmıyorsa

9 Cevap php

Ben CodeIgniter içinde kullanıyorum bir doğrulama işlevi vardır.

function valid_image() {
    if ( ($_FILES["file"]["type"] != "image/jpeg") || ($_FILES["file"]["type"] != "image/gif")  ) {
    $this->form_validation->set_message('valid_image', 'Wrong file type..');

    return false;
} else {
    return true;
}

Eğer açıklamada sadece "image / jpeg" bölümü ile iyi çalışıyor. Ben başarısız bir jpg dosyasından başka bir şey yüklemek için deneyin. Yukarıdaki kodu çalıştırırsanız, bir jpg veya gif dosyası hem de başarısız olur.

Ve birisi Yapamam "neden, yükleme sınıfını kullanamazsınız" diyor önce. Ben MongoDB içine doğrudan benim fotoğraflarını saklıyorum, böylece yükleme sınıf çok yardımcı olmuyor.

9 Cevap

Bu gerçekten soru cevap, ama değil ...

$_FILE[blah]["type"] parametresi web tarayıcısı tarafından belirlenen ve bu şekilde güvenilir olamaz kullanıcı verileri olduğunu.

Sen gerçek görüntü türünü tespit etmek yerine exif_imagetype($_FILES["file"]["tmp_name"]) kullanmak isteyebilirsiniz.

function valid_image() {
    $type = exif_imagetype($_FILES["file"]["tmp_name"]);
    if (($type != IMAGETYPE_GIF) && ($type != IMAGETYPE_JPEG)) {
        $this->form_validation->set_message('valid_image', 'Wrong file type..');
        return false;
    } else {
        return true;
    }
}

Edit: exif uzantısı yüklü değilse, siz de yapabilirsiniz:

$sizes = getimagesize($_FILES["file"]["tmp_name"]);

$sizes[2] IMAGETYPE constants birine karşılık gelen bir değer içerir.

function valid_image() {
    $sizes = getimagesize($_FILES["file"]["tmp_name"]);
    if (($sizes[2] != IMAGETYPE_GIF) && ($sizes[2] != IMAGETYPE_JPEG)) {
        $this->form_validation->set_message('valid_image', 'Wrong file type..');
        return false;
    } else {
        return true;
    }
}

You want AND not OR

If the file is jpg, then it's not gif, and you get the message.
If the file is gif, then it's not jpg, and you still get the message.

Sen "dosyası jpg değil veya dosya gif değildir" var. Değiştir | | && ile ve "dosya jpg değil VE dosyası gif değil" sadece mesaj alırsınız.

Sizin deyim yanlışsa. Sen kullanmalısınız '&&' yerine '| |' (DeMorgan yasası).

olmak durumunuz gerekir

if ( ( $_FILES["file"]["type"] != "image/jpeg") 
       && ($_FILES["file"]["type"] != "image/gif")  ) {...}

Bir jpeg değil ve bir gif değilse - bu geçerli değil

İhtiyacınız VE yerine OR

 if (($_FILES["file"]["type"] != "image/jpeg") && 
     ($_FILES["file"]["type"] != "image/gif"))

kullanmak && | yerine |

Eğer buna sahip gibi deyimi gif değil jpeg ve olmadığını garanti eder. Bunda sorun jpeg ise, hala gif değil, bu yüzden yanlış döndürür olmasıdır. Bir şey aynı anda iki şey olamaz beri Aslında, her zaman false döndürür.

| && Için | değiştirin sizin niyet ve eğer yardımcı olmalıdır.

Eğer bir ve değil, bir ya da kullanmak istiyorum. Lütfen yukarıdaki kodu, bu bir gif değil çünkü jpg başarısız olur ve bir jpg değil çünkü gif başarısız olur.

function valid_image() {
if ( ($_FILES["file"]["type"] != "image/jpeg") && ($_FILES["file"]["type"] != "image/gif")  ) {
$this->form_validation->set_message('valid_image', 'Wrong file type..');

return false;
} else {
return true;
}

Eğer bir. Gif ile bu ifadeyi çalışırsanız Eh, o ilk 'veya' ilk denetler çünkü yanlış dosya olduğunu söylemek için gidiyor. Eğer denemek ve bir. Jpg çalıştırırsanız Ayrıca, bu nedenle hala bunun geçersiz diyecekler, ilk veya ancak daha sonra ikinci başarısız geçmek gerekir. Bunu yapmayı deneyin '&&' yerine '| |', kontrol ve bu ikisi her zaman biri emin olacağım bu şekilde.