logo   PHP $_FILES - Wide Image







Et billede pr. DB-record.


Billeder kan i PHP / MySQL behandles på 2 måder alt efter opbevaringsmetode:


  • BLOB-metoden
    Billederne opbevares i MySQL i BLOB-format.
  • Mappe-metoden
    Billederne opbevares i en normal fil. Forbindelsen til dem vedligeholdes via PHP/MySQL.


Beskrivelsrne nedenfor vil være afgrænset til Mappe-metoden.


Upload af billeder til brug i PHP kan opdeles i den nedenfor beskrevne 5-trins sekvens. Sletning er beskrevet længere nede.


En del af upload-processen foretages bedst med PHP add-on biblioteket WideImage. Det (lib-versionen) kan downloades herfra: download WideImage. Programmet placeres i sin egen mappe i "include"-mappen til de programmer, der skal udføre upload. Fra dem "includes" der til biblioteket:


include ("includes/wideimage/lib/wideimage.php");


Både indlæggelse af billeder og sletning af billeder udføres via Form / $_POST kredsløbet. Billedbehandlingen kan indgå i en Form samtidig med håndteringen af andre input types.


De aktuelle $_FILES-parametre kan ses med:
echo '<pre>Indholdet af $_FILES er: <br /> '; print_r($_FILES); echo '</pre>';




Et billede pr. DB-record.


Selvom håndtering af et billede pr. db-record (f.eks. brugerstamdata) kan integreres med programmerne til håndtering af stamdataene, synes det i praksis fordelagtigt at adskille de to opgaver (koden bliver simplere og muligheden for genbrug større).


Ved adskillelse kan man nøjes med 2 programmer til håndtering af billeder:


  • Et update-program, der med samme kode både indlægger billede første gang og udskifter billede efter behov.
  • Et program, der sletter billedet.


Nedenfor er der links til 4 programmer, der kan anvendes som grundlag for at etablere upload og sletning af billeder.


xUpdate til brug i admin-system
xDelete til brug i admin system
xUpdate til brug i offentlig del af sitet
xDelete til brug i offentlig del af sitet


Som det kan ses er programmerne næsten identiske to og to - næsten kun filstierne er forskellige.


Koden til opbygning af billednavne og anvendelse af wideimage skal tilpasses den aktuelle situation. Der skal også tilpasses, alt efter om der skal håndteres en enkelt eller flere versioner (lille, mellsem, stor) af hvert billede.


Når der kun skal være et billede pr. stamdatarecord, indlægges billednavnet i et felt deri.




Indlæggelse af billeder


Her kan ses programmer til hhv. insert, update og delete:

x Insert

x Update (Hvor genindlæggelse af billede kan undlades).

x Delete


Indlæggelse af billeder kan opdeles i 5 faser:

  • Håndtering i form
  • Udtræk fra $_POST
  • Billednavne og -stier
  • Behandling med WideImage
  • Opdatering af database


Koden til punkterne 3 og 4 placeres umiddelbart før koden til pkt. 5.


Håndtering i Form


"enctype"-parameteret skal indsættes og input type = "file" benyttes. Input type "file" giver mulighed for at selektere billede til overførsel:


<form method="post" enctype="multipart/form-data">
<table>
<tr><td>Hent billedfil til upload</td><td>  </td><td><input type="file" name="billed"/></td></tr>


Formen kan indeholde et ubegrænset antal andre input types.




Udtræk fra $_POST


Billedet - og tilknyttede data - overføres i sin egen globale php-variabel: $_FILES - der er indlejret i $_POST.


