webForumDet fria alternativet

Bilduppladdning med filändelsekontroll

PHP

2 svar · 1 042 visningar · startad av prplxr

Medlem sedan juni 2012581 inlägg
Frågan#1

Hej!

Sitter just nu och pillar med ett uppladdningsscript som tar den uppladdade filen (som skall vara en bild) och förminskar den. Detta blir naturligtvis riksknas om man laddar upp något annat än just bilder. Jag funderar nu på hur man ska kontrollera detta. Att titta på vilken MIME type filen har verkar inte tillförlitligt då den infon inte alltid finns, så jag klurade på en lösning med kontroll av filändelse istället och har fått det att fungera lite halvt.

Här är koden jag har för tillfället:

<?php

	if(@$_GET['a'] == 'save') {
		
		
		//die(substr($file['name'], -3, 3));
		
    // filändelsekontroll
   $allowedExtensions = array("jpg","jpeg","gif","png"); 
   foreach ($_FILES as $file) { 
     if ($file['tmp_name'] != '') { 
       if ( !(in_array( end( explode( ".", strtolower($file['name']) ) ), $allowedExtensions)) || substr($file['name'], -3, 3) == 'zip' ) { 
        die($file['name'].' är ej av godkänd filtyp (jpg, jpeg, gif eller png)!<br/>'. 
         '<a href="javascript:history.go(-1);">'. 
         '&lt;&lt Backa</a>'); 
       } 
     } 
   } 
   // slut kontroll av filändelse.
		
		
		
		if(@$_FILES['newAvatar']['name'] != '') {
			$filename = 'profpics/' . $_SESSION['id'] . '__' . date("Y_m_d__H_i_s") . '__' . $_FILES['newAvatar']['name'];
			move_uploaded_file($_FILES['newAvatar']['tmp_name'], $filename);
			
				$image = imagecreatefromjpeg($filename);
	
				// Max slutliga dimensioner
				$max_width = 140;
				$max_height = 190;
				
				// Nuvarande dimensioner
				$old_width  = imagesx($image);
				$old_height = imagesy($image);
				
				// Beräkna skala
				$scale      = min($max_width/$old_width, $max_height/$old_height);
				
				// Sätt nya dimensioner utifrån den beräknade skalan
				$new_width  = ceil($scale*$old_width);
				$new_height = ceil($scale*$old_height);
				
				// Skapa tomt bildobjekt
				$new = imagecreatetruecolor($new_width, $new_height);
				
				// Förminska (troligtvis, annars förstora, men det lär väl aldrig hända)
				imagecopyresampled($new, $image, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height);
			     
				// Spara
				imagejpeg($new, $filename, 60);
				
				// Förstör objekt
				imagedestroy($image);
				imagedestroy($new);
?>

Anledningen till att jag lagt till "substr($file['name'], -3, 3) == 'zip'" är för att just .zip-filer smiter igenom kontrollen. Jag har stirrat så länge på detta nu. Vad gör jag för fel?

:stud

Medlem sedan juni 2012581 inlägg
#2

Jag vill också föra till protokollet att jag vet att jag inte skrivit någon kod som skiljer på jpeg/gif/png när jag läser in mitt bildobjekt ($image = imagecreatefromjpeg($filename);), men det fixar jag sedan när detta är löst!

Medlem sedan juni 2012581 inlägg
#3

Jag har hittat lösningen. ZIP-filen jag försökte med var för stor så den laddades inte upp alls.

248 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)