Avatar billede doncarnage Nybegynder
05. marts 2009 - 16:45 Der er 13 kommentarer og
1 løsning

Billedeupload - resize/crop og omdøbning

Pænt goddag..

Med hjælp fra artiklerne herinde har jeg fået strikket et billedeupload system sammen, hvor den automatisk generer en thumbnail.. Det ser ud som følgende:

<?php
//Settings:
$uploadDir = 'images/profiles/'; // husk chmod 777
$allowedFileTypes = array('jpg');

//Thumbs settings:
$thumbDir = 'images/profiles/'; // husk chmod 777
$thumbPrefix = 'small_';
$thumbHeight = 70;
$thumbWidth = 55;
$thumbQuality = 85;

//Funktioner som bruges:
function getExtension($filename){
return strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
}

function resize( $filename, $newfilename, $maxw, $maxh, $quality=85 )
{
$extension = getExtension($filename);
switch($extension)
{
case 'jpeg':
case 'jpe':
case 'jpg':
$srcim = imagecreatefromjpeg( $filename );
break;
default:
return false;
}
$ow = imagesx( $srcim );
$oh = imagesy( $srcim );
$wscale = $maxw / $ow;
$hscale = $maxh / $oh;
$scale = min( $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 );
switch($extension)
{
case 'jpeg':
case 'jpe':
case 'jpg':
imagejpeg( $dstim, $newfilename, $quality );
break;
default:
return false;
}
imagedestroy( $dstim );
imagedestroy( $srcim );
return file_exists($newfilename);
}

//Er der trykket på Upload file knappen?
if(isset($_POST['myUpload']))
{
//Har vi en fil?
if(is_uploaded_file($_FILES['myFile']['tmp_name']))
{
//Filendelse
$extension = getExtension($_FILES['myFile']['name']);

//Er filens type godkendt?
if(in_array($extension,$allowedFileTypes))
{
//Vi flytter filen fra tmp til vores UPLOADDIR
if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . basename($_FILES['myFile']['name'])))
{
if(resize($uploadDir . basename($_FILES['myFile']['name']), $thumbDir . $thumbPrefix . basename($_FILES['myFile']['name']), $thumbWidth, $thumbHeight, $thumbQuality)){
echo '<h3 style="color:green;">File ('.basename($_FILES['myFile']['name']).') uploaded and resized succesfully</h3>';
}else{
echo '<h3 style="color:red;">File ('.basename($_FILES['myFile']['name']).') uploaded succesfully, but resize failed</h3>';
}
}
else
{
echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['myFile']['name']).'</h3>';
}
}
else
{
echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';
}
}
else
{
echo '<h3 style="color:red;">No file selected<h3>';
}
}

//Vores form
echo '<form action="upload.php" method="post" enctype="multipart/form-data">';
echo 'File ('.implode(',',$allowedFileTypes).'): <input type="file" name="myFile"><br />';
echo '<input type="submit" name="myUpload" value="Upload file">';
echo '</form>';

?>


Det første problem opstår i at mine thumbs godt når bliver resized, så de er 55 i bredden. Men højden bliver ikke sat til 70 som jeg ønsker, højst sandsynligt pga. det bliver lavet på samme måde som i photoshop hvis man vælger "constrain proportions" ved resize.. Hvordan får jeg lavet sådan at den laver thumbs med målene 70x55 UANSET hvilke dimensioner de har når de bliver uploadet? Er vi ude i noget crop her eller hvordan?

Andet problem er lidt mindre og det ligger i at jeg ikke lige kan finde frem til hvordan jeg ændrer navnet på både det normale billede + thumb til noget andet end hvad det hedder når jeg uploader det?

Det sidste problem ligger i at jeg gerne vil have at den ligesom med thumbsne også resizer det oprindelige billede som bliver uploadet. Hvis jeg får det gjort har jeg også på fornemmeren at det bliver lidt lettere at løse første problem. Men hvordan gør jeg det?
Avatar billede jakobdo Ekspert
05. marts 2009 - 16:50 #1
Ret:
$ow = imagesx( $srcim );
$oh = imagesy( $srcim );
$wscale = $maxw / $ow;
$hscale = $maxh / $oh;
$scale = min( $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 );
til:
$ow = imagesx( $srcim );
$oh = imagesy( $srcim );
$nw = $maxw;
$nh = $maxh;
$dstim = imagecreatetruecolor( $nw, $nh );
imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );

