Avatar billede webbe Nybegynder
04. november 2010 - 13:40 Der er 25 kommentarer og
1 løsning

Generer thumbnail ved upload af billede

Hej eksperter

Jeg har et upload-script som egentligt fungerer upåklageligt, men nu vil jeg gerne lave det så det opretter thumbnails mens de uploades.

Originalbilledet gemmes i en  mappe der hedder uploads, og thumbnails skal gemmes i en mappe med navnet thumbs.

Når billederne er uploadet gemmes filnavn + andre info i min database.

Jeg har pt. følgende script der pt. kun gemmer originalbilledet i mappen uploads:

if(isset($_POST['ok'])){
  $ptid = $_POST['tid'];
  $target_path = "../img/uploads/";
  $i = 1;
  for($i=1;$i<=5;$i++){
    $target_path = $target_path . basename( $_FILES['img'.$i.'']['name']);
    if(move_uploaded_file($_FILES['img'.$i.'']['tmp_name'], $target_path)) {
        $strFileName = basename($_FILES['img'.$i.'']['name']);
            //create a thumbnail for the gallery
               
        //insert values to table
        $sql = "insert into pictures (ptid,pname,pcd) values (".$ptid.",'".$strFileName."','".date('d-m-Y')."')";
        mysqli_query($db,$sql) or die (mysqli_error($db));
    }else{
        $msg = "Der er opstået en fejl under upload af billede ".$i."!<br /><br />";
            };
        };
    };

Håber der er nogen der kan hjælpe mig
Avatar billede repox Seniormester
04. november 2010 - 14:00 #1
[pre]  //create a thumbnail for the gallery
  $thumb = "../img/uploads/thumbs/" . $_FILES['img'.$i.'']['name'];
 
  $cmd = "convert ".$target_path." -thumbnail 250x90 ".$thumb;
  exec($cmd);[pre]
Avatar billede webbe Nybegynder
04. november 2010 - 14:12 #2
Kan du ikke lige forklare den lidt?

Forstår ikke helt linjen med $cmd
Avatar billede repox Seniormester
04. november 2010 - 14:16 #3
Det er imagemagick - det kan du læse meget mere om her:
http://www.imagemagick.org/Usage/thumbnails/
Avatar billede webbe Nybegynder
04. november 2010 - 14:16 #4
Umiddelbart ser det ikke ud til at der dannes et thumbnail, men kun en kopi af billedet.

Synes der mangler lidt ift. at angive højde/bredde/skalering af thumbnailen.
Avatar billede webbe Nybegynder
04. november 2010 - 14:21 #5
Har prøvet at afvikle den kode, men den uploader bare billedet uden at danne en thumbnail
Avatar billede webbe Nybegynder
04. november 2010 - 14:23 #6
Kan se det er et eksternt komponent der skal downloades og installeres - og det er et no-go på mit webhotel!
Avatar billede repox Seniormester
04. november 2010 - 14:23 #7
Delen '-thumbnail 250x90' i $cmd angiver hvad du laver i hvilken størrelse. Så kan du rette størrelsen til.

Har du imagemgagick på serveren?
Er mappen 'thumbs' oprettet og skrivbar i ../img/uploads/ ?
Avatar billede webbe Nybegynder
04. november 2010 - 14:27 #8
Der er ikke imagemagick på serveren, så jeg kan ikke bruge dit løsningsforslag.
Avatar billede repox Seniormester
04. november 2010 - 14:29 #9
Hvor er du hostet henne? Bare så andre ikke ved et uheld falder i hos en udbyder som ikke følger med udviklingen...
Avatar billede webbe Nybegynder
04. november 2010 - 14:31 #10
Hoster hos Match2Web....
Avatar billede webbe Nybegynder
04. november 2010 - 14:32 #11
Min gamle side er skrevet i ASP, men jeg er igang med at omlægge til PHP og skal have flyttet over på en PHP'server hos dem
Avatar billede repox Seniormester
04. november 2010 - 14:40 #12
Må jeg være så fræk at spørge hvad årsagen er til at du har valgt lige netop dem som hostingudbyder?
Avatar billede webbe Nybegynder
04. november 2010 - 15:24 #13
Det må du da - bestilte i sin tid hos concor.dk, som så har frasolgt al webhosting til match2web.dk
Avatar billede repox Seniormester
05. november 2010 - 08:53 #14
Well, du kan overgå til en GD løsning for at generere dine thumbnails, men jeg må tilstå at der findes væsentligt bedre alternativer til webhosting (på næsten alle fronter) - som også tilbyder bedre grafiske muligheder end GD lib.

