Avatar billede thulstrup Nybegynder
25. juni 2003 - 13:28 Der er 8 kommentarer og
2 løsninger

Et par spm til upload af billeder

Jeg har lige et par spørgsmål i forbindelse med mit upload script:

if (isset($_POST['submit'])) {       
   
    // tilslut til databasen:
    connectToDB();   

    $filnavn = $_FILES['billede']['tmp_name'];
    $orgnavn = $_FILES['billede']['name'];

    if (is_uploaded_file($filnavn)) {
        $data = addslashes(fread(fopen($filnavn,"r"),filesize($filnavn)));
       
        // filens størrelse i kilobytes
        $size = filesize($filnavn)/1024;

        // max antal kilobytes
        $max = 100;

        // er størrelsen iorden?
        if ($size > $max) {
            echo "<b>fylder for meget</b>";
            exit;
        }
       
        // filtype
        $type = addslashes($_FILES['billede']['type']);
       
        // tilladte filtyper
        $tilladt = array("image/jpg", "image/jpeg", "image/pjpeg");
       
        // er filtypen tilladt?
        if(!in_array($type, $tilladt)) {
            echo "<b>forkert type</b>";
            exit;
        }       

        // størrelse
        $a = getimagesize($filnavn);
        $width = $a[0];
        $height = $a[1];       

        $sql = mysql_query("INSERT INTO galleri (billede, width, height, filetype) values ('$data','$width','$height','$type')") or die(mysql_error());       

    } else {
        echo "Possible file upload attack. Filename: " . $HTTP_POST_FILES['billede']['name'];
    }

    // luk forbindelsen til databasen
    closeConnection();
}


1. Hvordan checker jeg om det uploaded billede er et progressivt jpg billede?

2. Hvis det er et progressivt jpg billede, hvordan laver jeg det så om til et ikke progressivt jpg?

3. Hvordan laver jeg thumbnails (der er gdlib på serveren hvis det er en fordel)?

4. Thumbnails skal også insættes i databasen, så det bliver noget ala:
 
$sql = mysql_query("INSERT INTO galleri (billede, width, height, filetype, thumb, thumbwidth, thumbheight) values ('$data', '$width', '$height', '$type', '$thumb', '$thumbwidth', '$thumbheight')") or die(mysql_error());
Avatar billede avminarm Juniormester
25. juni 2003 - 13:33 #1
1 ?
2 ?

3: GD lib er en klar fordel

4: Ladvære med at sætte Thumbs i DB - dem kan man ligeså godt generere hvergang de skal vises
Avatar billede thulstrup Nybegynder
25. juni 2003 - 13:42 #2
Forklaring til 1 & 2: Billederne skal loades ind i flash. Flash kan kun læse jpg'ere der ikke er gemt som progressive.

3: En lille uddybning ville være ok :-)
4. Det tager ikke forlang tid?
Avatar billede myplacedk Nybegynder
25. juni 2003 - 13:52 #3
1. Det tror jeg ikke man kan med GD. Du har vel ikke tilfældigvis mulighed for at bruge ImageMagick? Der kan man sikkert...

2. Du kan generere en ny jpeg med samme motiv som det gamle. Men det går ud over billed-kvaliteten!

3. Det kan du gøre med GD. Kig på imagecopyresampled() (så vidt jeg husker).

4. Det anbefales normalt at man IKKE putter filer i databasen. Filer hører til i filsystemet.
Du kan fx. have en mappe som hedder "images" og en mappe som hedder "thumbs". I de mapper lægger du så billederne, med et filnavn baseret på id i databasen. Fx. billede med id 7 kan have filnavet "7.jpg" i begge mapper.
Avatar billede jakoba Nybegynder
25. juni 2003 - 13:53 #4
avminarm >> Jeg er vildt uenig med dit svar på 4). Billedbehandling spiser alt for meget servertid.
Avatar billede avminarm Juniormester
25. juni 2003 - 15:30 #5
jakoba>> så må jeg nok bøje mig i støvet ;o) - det ved du nok en del mere end mig ;o) - ignorer min nr. 4

GD lib eksempel (fra billede hentet i DB):

  $height = 100;
  $width = 80;

  $picid=addslashes($_GET['id']);

  $result=mysql_query("select billede, billede_type from brugere where id='$picid'") or die (mysql_error());
  while($row = mysql_fetch_array($result)){
  $type = $row['billede_type'];
  header('Content-Type: image/$type');

  if(empty($row['billede'])){
  $nopic = "skin/".$using."/image/nopic.jpg";
  $src_img = imagecreatefromjpeg($nopic);
  }else{
  $src_img = imagecreatefromstring($row['billede']);
  }
  $dst_img = imagecreatetruecolor($width, $height);
  imagecopyresampled($dst_img, $src_img, 0,0,0,0, $width,$height, imagesx($src_img), imagesy($src_img));
  imagejpeg($dst_img);
  }
Avatar billede jakoba Nybegynder
25. juni 2003 - 15:41 #6
avminarm >> Lad være med at bøje dig fordi jeg har alle de pts. Det betyder ikke meget andet end at jeg har været her længe. Lav evt et lille testprogram og check selv efter hvad udgiften er.

mvh JakobA
Avatar billede avminarm Juniormester
26. juni 2003 - 09:23 #7
jakoba>> det var faktisk ikke pga af alle dine points, men fordi - jeg tit har fulgt dine svar - og du kan da ikke komme udenom at du ved en del ;o)
Avatar billede thulstrup Nybegynder
28. juni 2003 - 10:49 #8
Ok, nu har jeg fundet ud af det meste. Jeg har droppet at bruge BLOB, det var for besværlig når billedet skulle vises i Flash. Jeg har besluttet mig for at lave thumbnails samtidig med upload.

Jeg vil stadig gerne ha' svar på spørgsmål 1 (og 2). Jeg tror det har noget at gøre med om billedet er interlaced (http://dk.php.net/manual/en/function.imageinterlace.php) eller ej. Men hvordan checker man om det er det?
Avatar billede avminarm Juniormester
30. juni 2003 - 08:47 #9
har du læst på PHP.net selv?

imageinterlace() turns the interlace bit on or off. If interlace is 1 the image will be interlaced, and if interlace is 0 the interlace bit is turned off.

If the interlace bit is set and the image is used as a JPEG image, the image is created as a progressive JPEG.

This function returns whether the interlace bit is set for the image.
Avatar billede thulstrup Nybegynder
07. juli 2003 - 09:08 #10
Så har jeg fået det til at spille. Tak for hjælpen begge!
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