Avatar billede oldnick Nybegynder
27. april 2006 - 00:43 Der er 15 kommentarer og
1 løsning

Simplet upload og image resize script!!

Hej

Jeg har nu brugt en del tid på at lede efter et enkelt script som kan uploade og resize et billede. Her er ikke tale om at den skal lave en thumbnail.

Det jeg vil have script skal kunne er at det billede jeg uploader fra en form skal blive resized til en bestemt brede og højden skal være felxible og lagt i en mappe på serveren, hvor jeg selffølgelig kan bestemme breden og stien til mappen.

Jeg ved der en masse script på nettet på netop dette emne, men igen af den jeg har fundet gør præsis det jeg vil ha'.
Hvis der er nogen som ligger inde med sådan et script så vil jeg være meget taknemmelig.

På forhånd tak.
Avatar billede jakobdo Ekspert
27. april 2006 - 09:39 #1
Hvis vi "kun" snakker jpeg, så har jeg allerede et script som kan hjælpe dig på vej.
Avatar billede oldnick Nybegynder
27. april 2006 - 10:33 #2
Jep, det er kun jpeg's, det ville være super. :)
Avatar billede jakobdo Ekspert
27. april 2006 - 10:48 #3
Prøv denne:

<?php

function resize( $filename, $newfilename, $maxw, $maxh )
{
    $srcim = imagecreatefromjpeg( $filename );
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
    $wscale = $maxw / $ow;
    $hscale = $maxh / $oh;
    $scale = ( $hscale < $wscale ? $hscale : $wscale );
    $nw = round( $ow * $scale, 0 );
    $nh = round( $oh * $scale, 0 );
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
    imagejpeg( $dstim, $newfilename, 85 );
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return file_exists($newfilename);
}

$uploadDir = "/PATH/"; //Husk mappen skal chmod'es til 644
$maxHeigth = 100;
$maxWidth  = 100;
$maxSize  = 4 //Angives i MB
$pics      = array('jpeg','jpg','jpe'); //Hvilke filtyper vil vi godtage?

$maxSize  = $maxSize * 1024 * 1024;

if($_FILES['userFile']['size'] > 0)
{
    $uploadfile = $uploaddir . basename($_FILES['userFile']['name']);
   
    if($_FILES['userFile']['size'] > $maxSize)
    {
        echo "Dit billede er for stort, prøv med mindre...";
        exit();
    }
   
    $ext = strtolower(end(explode('.',$_FILES['userFile']['name']);
   
    if(!in_array($ext,$pics))
    {
        echo "Forkert billede format, prøv med et andet...";
        exit();
    }

    resize( $_FILES['userFile']['tmp_name'], $uploadfile, $maxWidth, $maxHeight );
   
    header("location: " . $_SERVER['PHP_SELF']);
    exit();
}
?>

<form enctype="multipart/form-data" action="<?=$_SERVER['PHP_SELF'];?>" method="POST">
<table>
    <tr><td>Send this file:</td><td><input name="userFile" type="file" /></td></tr>
    <tr><td colspan="2"><input type="submit" value="Send File" /></td></tr>
</table>
</form>

PS: Er ikke testet, så måske jeg har overset et par fejl! (det plejer jeg gerne) :o)
Avatar billede oldnick Nybegynder
27. april 2006 - 12:15 #4
:) Ja, man kan desværre aldrig helt undgå små fejl..
Jeg får denne her fejl:
Parse error: syntax error, unexpected T_VARIABLE in /customers/hensel.dk/hensel.dk/httpd.www/upload_ny.php on line 33

Her er mit php doc.:
Jeg har ændret $maxheight til 2000 fordi jeg vil have den skal være proportional i forholdt til width. Kan man ikke lave en if som tager højde for det?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Upload ny</title>
</head>

<body>
<?php

function resize( $filename, $newfilename, $maxw, $maxh )
{
    $srcim = imagecreatefromjpeg( $filename );
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
    $wscale = $maxw / $ow;
    $hscale = $maxh / $oh;
    $scale = ( $hscale < $wscale ? $hscale : $wscale );
    $nw = round( $ow * $scale, 0 );
    $nh = round( $oh * $scale, 0 );
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
    imagejpeg( $dstim, $newfilename, 85 );
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return file_exists($newfilename);
}