if (isset($_POST['upload']))
{
.
$type = trim ($_POST['type']);
.
...............................
// UDTRÆK fra post
$src = str_replace (' ','', (trim ($_FILES['billed']['name']))); // navn på billede ved upload (xxx.jpg)
$src_error = $_FILES['billed']['error']; // fejlkode fra upload
// VALIDERING
if ($src_error == 0)
{
$tmp_billed = WideImage::load('billed'); // billed = 'name' fra input type 'file'. Indeholder alle billedets bits.
}


if ($src == "")
{ $fejlbeskeder .= "Der er ikke uploadet noget billede
"; }
elseif( mb_check_encoding($src, 'ASCII') === false )
{$fejlbeskeder .= "Billedet's filnavn indeholder æ,ø å eller andre ikke-tilladte tegn. Ret billedets navn manuelt før upload.
"; }

...............................
// UDTRÆK fra post
$src = str_replace (' ','', (trim ($_FILES['billed']['name']))); // navn på billede ved upload (xxx.jpg)
$src_error = $_FILES['billed']['error']; // fejlkode fra upload;
if ($src_error == 0);
{
$tmp_billed = WideImage::load('billed'); // billed = 'name' fra input type 'file'. Indeholder alle billedets bits.;
}

// VALIDERING
if ($src_error == 0)
{
$tmp_billed = WideImage::load('billed'); // billed = 'name' fra input type 'file'. Indeholder alle billedets bits.
}

if ($src == "")
{ $fejlbeskeder .= "Der er ikke uploadet noget billede
"; }
elseif( mb_check_encoding($src, 'ASCII') === false )
{$fejlbeskeder .= "Billedet's filnavn indeholder æ,ø å eller andre ikke-tilladte tegn. Ret billedets navn manuelt før upload.
"; }
.
.
// echo '<pre>Indholdet af $files er '; print_r($_files); echo '</pre>';


Fra $_FILES skal udtrækkes 3 variabler, der her alle anvender 'billed' som parameter. 'billed' kommer fra 'name'-parameteret i <input type="file"... :

  • $src
    Navnet på det uploadede billede (f.eks: xxx.jpg).
  • $src_error
    Den aktuelle fejlkode for overførslen. 0 = ingen fejl.
  • $tmp_billed
    Variabel i WideImage, der udtrækker alle billedets pixels fra den TMP-fil der er dannet i Formen af input type "file".


Det er væsentligt, at de 2 sidste variabler udtrækkes i den viste rækkefølge.


Med "print_r"-funktionen kan vises en automatisk genereret oversigt over indholdet i $_FILES. Det er væsentlig, at overførslerne er stabile og fejlfri.




Billednavne og -stier


For at undgå utilsigtet overskrivning ved gemning og at flere databaserecords trækker samme billede, er det relevant, at sikre entydighed i billednavne. Der skal endvidere tages hensyn til, at samme billede kan være gemt i indtil 3 forskellige størrelser - placeres nemmest i hver sin mappe med samme billednavn.


En blandt flere måder at sikre entydighed på er ved at foranstille / erstatte navnet med en automatisk genereret tidsstreng (aaaammddttmmss eller aammddttmmss).


Ændringen fra et almindeligt navn til et navn med tidsprefix kan foretages således:


$tid = date("YmdGis");
$up_billed = $tid . "_" . $billed;


For at kunne gemme et billede skal stien til den / de aktuelle mappe(r) også være beskrevne. De gøres ved at opbygge en / flere "$xx_stiogbilled"-variabler.


$up_sti = "../y_images/" . $row['z_mappe'] . "/" ;
$up_stiogbilled = $up_sti . $up_billed;




Behandling med WideImage


Efter at WideImage har udtrukket det fysiske billede fra den temporære fil i $_FILES til en variabel (her $tmp_billed), kan denne i WideImage bruges et ubegrænset antal gange til at lave nye bearbejdede billeder, der kan gemmes individuelt. Nedenfor vil blive vist 3 måder, der forudsætter at forarbejdet med billednavne og -stier er gjort:


  • Uændret billede
    Billedet kan gemmes umiddelbart:
    $tmp_billed->saveToFile($up_stiogbilled);

  • Resize
    Skal billedet resizes før upload indsættes:
    $resized = $tmp_billed->resizeDown(, 300);
    $resized->saveToFile($up_stiogbilled);

    Til "resize" skal knyttes bl.a. følgende parametre. De to første tal angiver hhv. bredde og højde. Ved at lade det ene tal være tomt, skaleres proportionelt på det andet.

    Eksempler:
    $smaller = $image->resize('50%');
    $smaller = $image->resize('100', '100', 'inside', 'down');
    is the same as
    $smaller = $image->resizeDown(100, 100, 'inside');

  • Crop
    Skal billedet croppes før upload indsættes:
    $crop = $tmp_billed->crop('par1', 'par2', par3, par4);
    $crop->saveToFile($up_stiogbilled);

    Til "crop" skal knyttes 4 parametre, hvoraf de 2 første angiver startsted (horisontalt og vertikalt) og de 2 sidste udsnittets størrelse (horisontalt og vertikalt).

    Eksempler:
    $cropped = $img->crop(10, 10, 150, 200); // crops a 150x200 rect at (10, 10)
    $cropped = $img->crop(-100, -50, 100, 50); // crops a 100x50 rect at the right-bottom of the image
    $cropped = $img->crop('25%', '25%', '50%', '50%'); // crops a 50%x50% rect from the center of the image
    $cropped = $img->crop("right", "bottom", 100, 200); // crops a 100x200 rect from right bottom
    $cropped = $img->crop("center", "middle", 50, 30); // crops a 50x30 from the center of the image


Udover resize og crop kan WideImage foretage ganske mange andre manipulationer af $tmp_billed før gemning. Beskrivelse af dem kan findes i WideImage's dokumentation: download WideImage.




Opdatering af database


Ved Insert opbygges "insert"-datastrengen således:


INSERT INTO tabel
(  aa,    bb,    cc,    dd_billed,   ee,    ff ) VALUES
('$aa', '$bb', '$cc', '$up_billed', '$ee', '$ff')";


Ved update skal der anvendes en "update"-datastreng, når der indgår et billede i opdateringen, og en anden, når der ikke indgår et billede deri.


if ($billed != "")
{
$up_query = "
UPDATE tabel SET
aa = '$aa',
bb = '$bb',
cc_billed = '$up_billed',
dd = '$dd',
ee = '$ee'
WHERE xx_id = $xx_id";
$up_result = mysqli_query ($db_link, $up_query) or die (mysqli_error ($db_link));
}

else

{
$up_query = "
UPDATE tabel SET
aa = '$aa',
bb = '$bb',
dd = '$dd',
ee = '$ee'
WHERE xx_id = $xx_id";
$up_result = mysqli_query ($db_link, $up_query) or die (mysqli_error ($db_link));
}





Sletning af billeder


For at slette et billede behøves kun en sti, et billednavn fra databasen og en PHP-funktion. - Og det meste er delvis genbrug:


// sti og billede
$up_sti = "../y_images/" . $row['z_mappe'] . "/" ;
$up_stiogbilled = $up_sti . $billed; // $billed = billednavn i DB. Hentet med GET ved programstart

//funktion
unlink($up_stiogbilled);




















x
x