Avatar billede mccookie Seniormester
28. juni 2005 - 23:24 Der er 14 kommentarer og
2 løsninger

PHP, upload og resize af billede

Hejsa

Jeg er ved at forsøge at lave noget upload script der kan håndtere billeder og når de f. eks. er større end 150*150px, så bliver de automatisk resized til width 150px og height i forhold til width.

Jeg har søgt på eksperten.dk og forsøgt nogle forskellige ting, intet syntes lige at virke efter mine ønsker - Så nu håber jeg nogle eksperter kan guide mig.

Mit(Webcafes script med modifikationer) ser sådan ud:

<?php

/**
* Simpelt script der tager imod et filupload og lister
* filer i upload-biblioteket.
*
* Scriptet er et eksempel til en artikel paa WebCafe.dk:
*
*    http://www.webcafe.dk/artikler/php/upload/
*/


/**
* Hvor skal filerne uploades til?
* Husk, at webserveren skal kunne skrive til dette bibliotek
*/
$konfiguration["upload_bibliotek"] = "./upload";

/* Hvor mange kilobytes maa filerne fylde per styk? */
$konfiguration["max_stoerrelse"] = "100";

/* Tilladte filtyper */

$allow_filetype = array("image/gif","image/pjpeg","image/bmp");

/**
* Checker PHP-version
*/
list($major, $minor, $rev) = explode(".", phpversion());
if($major < 4) {
  die("Jeg kan kun arbejde med PHP 4.0.0 eller derover");
}


/**
* Udligner forskellene mellem 4.1.x og 4.0.x
* Bemaerk, at disse ikke er "superglobals"
*/
if($minor < 1) {
  $_FILES = $HTTP_POST_FILES;
  $_POST = $HTTP_POST_VARS;
  $_SERVER = $HTTP_SERVER_VARS;
}


if($_FILES["upfil"]["size"] > 0) {

  /**
  * Hvis der er en fil, saa uploader vi den.
  *
  * Foerst slaar vi lige fast, hvor filen skal flyttes fra og til.
  */

  if(!in_array($_FILES['upfil']['type'], $allow_filetype)) {
     
      echo "Desværre MESTER, du forsøger jo at uploade en ulovlig fil - GLEM DET!!!<br>";
      echo $_FILES['upfil']['type']; echo "<br>";
      echo "Disse filer er desværre forbundet med en sikkerhedsrisiko, så derfor ingen upload til dig - Gå tilbage og find en anden fil!";
      exit; }

  $unik_filnavn = uniqid(9);
 
  $fra = $_FILES["upfil"]["tmp_name"];
  $til = $konfiguration["upload_bibliotek"] . "/" . $unik_filnavn . "-" . $_FILES["upfil"]["name"];

  /**
  *  Checker lige om filen er for stor til at vi vil acceptere den.
  *  Vi bruger ceil() i stedet for round(), saa vi ikke faar den skoere
  *  situation, at fejlmeldingen siger, at filen er for stor, men angiver
  *  samme stoerrelse for filen og den oevre graense.
  */
  $fil_stoerrelse = filesize($fra)/1024;
  if($fil_stoerrelse > $konfiguration["max_stoerrelse"]) {
      die("Desv&aelig;rre - filen er for stor. Jeg accepterer kun " .
          $konfiguration["max_stoerrelse"] . "kb, og din fil fylder " .
          ceil($fil_stoerrelse) . "kb");
  }
  if(function_exists("move_uploaded_file")) {
    move_uploaded_file($fra, $til);
  } else {
    copy($fra, $til);
  }

  header("Location: " . $_SERVER["PHP_SELF"]);
  exit;

} else {

  /**
  * Intet tegn paa upload, saa vi viser bare listen over filer
  * og HTML-formularen til nye uploads.
  */
  $indhold = listFiler($konfiguration["upload_bibliotek"]);
  $indhold .= bygFormular($_SERVER["PHP_SELF"]);
  $output = bygSide("hej", $indhold);

}


/**
* Skriver ud til browseren
*/
echo $output;
exit;



/**************************************************\
**              Hjaelpefunktioner              **
\**************************************************/

function bygSide($titel, $indhold) {

  /**
  * Pakker indholdet ind i lidt formalia
  */
  return '<html>
            <head><title>' . $titel . '</title></head>
            <body bgcolor="#ffffff">
              <div align="right"><a href="./">Tilbage til artiklen</a></div>
              ' . $indhold . '</body>
          </html>
        ';

}

function bygFormular($action) {

  $formular = '<form action="' . $action . '" method="post" enctype="multipart/form-data">
                <table border="1" cellpadding="5" cellspacing="0">
                  <tr>
                    <td align="right" bgcolor="#999999"><b>Fil til upload:</b></td>
                    <td bgcolor="#cccccc"><input type="file" name="upfil" /></td>
                  </tr>
                  <tr>
                    <td colspan="2" align="middle" bgcolor="#dddddd"><input type="submit" value="upload" /></td>
                  </tr>
                </table>
              </form>
              ';

  return "<h2>Upload fil:</h2>" . $formular;

}