$uploadDir = "/images/blog/"; //Husk mappen skal chmod'es til 644
$maxHeigth = 2000;
$maxWidth  = 550;
$maxSize  = 4 //Angives i MB
$pics      = array('jpeg','jpg','jpe'); //Hvilke filtyper vil vi godtage?

$maxSize  = $maxSize * 1024 * 1024;

if($_FILES['userFile']['size'] > 0)
{
    $uploadfile = $uploaddir . basename($_FILES['userFile']['name']);
 
    if($_FILES['userFile']['size'] > $maxSize)
    {
        echo "Dit billede er for stort, prøv med mindre...";
        exit();
    }
 
    $ext = strtolower(end(explode('.',$_FILES['userFile']['name']);
 
    if(!in_array($ext,$pics))
    {
        echo "Forkert billede format, prøv med et andet...";
        exit();
    }

    resize( $_FILES['userFile']['tmp_name'], $uploadfile, $maxWidth, $maxHeight );
 
    header("location: " . $_SERVER['PHP_SELF']);
    exit();
}
?>

<form enctype="multipart/form-data" action="<?=$_SERVER['PHP_SELF'];?>" method="POST">
<table>
    <tr><td>Send this file:</td><td><input name="userFile" type="file" /></td></tr>
    <tr><td colspan="2"><input type="submit" value="Send File" /></td></tr>
</table>
</form>
</body>
</html>
Avatar billede jakobdo Ekspert
27. april 2006 - 12:45 #5
Der var 2 fejl i min kode.
Du skal tilføje ; i linien:
$maxSize  = 4; //Angives i MB

Du skal tilføje 2 )) i linien:
$ext = strtolower(end(explode('.',$_FILES['userFile']['name'])));
Avatar billede oldnick Nybegynder
27. april 2006 - 12:51 #6
Jep, dem har jeg også lige fundet frem til.

men da jeg så prøvede at uploade fik jeg disse fejl:
Warning: imagecreatetruecolor() [function.imagecreatetruecolor]: Invalid image dimensions in /customers/hensel.dk/hensel.dk/httpd.www/upload_ny.php on line 21

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /customers/hensel.dk/hensel.dk/httpd.www/upload_ny.php on line 22

Warning: imagejpeg(): supplied argument is not a valid Image resource in /customers/hensel.dk/hensel.dk/httpd.www/upload_ny.php on line 23

Warning: imagedestroy(): supplied argument is not a valid Image resource in /customers/hensel.dk/hensel.dk/httpd.www/upload_ny.php on line 24

Warning: Cannot modify header information - headers already sent by (output started at /customers/hensel.dk/hensel.dk/httpd.www/upload_ny.php:9) in /customers/hensel.dk/hensel.dk/httpd.www/upload_ny.php on line 57

Det er sku fedt at du vil hjælpe, jeg har virkeligt brugt lang tid på google og diverse php side for at finde det her... :)
Avatar billede jakobdo Ekspert
27. april 2006 - 13:15 #7
Hvilken version bruger du af GDLIB?
phpinfo();
Og hvor stort er det billede du forsøger at ændre?
Det kan være 2000 måske er for højt.
Prøv at start med at test 100x100
Avatar billede oldnick Nybegynder
27. april 2006 - 13:28 #8
GD Version bundled (2.0.28 compatible)

kan man ikke lave det sådan at højden ikke skal defineres, men automatisk blive sat i forhold til bredden??

Har lige testet den med 100x100 og det billede jeg vil uploade er er jpg på 640x480.
Avatar billede jakobdo Ekspert
27. april 2006 - 13:33 #9
Kommer fejlen også hvis du bruger: 100 x 100?
Avatar billede oldnick Nybegynder
27. april 2006 - 13:35 #10
Ja, det gør den.
Avatar billede jakobdo Ekspert
27. april 2006 - 13:39 #11
Fang mig på msn: jakobdo (at) hotmail {dot} com
Avatar billede oldnick Nybegynder
27. april 2006 - 13:52 #12
Det gør jeg når jeg kommer hjem, jeg sidder bag en firewall som ikke tillader msn. Jeg har fri nu så jeg prøver om 1 times tid. Super.. min er mads (at) oldnick (dot) dk
Avatar billede jakobdo Ekspert
27. april 2006 - 20:31 #13
Og fejlen var: $maxHeigth = 100; skulle være: $maxHeight = 100; <--- HT og ikke TH
og et svar...
Avatar billede oldnick Nybegynder
27. april 2006 - 20:33 #14
Her er hele den rigtige kode som jakobdo, så venligst leveret! Det er altid rart når man også kan finde svartet :)

