[PHP] Image resizen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn doel is om een plaatje welke ik upload via een html file veld, tevens te resizen naar een bepaald formaat en deze dan meteen met het originele plaatje op te slaan.
Ik heb hiervoor een klein aantal tutorials doorgenomen voor de basis kennis. Ik heb een aantal bestaande scripts doorgenomen en geprobeerd te implementeren. Maar helaas allen zonder succes.

Ik heb mijn server gecontroleerd. GD is ingeschakeld.

Met het script op de volgend epagina ben ik het meest aan het prutjen geweest: http://www.webdevelopment.nu/viewtopic.php?f=3&t=14
Het probleem dat zich telkens voordoet is een error over het gedeelte waar hij de maten probeerd op te vragen, en dat het bron bestand niet gevonden kan worden. Uiteraard heb ik de bronnen veranderd naar mijn eigen bestanden. Hoewel ik mij al afvraag of dit goed gaat. Ik probeerde dit oa op te vragen met $_FILES[naam][tmp_name], of een daarop lijkend soort...?

Daarnaast heb ik een aantal andere scripts geprobeerd. Bij deze script gaf het plaatje vaak alleen maar tekens weer.
Kort voorbeeld van een script dat een standaard plaatje zal moeten aanmaken waarop ik vervolgens weer verder kan gaan:
PHP:
1
2
3
4
5
// Thumbnail aanmaken
$Thumbnail = imagecreatetruecolor(100, 100); // Thumb bg aanmaken
header('Content-type: image/jpeg'); // Header verzenden
imagejpeg($Thumbnail); // Afbeelding weergeven
imagedestroy($Thumbnail); // Geheugen legen


Mijn vraag aan jullie is of jullie tips hebben? Wellicht in de zin van uitgebreide tutorials?

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Gaat het uploaden en het plaatsen van het bestand in een door jou gewenste map wel goed? Dat is waar je mee moet beginnen tenslotte.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jah. Het orginele bestand wegschrijven inclusief alle checks is geen probleem. Dit is de code daarvoor:
PHP:
1
2
3
4
5
6
7
8
// Bestandsnaam aanmaken.
$ext = strrchr($_FILES['NieuwBestand']['name'], ".");
$NewFileName = "$_POST[NewUploadID]".$ext;

// Wegschrijven
if(move_uploaded_file($HTTP_POST_FILES['NieuwBestand']['tmp_name'], "fotoalbum/foto/" . $NewFileName )) {
// Opgeslagen
}


Uit jouw reactie mag ik vervolgens ook opmaken dat ik het bestand eerst moet opslaan voordat ik het kan resizen? Dus niet vanaf het tijdelijke bestand?

[ Voor 17% gewijzigd door Verwijderd op 25-08-2009 16:43 ]


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 13:10

Matis

Rubber Rocket

Check ook deze tutorial eens:
http://us2.php.net/manual/en/function.imagecopyresized.php

Wel moet GD geactiveerd zijn op je webserver/php-engine!

Ja, je moet eerst het bestand opslaan op schijf alvorens je het kunt bewerken (AFAIK, daarnaast is het sws geen slecht idee om te doen ;) )!

[ Voor 32% gewijzigd door Matis op 25-08-2009 16:46 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Je post is wel wat wazig. Kun je misschien wat debuggen en kijken waar het mis gaat. In principe is het allemaal niet zo moeilijk.

Ik gebruik zelf een kant en klare class voor het aanmaken van thumbnails. Deze vind ik persoonlijk prettig werken: http://scripts.ringsworld...resize/hft-image.php.html

Acties:
  • 0 Henk 'm!

  • HyperioN
  • Registratie: April 2003
  • Laatst online: 24-05 15:42
En wat lukt er dan precies niet? Welke error(s) krijg je? Wat heb je zelf al gevonden en waarom werkt dit niet of waarom begrijp je dit niet?

Wij gaan hier natuurlijk geen kant-en-klare oplossing bieden of jouw script debuggen.. maar als je aangeeft wat er precies niet lukt willen we je best helpen!

Edit: dit klopt natuurlijk niet:
Verwijderd schreef op dinsdag 25 augustus 2009 @ 16:42:
PHP:
1
$NewFileName = "$_POST[NewUploadID]".$ext;
Kijk eens naar de plaatsing van die quotes ;)