Her angives navnet:
Navn på filen: basename($_FILES['myFile']['name'])

if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . basename($_FILES['myFile']['name'])))

Navn på resized bilelde: $thumbPrefix . basename($_FILES['myFile']['name'])

if(resize($uploadDir . basename($_FILES['myFile']['name']), $thumbDir . $thumbPrefix . basename($_FILES['myFile']['name']), $thumbWidth, $thumbHeight, $thumbQuality)){

Du kan bare bruge samme resize funktion flere gange i træk, med forskellige værdier. :o)
Avatar billede doncarnage Nybegynder
05. marts 2009 - 17:02 #2
Det var satme hurtig respons, props for det ;)
Billede størrelsen virker som den skal nu - dejligt!

Men hvordan siger du så jeg skal omdøbe billederne? I mit tilfælde vil jeg gerne have at billeder hedder det som min bruger session er sat til, så de er tilknyttet hver enkelt bruger. På den måde skal de gerne blive overskrevet når en bruger uploader et nyt billede, så profilbillederne ikke hober sig alt for meget op :)
Avatar billede jakobdo Ekspert
05. marts 2009 - 17:08 #3
Hvis vi tager denne linje:

if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . basename($_FILES['myFile']['name'])))

Så er delen: $_FILES['myFile']['tmp_name']
vores midlertidige fil.

Og: $uploadDir . basename($_FILES['myFile']['name'])
Er vores dir og filens kommende navn.

og selve: basename($_FILES['myFile']['name'])
er navnet.
Så hvis du ønsker en anden værdi, så kunne du lave:

if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . 'NYT_NAVN.ENDELSE'))
Avatar billede andreas13_fam Nybegynder
05. marts 2009 - 17:11 #4
Til at omdøbe brug: rename
Til at slette brug: unlink
Jeg kan ikke give dig link til PHP.net så må google
Avatar billede doncarnage Nybegynder
05. marts 2009 - 17:25 #5
jakobdo:

Det virkede fint nok med at få omdøbt min thumb, men hvis jeg følger det eksempel som du med gav med det originale billede får jeg den her fejl..

Koden:

if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . 'tralala.jpg'))

Fejlmeddelelsen:

Warning: imagecreatefromjpeg(images/profiles/024.JPG) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in C:\Programmer\xampp\htdocs\her\upload.php on line 26

Warning: imagesx(): supplied argument is not a valid Image resource in C:\Programmer\xampp\htdocs\her\upload.php on line 31

Warning: imagesy(): supplied argument is not a valid Image resource in C:\Programmer\xampp\htdocs\her\upload.php on line 32

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in C:\Programmer\xampp\htdocs\her\upload.php on line 36

Warning: imagedestroy(): supplied argument is not a valid Image resource in C:\Programmer\xampp\htdocs\her\upload.php on line 49
Avatar billede jakobdo Ekspert
05. marts 2009 - 17:54 #6
Du skal jo også rette i kaldet til funktionen resize() :o)
Avatar billede doncarnage Nybegynder
05. marts 2009 - 18:50 #7
Ah ja, naturligvis ;) Jeg lader lige tråden stå åben og prøver  at kigge på det med at få det originale billede resized i et par timer - og hvis ikke det lykkedes mig skriver jeg lige herinde igen hvis det er i orden :)
Avatar billede jakobdo Ekspert
05. marts 2009 - 21:17 #8
Du skriver bare løs, så skal jeg svare så godt som muligt.
Avatar billede doncarnage Nybegynder
05. marts 2009 - 23:12 #9
Synes nu jeg har prøvet adskillige muligheder, men det er ikke lykkedes mig at få den til at gøre som jeg ville :/ Jeg tror efterhånden jeg er kommet til at stire mig blind på koden :(

Min kode ser sådan her ud nu:

<?php

//Settings:
$uploadDir = 'images/profiles/'; // husk chmod 777
$allowedFileTypes = array('jpg');

//Thumbs settings:
$thumbDir = 'images/profiles/'; // husk chmod 777
$thumbPrefix = '_small';
$thumbHeight = 70;
$thumbWidth = 55;
$thumbQuality = 85;

//Funktioner som bruges:
function getExtension($filename){
return strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
}

function resize( $filename, $newfilename, $maxw, $maxh, $quality=85 )
{
$extension = getExtension($filename);
switch($extension)
{
case 'jpeg':
case 'jpe':
case 'jpg':
$srcim = imagecreatefromjpeg( $filename );
break;
default:
return false;
}
$ow = imagesx( $srcim );
$oh = imagesy( $srcim );
$nw = $maxw;
$nh = $maxh;
$dstim = imagecreatetruecolor( $nw, $nh );
imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );

switch($extension)
{
case 'jpeg':
case 'jpe':
case 'jpg':
imagejpeg( $dstim, $newfilename, $quality );
break;
default:
return false;
}
imagedestroy( $dstim );
imagedestroy( $srcim );
return file_exists($newfilename);
}