<?php

function resize( $filename, $newfilename, $maxw, $maxh )
{
    $srcim = imagecreatefromjpeg( $filename );
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
    $wscale = $maxw / $ow;
    $hscale = $maxh / $oh;
    $scale = ( $hscale < $wscale ? $hscale : $wscale );
    $nw = round( $ow * $scale, 0 );
    $nh = round( $oh * $scale, 0 );
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
    imagejpeg( $dstim, $newfilename, 85 );
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return file_exists($newfilename);
}

$uploadDir = "/images/"; //Husk mappen skal chmod'es til 644
$maxHeight = 500;
$maxWidth  = 500;
$maxSize  = 4; //Angives i MB
$pics      = array('jpeg','jpg','jpe'); //Hvilke filtyper vil vi godtage?

$maxSize  = $maxSize * 1024 * 1024;

if($_FILES['userFile']['size'] > 0)
{
    $uploadfile = $uploaddir . basename($_FILES['userFile']['name']);
 
    if($_FILES['userFile']['size'] > $maxSize)
    {
        echo "Dit billede er for stort, prøv med mindre...";
        exit();
    }
 
    $ext = strtolower(end(explode('.',$_FILES['userFile']['name'])));
 
    if(!in_array($ext,$pics))
    {
        echo "Forkert billede format, prøv med et andet...";
        exit();
    }

    if(!resize( $_FILES['userFile']['tmp_name'], $uploadfile, $maxWidth, $maxHeight ))
    {
        echo "Det fejlede at resize billedet : " . $uploadfile . "! Prøv igen<br />";
    }
    else
    {
        header("location: " . $_SERVER['PHP_SELF']);
        exit();
    }
}
?>

<form enctype="multipart/form-data" action="<?=$_SERVER['PHP_SELF'];?>" method="post">
<table>
    <tr><td>Send this file:</td><td><input name="userFile" type="file" /></td></tr>
    <tr><td colspan="2"><input type="submit" value="Send File" /></td></tr>
</table>
</form>
Avatar billede jakobdo Ekspert
27. april 2006 - 20:38 #15
Takker for point.
Avatar billede oldnick Nybegynder
27. april 2006 - 22:49 #16
Der var lige en sidste fejl så her kommer scriptet igen i sin endelige udgave. Fejlen var at $uploaddir skulle være $uploadDir:

Scriptet gør: Uploader og resizer et billede, hvor brede er fast og højden er variable.

Final:

<?php

function resize( $filename, $newfilename, $maxw, $maxh )
{
    $srcim = imagecreatefromjpeg( $filename );
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
    $wscale = $maxw / $ow;
    $hscale = $maxh / $oh;
    $scale = ( $hscale < $wscale ? $hscale : $wscale );
    $nw = round( $ow * $scale, 0 );
    $nh = round( $oh * $scale, 0 );
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
    imagejpeg( $dstim, $newfilename, 85 );
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return file_exists($newfilename);
}

$uploadDir = "images/"; //Husk mappen skal chmod'es til 644
$maxHeight = 550;
$maxWidth  = 550;
$maxSize  = 4; //Angives i MB
$pics      = array('jpeg','jpg','jpe'); //Hvilke filtyper vil vi godtage?

$maxSize  = $maxSize * 1024 * 1024;

if($_FILES['userFile']['size'] > 0)
{
    $uploadfile = $uploadDir . basename($_FILES['userFile']['name']);
 
    if($_FILES['userFile']['size'] > $maxSize)
    {
        echo "Dit billede er for stort, prøv med mindre...";
        exit();
    }
 
    $ext = strtolower(end(explode('.',$_FILES['userFile']['name'])));
 
    if(!in_array($ext,$pics))
    {
        echo "Forkert billede format, prøv med et andet...";
        exit();
    }

    if(!resize( $_FILES['userFile']['tmp_name'], $uploadfile, $maxWidth, $maxHeight ))
    {
        echo "Det fejlede at resize billedet : " . $uploadfile . "! Prøv igen<br />";
    }
    else
    {   
        header("location: " . $_SERVER['PHP_SELF']);
        exit();
    }
}
?>

<form enctype="multipart/form-data" action="<?=$_SERVER['PHP_SELF'];?>" method="post">
<label>Upload picture:</label> <input name="userFile" type="file" />
<input type="submit" value="Send File" />
</form>
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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