[ Voor 30% gewijzigd door HyperioN op 25-08-2009 16:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Noork: Het probleem is voor mij ook vaag. :P Maar ik zal proberen iets meer info te geven. Dan hoop ik alleen dat het daar niet nog onduidelijker van wordt! ;)

- Allereerst geeft mn phpinfo dat gd actief is.
- Als ik het script gebruik zoals die op de link staat in het openingsbericht, dan lijkt de fout te ontstaan doordat hij een bron bestand niet kan vinden. Zelfs wanneer ik een specifieke url opgeef van een bestand.
- Als ik een tijdelijk bestandje aanmaak, dan komt hij alleen maar met allemaal vage tekens als plaatje aanzetten.

Eigenlijk is het mij gewoon totaal onduidelijk geworden naar mate ik ermee bezig ging. Als ik de tuts doorlees, lijkt het alsof ik wel gewoon begrijp hoe het idee is: Een kleine afbeelding maken; het hoofdbestand daarbij op plaatsen; wegschrijven en de tijdelijke dingen verwijderen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
HyperioN schreef op dinsdag 25 augustus 2009 @ 16:47:
Kijk eens naar de plaatsing van die quotes ;)
Het is niet zoals het hoort inderdaad, maar het uiteindelijke effect is ok. :P Hij schrijft de bestandsnaam netjes en goed weg! ;)

Ik zal proberen een script in elkaar te zetten zoals ik denk dat het hoort. Deze post ik zo met het probleem erbij.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 13:10

Matis

Rubber Rocket

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// File and new size
$filename = 'test.jpg';
$percent = 0.5;

// Content type
header('Content-type: image/jpeg');

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output
imagejpeg($thumb);
?>

Zoals ik al aangaf doet exact wat jij hierboven beschrijft.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Vage tekens -> onjuiste header.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 13:10

Matis

Rubber Rocket

HuHu schreef op dinsdag 25 augustus 2009 @ 16:56:
Vage tekens -> onjuiste header.
Hoeft niet perse. Ik deed ook wel eens echo in mn image stukje :$

Ligt een beetje aan de browser....

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Verwijderd schreef op dinsdag 25 augustus 2009 @ 16:42:
Jah. Het orginele bestand wegschrijven inclusief alle checks is geen probleem. Dit is de code daarvoor:
PHP:
1
2
3
4
5
6
7
8
// Bestandsnaam aanmaken.
$ext = strrchr($_FILES['NieuwBestand']['name'], ".");
$NewFileName = "$_POST[NewUploadID]".$ext;

// Wegschrijven
if(move_uploaded_file($HTTP_POST_FILES['NieuwBestand']['tmp_name'], "fotoalbum/foto/" . $NewFileName )) {
// Opgeslagen
}


Uit jouw reactie mag ik vervolgens ook opmaken dat ik het bestand eerst moet opslaan voordat ik het kan resizen? Dus niet vanaf het tijdelijke bestand?
Kijkt iedereen dan over
PHP:
1
$HTTP_POST_FILES
van regel 6 heen? Dit moet namelijk
PHP:
1
$_FILES
zijn, zeker als register globals uit staan.

Tevens kan $newFileName anders geschreven worden:
PHP:
1
$NewFileName = $_POST['NewUploadID'] . $ext;
Tevens zou ik wel die $_POST['NewUploadID'] wel eerst grondig checken, vooraleer je hem klakkeloos overneemt.