function listFiler($bibliotek) {

  if($bib = @opendir($bibliotek)) {
    /**
    * Denne syntaks er forklaret i PHP-manualen:
    * http://www.php.net/manual/en/function.readdir.php
    */
    while (false !== ($fil = readdir($bib))) {
      if($fil != "." && $fil != ".." && !ereg("^\..+", $fil)) {
          $fil_liste[] = "<a href=\"$bibliotek/$fil\">$fil</a>";
      }
    }
    closedir($bib);

    if(is_array($fil_liste)) {
      $liste = "<li>" . join("</li><li>", $fil_liste) . "</li>";
    } else {
      $liste = "<li>Ingen filer p&aring; lager</li>";
    }
    return "<h2>Filer p&aring; lager:</h2><ul>" . $liste . "</ul>";
  } else {
    die("Kunne ikke &aring;bne biblioteket: " . $bibliotek);
  }

}

?>

Det skal som minimum kunne håndterer jpeg ;)
Avatar billede coderdk Praktikant
28. juni 2005 - 23:26 #1
Du kan bruge denne, til jpeg: http://php.coder.dk/resizeimg.php
Den kan nemt ændre så den understøtter andre formater. For at resize til en bestemt bredde gør dette:

resize( $billede, $nytnavn, 150, 10000000000 );
Avatar billede mccookie Seniormester
28. juni 2005 - 23:49 #2
Det lyder nemt.....

Men hvordan for jeg det flettet sammen med det øvrige??
Avatar billede mccookie Seniormester
28. juni 2005 - 23:53 #3
Når jeg læser scriptet igennem finder jeg ikke noget sted hvor den gemmer min fil..... jeg tillader mig at stryge dit svar indtil videre.......
Avatar billede coderdk Praktikant
28. juni 2005 - 23:59 #4
Du skal nok ikke regne med at få anden hjælp så ;P Men nuvel, jeg forklarer det.
Kopiér min funktion ind i toppen af din fil, eller require den fra en anden.

Ændr:

if(function_exists("move_uploaded_file")) {
    move_uploaded_file($fra, $til);
  } else {
    copy($fra, $til);
  }


til:

if(function_exists("move_uploaded_file")) {
    move_uploaded_file($fra, $til);
    resize( $til, $til, 150, 10000000 );
  } else {
    copy($fra, $til);
    resize( $til, $til, 150, 10000000 );
  }

Den "gemmer" din fil med imagejpeg() funktionen.

Bemærk at alle billeder nu vil være 150 pixels brede, uanset hvad de var før - Men naturligvis passe proportionelt...
Avatar billede mccookie Seniormester
29. juni 2005 - 00:18 #5
Hello Mr. coderDK

Det virker umiddelbart som det skal......

Hvorfor får jeg denne og har det noget med dit script at gøre? eller serveren??
Avatar billede coderdk Praktikant
29. juni 2005 - 00:20 #6
Får hvad?
Avatar billede mccookie Seniormester
29. juni 2005 - 00:21 #7
Det ser ud som om at hvis billederne er omk. 500kb så vil den ikke rigtig være med:

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 6144 bytes) in /customers/hj-tech.dk/hj-tech.dk/httpd.www/upload.php on line

Det her billede var 340kb
Avatar billede coderdk Praktikant
29. juni 2005 - 00:29 #8
Det har ikke noget direkte med mit script at gøre, men en serverindstilling - memory_limit - Et jpeg kan godt fylde en hel del i hukommelsen når man behandler det, også selvom det ikke fylder så mange KB.
Avatar billede mccookie Seniormester
29. juni 2005 - 00:31 #9
Hmm....ja, det var noget i den retning jeg forstillede mig desværre kan man sige. Serveren er jo desværre ikke altid der hvor man har den store mulighed for ændre på opsætningen når dette ikke er ens egen........
Avatar billede mccookie Seniormester
29. juni 2005 - 00:31 #10
Den uploader dem dog uden at behandle dem ;(
Avatar billede mccookie Seniormester
29. juni 2005 - 00:34 #11
Kan man evt. gøre et eller andet??
Avatar billede coderdk Praktikant
29. juni 2005 - 00:36 #12
Ja, det er lidt surt - Men underlig host du har, de standard 8MB er ikke meget, hvis man vil bruge gd til at pille lidt ved billederne. Jeg tror ikke der er andet at gøre end at kontakte din host, og spørge om de ikke har lyst til at sætte den til 16MB ;P
Du KAN prøve og se om de har imagemagick installeret:

<?php passthru( 'convert --help' ); ?>
Avatar billede mccookie Seniormester
29. juni 2005 - 00:38 #13
Desværre den siger intet som helst....

Jeg prøver at kontakte dem med henblik på at sætte den op til 16 MB, mange tak for din gode og præcise hjælp....

Kaster lidt karma efter dig ;)
Avatar billede coderdk Praktikant
29. juni 2005 - 00:41 #14
Mange tak - De bananer skal bare makke ret ;)
Avatar billede mccookie Seniormester
29. juni 2005 - 00:41 #15
hehe.......b-one.dk håber :)
Avatar billede coderdk Praktikant
29. juni 2005 - 00:45 #16
Jeg krydser fingre så ;)
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