Problemet med GD er at du anvender PHP's hukommelse og resultaterne kan ikke altid vurderes som tilfredsstillende. Derimod er ImageMagick - som selv de billigste webudbydere i DK også tilbyder - et perfekt valg til behandling af billeder; IM bruger ikke PHP's hukommelse, det er hurtigt og kan skabe flotte resultater.

Jeg vil allerførst opfordre dig til at skifte webhotelsudbyder - hvis det ikke er en mulighed, må vi jo brygge noget sammen til dig som måske kan virke efter hensigten (hvis din udbyder i det hele taget tilbyder GD - men det ser ikke umiddelbart ud som om de tilbyder ret meget).
Avatar billede wanze Nybegynder
05. november 2010 - 09:13 #15
Repox: Så vidt jeg kan se ud af din kode i #1, så kører indsætter du simpelthen filnavnet direkte i din exec(). Først og fremmest er exec() generelt en farlig legekammerat - og især når den er direkte afhængig af brugerinput.

Hvad ville der fx ske, hvis du vælger at uploade en fil, der hedder "billede.png | rm -rf"? Så vil
[pre]  $cmd = "convert ".$target_path." -thumbnail 250x90 billede.png | rm -rf";[pre] vel blive udført?

Vil kraftigt fraråde at benytte exec() - og endnu mere, når du tager ikke-saniteret brugerinput!
Avatar billede repox Seniormester
05. november 2010 - 10:39 #16
#15
Du ridser et scenarie op som ikke er muligt; du kan ikke bare pipe dig ud af en kommando på den måde som du forestiller dig.

Skulle vi endelig ridse et 'farligt' scenarie op, så ville dette være meget mere plausibelt:
$cmd = "convert ".$target_path." -thumbnail 250x90 resultat.png -exec rm -rf {} \;


Men det vil stadig ikke virke, for det er typisk kun systemkommandoer der understøtter -exec funktionen.

Altså, med andre ord, så vil du ikke bare - ved at navngive filer grimt - kunne skabe så farlige situationer som du sidder og forestiller dig.

At man så ikke bare skal lade brugergeneret input flyde igennem en exec() er en helt anden sag - men mit ovenstående eksempel kan højst give problemer med dårligt navngivede - og derfor utilgængelige - filer.
Avatar billede wanze Nybegynder
05. november 2010 - 10:53 #17
#16
Man kan sagtens pipe med exec(). Læs dokumentationen.

Du synes ikke "rm" er en systemkommando? Du kan godt bruge "rm" i exec().
Avatar billede wanze Nybegynder
05. november 2010 - 11:02 #18
Det er faktisk meget sjovt, at den fejl jeg nævner her er præcis den du selv laver på http://err0r.dk/articles/read/de_mest_almindelige_fejl_beg_et_i_php

Nøjagtigt samme scenarie med "rm rf" og exec(). Hvorfor du så ikke forklarer det her er mig en gåde. ;-)
Avatar billede repox Seniormester
05. november 2010 - 12:41 #19
#17
Jeg tror du misforstår mig (og min artikel ;) )
rm er en system kommando, ImageMagicks convert er ikke.
Du kan selv prøve at pipe 'rm -rf' ind i min convert som beskrevet tidligere. Det vil absolut ikke virke - årsagen er simpelthen at det bare ikke er sådan det fungerer.

For at du rent faktisk skulle kunne gøre det du efterlyser, ville det kræve at din 'rm' blev læst ind således:
convert org.png -thumbnail 250x90 resultat.png -exec rm -rf {} \;


Det skulle bevirke at convert kommanden skulle insættes min -exec med 'rm -rf' delen som argumenter. Men da convert ikke understøtter -exec, vil det aldrig blive et problem.

