PHP - filetype kontrol $ HTTP_POST_FILES döngüye

7 Cevap php

SO Benim ilk soru, teşekkürler. :)

I'm developing a support issue logging system for my company and it must allow for files to be uploaded aswell as any problems submitted to our database. There could be from 0-6 different uploads to check, along with a support issue. I've managed to get an accurate variable of how many files there is through having a hidden input field (imgcount) that updates via js whenever an image is selected through a type="file" input, or removed from the form.

I içlerinden döngü bu şekilde daha kolay olacağını düşünmüştüm olarak benim [input type = "file"] adları image1, image2, vb vardır.

Form gönderildiğinde aşağıdaki kod onlar geçerli tipi (gif / jpeg / png) ait konum, herhangi bir dosya ve çekler var olmadığını görmek için bir görünüm alır, bu yüzden güvenle yüklenebilir. Destek sistemi güzel bir güvenli oturum açma var gibi virüsler konusunda çok endişeli değilim ve biz müşterilerimize güven.

$sscount = $_POST['imgcount'];
echo $sscount; //to test the variable
if($sscount>0){
    for($i = 1; $i <= $sscount; $i++){
        if (($_FILES["image$i"]["type"] == "image/gif")
        || ($_FILES["image$i"]["type"] == "image/jpeg")
        || ($_FILES["image$i"]["type"] == "image/png" )
        && ($_FILES["image$i"]["size"] < 500000))
        {

        }
        else
        {
        $errormsg .= "Error: Image $i must be either JPEG, GIF, or PNG and less than 500 kb.<br />";
        }
    }
}

Ama bu kimse ben döngü almak ve doğru dönebilir nasıl herhangi bir fikir var, doğru döngü olarak görünmüyor?

7 Cevap

&& | istediğiniz gibi (A OR B OR C) AND D, aslında, bu yüzden yerine A OR B OR (C AND D) | operatörü yüksek precedence daha vardır

Eğer amaçlanan değerlendirme zorlamak için parantezleri kullanabilirsiniz.

Ancak, böyle bir şey korumak için okuma / temiz ve daha kolay olabilir:

$allowed_types=array(
    'image/gif',
    'image/jpeg',
    'image/png',
);


$sscount = $_POST['imgcount'];
if($sscount>0){
    for($i = 1; $i <= $sscount; $i++){

        if (in_array($_FILES["image$i"]["type"], $allowed_types) && 
            ($_FILES["image$i"]["size"] < 500000))
        {

        }

    }
}

Diğerleri de söylediğim gibi, sizin conditionals gruplandırılmış olan yolu yanlıştı. Ancak, yerine sadece bazı parantez ekleyerek daha, ben tamamen iki koşullarını ayırmak öneririm;

// this declaration + the use of in_array() isn't necessary,
// it just makes things a bit cleaner.
$file_types = array("image/gif","image/jpeg","image/png"); 

if($_FILES["image$i"]["size"] < 500000)
{
    if(in_array($_FILES["image$i"]["type"], $file_types)))
    {
        // do stuff
    }
    else
    {
        // error about file type
    }
}
else
{
    // error about file size
}

Bu ayrılık olması kodu daha okunaklı hale getirir ve daha kolay bir durum hiyerarşisini göstermektedir, PLUS bu hata mesajları daha anlamlı olmasını sağlar. Bu herhangi bir hata iletileri yararlı kalır, böylece farklı koşullu ifadeleri ayırmak için iyi bir uygulamadır. Olduğu gibi sizin kod bir hata attıysa, kullanıcı görüntü çok büyük ya da yanlış tipi olup olmadığını (kendileri hakkında faff zorunda kalmadan) bilmenin bir yolu vardır.

Peki, boolean mantık belirsiz ve büyük olasılıkla istediğiniz ne yapıyorsun değildir. Bu muhtemelen daha iyi çalışır:

    if ((($_FILES["image$i"]["type"] == "image/gif")
    || ($_FILES["image$i"]["type"] == "image/jpeg")
    || ($_FILES["image$i"]["type"] == "image/png" ))
    && ($_FILES["image$i"]["size"] < 500000))

: Benim Aslına bakarsanız, tüm şey gibi görünecektir rağmen

    $file = $_FILES['image' . $i];
    $type = $file['type'];
    if(($type == 'image/gif' || $type == 'image/jpeg' || $type == 'image/png') && $file['size'] < 500000)

Ben gerçekten JavaScript ile güncellenen bir değişken gerekir sanmıyorum. Sen checking the error code tarafından yüklenen kaç dosya üzerinden çalışmak için PHP kullanabilirsiniz. Farklı tarayıcılar genellikle farklı MIME türlerini gönderebilirsiniz gibi, çok dosya uzantısını kontrol ederek dosya yüklenenler ele verebilir. İşte ben neden bahsettiğimi bir örnek:

$accepted_files = array(
    'jpg',
    'png',
    'gif',
    'jpeg'
);

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    foreach($_FILES as $key => $upload) {
    	if ($upload['error'] == 0) {
    		$file_parts = explode ('.',$upload['name']);
    		if (in_array($file_parts[sizeof($file_parts)-1], $accepted_files)) {
    			// This type of file is a-ok
    		}
    		else {
    			// Not an accepted file type
    		}
    	}
    }
}

Ben senin if koşullu yanlış olduğunu düşünüyorum. Böyle, oluşan bit maskesidir olan booleans ilk grup etrafında parantez gerekir:

   if ( (($_FILES["image$i"]["type"] == "image/gif")
    || ($_FILES["image$i"]["type"] == "image/jpeg")
    || ($_FILES["image$i"]["type"] == "image/png" ))
    && ($_FILES["image$i"]["size"] < 500000))

Bu doğru "dosyası (gif veya jpeg veya png) bir görüntü olduğunu ve büyüklüğünden daha az ise" anlamına gelir.

Eğer daha önce vardı yolu olasılıkla istenen mantık değildi.

| ['Type'] == tek bir çağrı y in_array($_FILES[...]['type'], $allowed)> | Tüm ['type'] == x birleştirebilirsiniz

$_FILES[..]['type'] contains data sent by the client that is neither checked nor sanitized by php. If the file's type is of any relevance don't rely on $_FILES[..]['type'] or the suffix of $_FILES[..]['name']. Only the actual contents matters. If needed you can test that with the fileinfo extension or mime_content_type() (which is marked as deprecated in favour of fileinfo)