[ Voor 91% gewijzigd door CH4OS op 25-08-2009 17:07 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@ GJtje: Op alle invoeren van de gebruiker worden vooraf checks uitgevoerd. De ID is dus al gecontroleerd. De FILE zal ik gan aanpassen.

Ik plaats dit nu even heel kort door de bocht.

Het file-veld waarmee ik upload heet dus NieuwBestand.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Get the details of "imagefile"
$filename = $_FILES['NieuwBestand']['name'];
$temporary_name = $_FILES['NieuwBestand']['tmp_name'];
$mimetype = $_FILES['NieuwBestand']['type'];
$filesize = $_FILES['NieuwBestand']['size'];

//Open the image using the imagecreatefrom..() command based on the MIME type.
switch($mimetype) {
    case "image/jpg":
    case "image/jpeg":
        $i = imagecreatefromjpeg($temporary_name);
        break;
    case "image/gif":
        $i = imagecreatefromgif($temporary_name);
        break;
    case "image/png":
        $i = imagecreatefrompng($temporary_name);
        break;
}

//Delete the uploaded file
unlink($temporary_name);

//Save a copy of the original
//imagejpeg($i,"fotoalbum/foto/uploadedfile.jpg",80);

//Specify the size of the thumbnail
$dest_x = 150;
$dest_y = 150;

//Is the original bigger than the thumbnail dimensions?
if (imagesx($i) > $dest_x or imagesy($i) > $dest_y) {
    //Is the width of the original bigger than the height?
    if (imagesx($i) >= imagesy($i)) {
        $thumb_x = $dest_x;
        $thumb_y = imagesy($i)*($dest_x/imagesx($i));
    } else {
        $thumb_x = imagesx($i)*($dest_y/imagesy($i));
        $thumb_y = $dest_y;
    }
} else {
    //Using the original dimensions
    $thumb_x = imagesx($i);
    $thumb_y = imagesy($i);
}

//Generate a new image at the size of the thumbnail
$thumb = imagecreatetruecolor($thumb_x,$thumb_y);

//Copy the original image data to it using resampling
imagecopyresampled($thumb, $i ,0, 0, 0, 0, $thumb_x, $thumb_y, imagesx($i), imagesy($i));

//Save the thumbnail
imagejpeg($thumb, "fotoalbum/foto_thumb/thumbnail.jpg", 80);


De error die ik krijg wanneer ik test is het volgende: Warning: imagecreatefromjpeg(/tmp/phppsED1B) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in /home/vhosts/trefpuntdeberg.nl/httpdocs/protected_foto_new.php on line 75

Ik vermoed dan ook dat ik steeds vast loop op het moment dat ik het bron bestand moet aanroepen. Ik denk dus dat ik hier hulp bij nodig heb. Hoe roep ik dus het bronbestand aan. (Via het file-veld, dan wel niet via de al reeds opgeslagen bestand?)

Daarna vermoed ik dat ik nog ga vast lopen bij het opslaan op de server van het thumbnail bestand. Maar dat is denk ik een latere zorg.

(Het bovenstaande script controleerd trouwens wat voor afbeelding het is, en of hij op de breedte of de hoogte moet resizen..)

Acties:
  • 0 Henk 'm!

Verwijderd

Check je wel of het bestand daadwerkelijk goed geupload is?

PHP:
1
2
3
4
if (is_uploaded_file($_FILES['NieuwBestand']['tmp_name']))
{
         // ...
}


Verder zou de inhoud van $_FILES wel nuttig kunnen zijn, print_r die eens? :)

[ Voor 20% gewijzigd door Verwijderd op 25-08-2009 17:24 ]


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Verwijderd schreef op dinsdag 25 augustus 2009 @ 17:19:
Check je wel of het bestand daadwerkelijk goed geupload is?

PHP:
1
2
3
4
if (is_uploaded_file($_FILES['NieuwBestand']['tmp_name']))
{
         // ...
}
Mocht dit geen foutmelding teweeg brengen, check dan even of je (voldoende) machtigingen hebt op de /tmp/phppsED1B map of /tmp en submappen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 25 augustus 2009 @ 17:19:
Check je wel of het bestand daadwerkelijk goed geupload is?

PHP:
1
2
3
4
if (is_uploaded_file($_FILES['NieuwBestand']['tmp_name']))
{
         // ...
}
Ik zie dat hij toegevoegd wordt op de server via mijn ftp programma. (Neem aan dat je dat bedoelt?)
Daarnaast gaat het script wat er nu is voor het aanleggen van een databasr regel alleen verder als het uploeden een true geeft.

Acties:
  • 0 Henk 'm!

Verwijderd

GJtje schreef op dinsdag 25 augustus 2009 @ 17:23:
[...]
Mocht dit geen foutmelding teweeg brengen, check dan even of je (voldoende) machtigingen hebt op de /tmp/phppsED1B map of /tmp en submappen.
Geen rechten op de /tmp? Lijkt me niet, anders kunnen er ook geen PHP-sessies aangemaakt worden?
Verwijderd schreef op dinsdag 25 augustus 2009 @ 17:24:
[...]


Ik zie dat hij toegevoegd wordt op de server via mijn ftp programma. (Neem aan dat je dat bedoelt?)
Daarnaast gaat het script wat er nu is voor het aanleggen van een databasr regel alleen verder als het uploeden een true geeft.
Nee dat bedoel ik niet, ik bedoel of je het controleert met de code die ik erbij post... ;)