Og da jeg er så sikker i min sag på at jeg har ret i det jeg siger, har jeg naturligvis prøvet det af på min server - og ganske rigtigt fungerer ingen af delene - hverken gennem PHP eller SSH.

Og for at knytte en kommentar til min artikel, så er meningen at pointere at du knytter en særlig risiko for din server og applikation ved ikke at validere bruger input. Om det er $_GET, $_POST eller andre superglobale variabler du vil anvende, kan du forvente at på et eller andet tidspunkt vil ikke valideret input skade dig.

For syns og argumentationens skyld vil jeg da gerne lave min artikel om, for at passe det ind til en mere realistisk risiko - min egen tanke var dog at ikke give mine læsere idéer som rent faktisk kunne virke da vi, fra naturens side, er udstyret med en lidt for stor nysgerrighed til at kunne lade en chance for at se om sådan noget virkelig kunne virke passere.
Avatar billede wanze Nybegynder
05. november 2010 - 15:32 #20
Jeg har ikke prøvet med rm, men jeg har før pipet kommandoer med exec() - og igen lige for et par minutter siden for at være sikker. Og det virkede.

Ellers ville det da også være rimelig besynderligt, at de har implementeret funktioner som escapeshellcmd(), der lige præcis escaper den slags.
Avatar billede repox Seniormester
05. november 2010 - 15:37 #21
#20
Jeg skal være ærlig at sige jeg ikke forstår du kan få mit eksempel til at virke. Jeg kan ikke.
Avatar billede webbe Nybegynder
19. november 2010 - 07:20 #22
Lukker spørgsmålet, da det har udviklet sig til en diskussion om andre ting end det jeg spurgte om.
Avatar billede repox Seniormester
19. november 2010 - 08:00 #23
Tråden forblev dog stadig saglig :)

@wanze
Det lykkedes mig at pipe ting som grep, trail og jeg synes også jeg fik startet vim men det det kan jeg dog ikke lige reproducere, så det var nok indbildning...

Dog har jeg ikke haft held med rm på hverken debian eller freebsd - umiddelbart kan jeg jo ikke afvise blankt at det ikke kan lade sig gøre i det omtalte scenarie - jeg kan mit Linux til husbehov, så jeg vil lige forsøge mig i andre for at høre hvordan og hvorledes...
Avatar billede webbe Nybegynder
19. november 2010 - 08:11 #24
Siger heller ikke at tråden ikke var saglig - men diskussionen begyndte at omhandle andre ting en det jeg spurgte om.
Avatar billede repox Seniormester
19. november 2010 - 08:38 #25
Det er rigtigt - men du kan vel ikke klandre os for ikke at begynde at implementere en forældet og forringet teknologi i et ukendt miljø?
Din eneste mulighed - for mig at se - er hvis du har GD lib på serveren, men da det er enormt ressourcekrævende i forhold til PHPs hukommelsesforbrug og kvaliteten på de generede thumbs ikke bliver særlig god, vil ImageMagick som regel altid foretrækkes - enhver webhotelsudbyder med bare lidt interesse for at følge med teknologierne og deres trends, har installeret ImageMagick på serveren - selv dem til 9 kr om måneden.
Kombineret med det faktum at nogle af os - inklusive mig - ikke har rørt GD i flere år af føromtalte årsager - bliver det svært at finde løsning til dig.

Koden til GD bliver også lige pludseligt et helvede at vedligeholde, for der skal mange linier til for tage højde for de tre mest kendte formater.

Jeg vil - hvis GD er det du vil gå efter - foreslå dig at Google efter færdige gd klasser; måske der er noget der er nemt at implementere.
Avatar billede webbe Nybegynder
19. november 2010 - 08:47 #26
Jeg er godt klar over at GD er forældet, men det er den eneste mulighed jeg har, og derfor vil jeres løsningsforslag ikke kunne anvendes i mit tilfælde.

Point gives vel også kun for løsninger man kan bruge og ikke løsninger der kan bruges andre steder (andre servere).

Jeg er ikke ude på at kritisere jer, for jeg synes det var en rimelig interessant diskussion I havde gang i.

Men da jeg ikke kan bruge det, er jeg vel nødt til at lukke spørgsmålet.
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