//Er der trykket på Upload file knappen?
if(isset($_POST['myUpload']))
{
//Har vi en fil?
if(is_uploaded_file($_FILES['myFile']['tmp_name']))
{
//Filendelse
$extension = getExtension($_FILES['myFile']['name']);

//Er filens type godkendt?
if(in_array($extension,$allowedFileTypes))
{
//Vi flytter filen fra tmp til vores UPLOADDIR
if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . $_SESSION['test']  . '.jpg'))
{
if(resize($uploadDir .  $_SESSION['test'] . '.jpg' , $thumbDir . $_SESSION['test'] . $thumbPrefix . '.jpg' , $thumbWidth, $thumbHeight, $thumbQuality)){
echo '<h3 style="color:green;">File ('.basename($_FILES['myFile']['name']).') uploaded and resized succesfully</h3>';

}else{
echo '<h3 style="color:red;">File ('.basename($_FILES['myFile']['name']).') uploaded succesfully, but resize failed</h3>';
}
}
else
{
echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['myFile']['name']).'</h3>';
}
}
else
{
echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';
}
}
}

//Vores form
echo '<form action="upload.php" method="post" enctype="multipart/form-data">';
echo 'File ('.implode(',',$allowedFileTypes).'): <input type="file" name="myFile"><br />';
echo '<input type="submit" name="myUpload" value="Upload file">';
echo '</form>';

?>


Det virker som det skal bortset fra at det originale billede beholder sine oprindelige dimensioner.. Du kan vel ikke give mig nogle hints på vej til at få det løst? Ved godt at jeg kan genbruge funktionen med resize, men er meningen så at jeg skal lave et nyt "thumb", hvorefter det oprindelige billede så skal slettes eller hvordan ?
Avatar billede jakobdo Ekspert
05. marts 2009 - 23:30 #10
Du bør nok rette:
if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . $_SESSION['test']  . '.jpg'))
til:
if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . $_SESSION['test']  . $endelse'))

Og resize til:

if(resize($uploadDir .  $_SESSION['test'] . '.jpg' , $thumbDir . $_SESSION['test'] . $thumbPrefix . '.jpg' , $thumbWidth, $thumbHeight, $thumbQuality)){
til:
if(resize($uploadDir .  $_SESSION['test'] . $endelse , $thumbDir . $thumbPrefix . $_SESSION['test'] . $endelse , $thumbWidth, $thumbHeight, $thumbQuality)){
Avatar billede doncarnage Nybegynder
05. marts 2009 - 23:41 #11
Jeps okay, så er den klaret.. dog lige med lidt få ændringer ;) Men havde du nogle hints til hvordan jeg klarede ovenstående problem så ?
Avatar billede doncarnage Nybegynder
06. marts 2009 - 05:24 #12
Jeg havde ret i min første antagelse i at jeg var overtræt og havde set mig blind på kodningen.. Har i hvert fald fået det til at virke nu efter hensigten ;)

Nu har jeg så bare siddet den sidste time og prøvet at få scriptet implementeret på min side, men det er tilsyneladende noget mere tricky end som sådan. Men det må jeg prøve at se videre på efter lidt mere søvn..

Smid et svar jakobdo og mange tak for hjælpen ;)
Avatar billede jakobdo Ekspert
06. marts 2009 - 17:39 #13
Svar!
Avatar billede jakobdo Ekspert
06. marts 2009 - 17:45 #14
Takker for point.
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