Je ziet hem in de FTP. Dan neem ik aan dat je niet in de /tmp kijkt? Hij wordt nergens verplaatst, tenzij je een move_uploaded_file() gebruikt voordat de code die je gepost hebt draait. In dat geval is het probleem overduidelijk.. ;)

[ Voor 50% gewijzigd door Verwijderd op 25-08-2009 17:35 ]


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Verwijderd schreef op dinsdag 25 augustus 2009 @ 17:25:
Geen rechten op de /tmp? Lijkt me niet, anders kunnen er ook geen PHP-sessies aangemaakt worden?
PHP-sessies hoeven niet perse opgeslagen te worden in /tmp natuurlijk, al is dat wel de default instelling.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik move hem idd naar de opslag locatie waar ik um wil. Van de laatste code die ik gepost heb zou het moeten werken. De regel van de $temporary_name = $_FILES['NieuwBestand']['tmp_name']; heb ik nu aangepast naar het volgende:
PHP:
1
$temporary_name = "/fotoalbum/foto/".$NewFileName;


Maar dan nog krijg ik een error met de fout dagt hij he tniet kan openen:
Warning: imagecreatefromjpeg(/fotoalbum/foto/1251214870.jpg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in /home/vhosts/trefpuntdeberg.nl/httpdocs/protected_foto_new.php on line 82

De fout lijkt mij dna ook te zitten in het openen van het bestand. Maar wat doe ik hie rniet goed in?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De print_r geven het volgende resultaat. Zelfs na het move_file gebeuren:
De naam van het ge�ploade bestand
achtergrond.jpg

De grootte van het ge�ploade bestand
111548

Het mime-type van het ge�ploade bestand
image/jpeg

Tijdelijke naam op server
/tmp/phpcaWxEH

In de ftp is de map leeg. (Of is het gebeuren daar verborgen?)

Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
Verwijderd schreef op dinsdag 25 augustus 2009 @ 17:44:
Maar dan nog krijg ik een error met de fout dagt hij he tniet kan openen:
Warning: imagecreatefromjpeg(/fotoalbum/foto/1251214870.jpg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in /home/vhosts/trefpuntdeberg.nl/httpdocs/protected_foto_new.php on line 82

De fout lijkt mij dna ook te zitten in het openen van het bestand. Maar wat doe ik hie rniet goed in?
Je pakt een absoluut pad naar /fotoalbum... tja dat bestaat niet.. Kijk nou eens waar je moet zijn: /home/vhosts/trefpuntdeberg.nl/httpdocs/ ;) of gebruik relatieve paden (zonder trailing /)

[ Voor 3% gewijzigd door gertvdijk op 25-08-2009 17:52 ]

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar wat zou dan het pad moeten zijn dat hierin komt? Heb een aantal geprobeerd maar maakt geen verschil:
- /fotoalbum/foto
- /home/vhosts/trefpuntdeberg.nl/httpdocs/fotoalbum/foto
- En ook zonder de / ervoor.

Acties:
  • 0 Henk 'm!

  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 18-09 11:40
Verwijderd schreef op dinsdag 25 augustus 2009 @ 17:57:
Maar wat zou dan het pad moeten zijn dat hierin komt? Heb een aantal geprobeerd maar maakt geen verschil:
- /fotoalbum/foto
- /home/vhosts/trefpuntdeberg.nl/httpdocs/fotoalbum/foto
- En ook zonder de / ervoor.
Die eerste is sowieso kansloos, de tweede zou moeten werken (check met SSH/SFTP login of dat pad klopt of met een omweg via PHP file functions).
Het is aan jou waar je de files neerzet en waar je ze vervolgens vandaan probeert te halen. Het moet alleen wel overeenkomen en je moet wel rechten hebben daarin om te schrijven e.d.

Kia e-Niro 2021 64 kWh DynamicPlusLine. See my GitHub and my blog for articles on security and other stuff.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het werkt.
het aanroepen ging dus niet goed.

Maar wat ik me dan nog wel afvraag is, waarom kan hij het tijdelijke bestand niet aanroepen, maar de gegevens wel?

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 25 augustus 2009 @ 18:17:
Het werkt.
het aanroepen ging dus niet goed.

Maar wat ik me dan nog wel afvraag is, waarom kan hij het tijdelijke bestand niet aanroepen, maar de gegevens wel?
Op het moment dat je het bestand verplaatst, gebeurd er niks met de $_FILES array. :)
Pagina: 1