Avatar billede Tenletters Juniormester
16. december 2009 - 16:47 Der er 10 kommentarer og
1 løsning

Restriktion på upload af billeder

Jeg har et simpelt php-script som kan uploaded en fil til ens server samt smide noget data i en database. Scriptet fungerer fint, og jeg skal udelukkende bruge det til at uploade billeder med. Men der er 2 funktioner jeg savner:

- maks størrelse på filen der bliver uploadet (f.eks. 100 kb)
- check om højde/bredde på billedet er korrekt (300 x 200 i dette tilfælde)

Kan man lave det i scriptet?

--------------------------------------

<?php
$allowed = array("jpeg","gif","png","jpg"); 
?>
<form action="" method="post" enctype="multipart/form-data">
Choose file to upload <input name="upload" type="file">
<input name="sb" id="sb" value="go" type="submit">
</form>
<?php
mysql_connect("localhost","username","password") or die("Could not connect: " . mysql_error());
mysql_select_db("database");
$result = mysql_query("select MAX(id) as maxnum from files");
$row = mysql_fetch_array($result);
$number = $row[maxnum] + 1;

if(isset($_POST['sb'])) {
$pathInfo = pathinfo($_FILES["upload"]["name"]);
$extension = $pathInfo['extension'];
$dir = "uploadFolder";
if(!in_array($extension, $allowed)) die("Extension not allowed!");
if(move_uploaded_file($_FILES['upload']['tmp_name'], "$dir/$number".$_FILES['upload']['name'])) {
    print "Your new file can be viewed/download at <input name=\"newfile\" value=\"http://$_SERVER[HTTP_HOST]/test4/$dir/$number".$_FILES['upload']['name']."\" type=\"text\" style=\"width: 300px\">";
}else{
    print "File could not be uploaded";
}

mysql_free_result($result); 

mysql_query("insert into files(id) values ('$number')");
print mysql_error();
}
?>
Avatar billede Tenletters Juniormester
16. december 2009 - 17:00 #1
Filstørrelsen må kunne sikres via dette:

if(move_uploaded_file($_FILES['upload']['tmp_name'], "$dir/$number".$_FILES['upload']['name'])) && ($_FILES['upload']['size'] < 100000)

Men det smider en fejl som det står der.
Avatar billede Tenletters Juniormester
16. december 2009 - 17:02 #2
Ah det var bare lidt () fejl:

if(move_uploaded_file($_FILES['upload']['tmp_name'], "$dir/$number".$_FILES['upload']['name']) &&     $_FILES['upload']['size'] < 100000) {
Avatar billede Tenletters Juniormester
16. december 2009 - 17:04 #3
Og det virker; en fil på + 100 kb kunne ikke uploades.

Små er det bare størrelsen der mangler.
Avatar billede xicrow Nybegynder
16. december 2009 - 17:08 #4
Hej Tenletters.

Angående billedets størrelse (altså bredde og højde), kan du billedet er blevet uploaded bruge funktionen getimagesize() (http://php.net/getimagesize). Her kommer lige et eksempel:

$image_path = $dir.'/'.$number.$_FILES['upload']['name'];
list($width, $height) = getimagesize($image_path);

if ($width > 300){
  // ...
}
if ($height > 200){
  // ...
}

/xicrow
Avatar billede Tenletters Juniormester
16. december 2009 - 17:08 #5
Åh træls...

Ved nærmere eftersyn så bliver filen faktisk uploadet alligevel. Tror den restriktion skal placeres "højere oppe" so to speak.
Avatar billede xicrow Nybegynder
16. december 2009 - 17:11 #6
Problemet med fil størrelsen, ser ud til at ligge i din if, tjek filstørrelsen INDEN du prøver at flytte den...:

if ($_FILES['upload']['size'] < 100000){
  if (move_uploaded_file($_FILES['upload']['tmp_name'], "$dir/$number".$_FILES['upload']['name'])){
    // ...
  }
}

/xicrow
Avatar billede Tenletters Juniormester
16. december 2009 - 17:29 #7
Okay så blev det løst ved at bruge den her: http://www.w3schools.com/PHP/php_file_upload.asp

Så mangler højre/bredde bare.
Avatar billede Tenletters Juniormester
16. december 2009 - 17:34 #8
Ah heh yeps.

Mht. getimagesize() så bruger man den kun efter billedet er blevet uploadet korrekt?
Avatar billede Tenletters Juniormester
16. december 2009 - 18:03 #9
Jeg tror jeg har nok til at få det på plads nu. Smid et svar xicrow
xicrow :)
Avatar billede showsource Seniormester
16. december 2009 - 18:33 #10
Str. bruger du på tmp_name

D.v.s. tempfilen ved upload checkes for str.


if(false == ($xy = getimagesize($_FILES['upload']['tmp_name']))) {
echo"Det er IKKE et billede!";
exit;
}
Avatar billede xicrow Nybegynder
17. december 2009 - 08:40 #11
Og så kom der lige et svar

/xicrow
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester