Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kuvan tallennus

karvinen [26.10.2004 14:13:36]

#

Tiedosto lähetetään formilla toiselle tiedostolle.
Tiedoston nimen saa napattua seuraavasti:

$realname = $HTTP_POST_FILES['kuva']['name'];

Miten saa napattua pelkän tiedostopäätteen.
.jpg .exe .gif ym tyyliin

ajv [26.10.2004 16:41:25]

#

Hmm... Tiedostopäätteen saat selville esim. seuraavalla tyylillä:

<?php
$realname = $HTTP_POST_FILES['kuva']['name'];
$ext = substr($realname,strrpos($realname,".")+1); //tiedoston pääte esim 'jpg'
?>

Asiasta lisää täällä

Sen, että kyseessä on kuva saa toki muutenkin varmistettua. Tässä pieni lainaus kuvanuppimis-koodistani:

<?php
//maksimi tiedostokoko megatavuina
$pic_max_size = 2;
$pic_max_size *= 1024*1024; //muutetaan tavuiksi
$pic_tmp_dir = "images/tmp/"; //alkuperäiset kuvat tänne säilöön väliaikaisesti

if(isset($_FILES['pic'])){// ollaan tultu formin kautta ja lähetetty tiedosto

   //vähän niinkuin register globals: $_FILES['pic'][tmp_name'] löytyy tämän jälkeen muuttujasta $tmp_name
   foreach($_FILES['pic'] as $var => $val){
      $$var = $val;
   }

   if(@is_uploaded_file($tmp_name)){// kuva on ladattu palvelimen tmp-hakemistoon

	  if($size < $pic_max_size){

	     if(@move_uploaded_file($tmp_name,$pic_tmp_dir.$name)){// siirretään se omaan tmp-hakemistoon

		    //tehdään varmistukset, että ollaan saatu kuva, eikä jotain h4x0r-ohjelmaa :)
		    $im = @getimagesize($pic_tmp_dir.$name);
		    if($im[2] == 1 || $im[2] == 2 || $im[2] == 3){ // kuva on gif, jpg tai png formaattia
		       //ja jos kaikki meni odotusten mukaan, voidaan siirtyä seuraavalle sivulle
	           header("Location: create_image.php?im=$name");
		    }else{
		       echo "Kuva ei ole tuettua formaattia";
			   unlink($pic_tmp_dir.$name); // tuhotaan kuva heti pois
		    }
	     }else{
	        echo "Tiedoston <b>$name</b> siirtäminen epäonnistui.";
	     }

	  }else{
	     echo "Tiedoston koko <b>".round($size/1024)." kt</b> ylitti sallitun rajan <b>".round($pic_max_size/1024)." kt</b>.";
      }

   }else{
      //virheenkäsittely rutiini
	  //found from https://www.php.net/manual/en/function.is-uploaded-file.php
      switch($error){
	    case 0: //no error; possible file attack!
		   echo "There was a problem with your upload.";
		   break;
		case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini
		   echo "Tiedoston koko <b>".($size/1024)."</b> ylitti palvelimen salliman rajan.";
		   break;
		case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form
		   echo "Tiedoston koko ylitti sallitun rajan <b>$pic_max_size</b>.";
		   break;
		case 3: //uploaded file was only partially uploaded
		   echo "The file you are trying upload was only partially uploaded.";
		   break;
		case 4: //no file was uploaded
		   echo "You must select an image for upload.";
		   break;
		default: //a default error, just in case!  :)
		   echo "There was a problem with your upload.";
		   break;
      }
   }
}else{
   echo "Ei kuvaa";
}
?>

Tuo siis tarkistaa, että on kyseessä oikeasti kuva, eli esim tavallinen txt-tiedosto, joka on nimetty tekstitiedosto.jpg ei mene läpi. Muutenkin olen hieman tuohon virheenkäsittelyyn panostanut :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta