login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Info over image ophalen (Opgelost)

Offline Voldemort - 10/07/2007 17:31 (laatste wijziging 10/07/2007 17:31)
Avatar van VoldemortPHP ver gevorderde Beste,

Ik gebruik nu:

getimagesize('url');

Maar als je getimagesize gebruikt op een URL, dan gaat deze héél traag (2 plaatjes duurt soms al 5 tot 10 seconden). Nu wil ik het plaatje downloaden, uploaden op mijn server, getimagesize op gebruiken en verwijderen.

Die laatste 2 stappen zijn niet echt een probleem, maar die eerste 2 lukken niet echt. Ik heb dit script van php.net gehaald (getimagesize functie => comment van iemand):

  1. function getimagesize2($data)
  2. {
  3. $tempfile = tempnam("logs", "temp_image_");#create tempfile and return the path/name (make sure you have created tmp directory under $cwd
  4. $temphandle = fopen($tempfile, "w");#open for writing
  5. fwrite($temphandle, $data); #write image to tempfile
  6. fclose($temphandle);
  7. $imagesize = getimagesize($tempfile); #get image params from the tempfile
  8. unlink($tempfile); // this removes the tempfile*/
  9.  
  10. return $imagesize;
  11. }
  12.  
  13. print_r(getimagesize2('url'));


Maar die doet het niet (returnt niks, zelfs geen lege array).

Maar aangezien ik enkel de lengte en breedte nodig heb, dacht ik om het met GD te doen. Dus iets als:

  1. <?php
  2. $img_op_andere_server = createimage('url');
  3. $lengte = imagesx($img_op_andere_server);
  4. $breedte = imagesy($img_op_andere_server);


Alleen weet ik niet hoe ik dat met die createimage moet doen.

Of is de andere methode (als hij werkende kan gekregen worden) meer aangeraden? Kan er iemand helpen?

36 antwoorden

Gesponsorde links
Offline JBke - 10/07/2007 18:21
Avatar van JBke PHP gevorderde raar dat dat script niet werkt, ik heb het ooit ook ergens gebruik mits een paar aanpassingen, ga eerst even eten net thuis van het werk, zal dan eens zoeken naar dat script, dacht het gebruikt te hebben voor een script voor imageupload met watermerk.
Offline Voldemort - 11/07/2007 10:19
Avatar van Voldemort PHP ver gevorderde En vind je je script?

Weet iemand hoe ik het werkende kan krijgen?
Offline smoos - 11/07/2007 10:31
Avatar van smoos PHP gevorderde Het is me nog niet helemaal duidelijk wat je nou precies wilt. Dus even checken. Je wilt een de width en height van een plaatje weten. Dus daarom ga jij eerst het plaatje downloaden, uploaden naar je server om daar de width en height op te vragen?

Waarom wil je dat? Er is vast wel een betere manier maar dan moeten we wel weten waarvoor het is
Offline Voldemort - 11/07/2007 12:38
Avatar van Voldemort PHP ver gevorderde Ik wil gewoon de lengte en breedte van een extern plaatje weten.
Offline smoos - 11/07/2007 12:45
Avatar van smoos PHP gevorderde Ja voor wat? Nieuws bericht systeem of zo iets dergelijks?
Is het dan niet beter om bij het posten van het bericht of de reply het plaatje op te halen en te uploaden naar je server ipv dit elke keer te doen als de reply bekeken wordt?

Of is het een eenmalig concept?
Offline Voldemort - 11/07/2007 12:48
Avatar van Voldemort PHP ver gevorderde Het is voor een UBB parser. Nu doet ik:

getimagesize('url');

Waar ik dan de lengte en breedte uit haal.

Maar die is zo ongelofelijk traag dat ik het anders en vooral sneller wil doen.
Offline smoos - 11/07/2007 13:14
Avatar van smoos PHP gevorderde dus het is iets wat elke keer weer voorkomt, dan kan je het plaatje toch beter uploaden naar je server en verwerk je de widht en height in de plaatjes naam. Of je maakt 1 malig een thumb en daar zet je een url op naar het groote plaatje.

Het zijn maar wat ideeen hoor. maar het klinkt mij allemaal beter in de oren dan elke keer weer het plaatje downloaden en/of uploaden alleen maar om de width en height te bepalen
Offline Voldemort - 11/07/2007 15:07
Avatar van Voldemort PHP ver gevorderde En hoe upload ik een plaatje naar mijn server als ik enkel een extern url heb?
Offline smoos - 11/07/2007 19:54 (laatste wijziging 11/07/2007 20:56)
Avatar van smoos PHP gevorderde Ik heb nog geen idee, ik zal even wat uitproberen voor je

Edit:
  1. <?php
  2.  
  3. ini_set('display_errors', true);
  4.  
  5. $sSource = file_get_contents('http://www.sitemasters.be/web/avatars/2280.jpg');
  6.  
  7. $sFile = fopen('avatar.jpg', 'w+');
  8. chmod('avatar.jpg', 0777);
  9.  
  10. fwrite($sFile, $sSource);
  11.  
  12. fclose($sFile);
  13.  
  14. echo 'Klaar';
  15.  
  16. ?>

Dit werkt. Je zou zelf maar moeten kijken of je dit veilig genoeg vind. Het is makkelijk te achterhalen of het echt een plaatje is door de widht en height op te vragen (dit kan achteraf maar ook vooraf, omdat je dit doet bij het posten van de reply hoeft het maar 1 keer. 1maal op je eigen server blijft natuurlijk sneller). Zo nodig kan je het plaatje ook verkleinen als het niet in de layout past (omdat het bijvoorbeeld te breed is) en dan kan je weer een link om het plaatje zette die verwijst naar het echte plaatje. Wel goed controleren op de extensie waarop je het opslaat

Zo ben je er zeker van dat je niet hoeft te wachten op de andere server en dat bespaard veel tijd.

Laat me weten of het je gelukt is
Offline Grayen - 11/07/2007 20:48 (laatste wijziging 11/07/2007 20:48)
Avatar van Grayen PHP ver gevorderde Ah mooi, dat iemand er eindelijk in is geslaagd . Ik was al tijden opzoek naar een manier op dit te kunnen doen op serverside gebied. Het script is nog wel erg onveilig, maar het principe werkt.

Je kunt nu heel simpel als hacker een php bestand uploaden door als image locatie een php bestand op te geven. Controleer dus of het 'php' in de extensie naam voorkomt, zodat er geen php kan worden uitgevoerd.
Offline smoos - 11/07/2007 20:53 (laatste wijziging 11/07/2007 20:54)
Avatar van smoos PHP gevorderde Tjah dat zijn gewoon standaard controles die je moet uitvoeren. Maar als je doet was ik zei onder me voorbeeld zit je al heel veilig

Edit:
[offtopic]Krijg ik nu ook status "PHP ver gevorderde" [offtopic]
Offline Voldemort - 11/07/2007 21:08 (laatste wijziging 11/07/2007 21:08)
Avatar van Voldemort PHP ver gevorderde Als men nu een .php bestand gebruikt, maar men veranderd de extensie naar .jpg. Dan is dat nog steeds een PHP bestand. Is dit een goede functie om dit te controleren:

http://be2.php....getype.php

en zo te gebruiken:

  1. if(exif_imagetype($net_geupload_file) !== FALSE)
  2. echo 'Doe de checks';
  3. else
  4. echo 'Is geen image, verwijderen';


Of zijn er betere andere functies?
Offline JBke - 11/07/2007 21:17
Avatar van JBke PHP gevorderde als je checked op mimetype ipv enkel extensie is het ook ok, dan filter je ook enkel images.

Je kan ook uitgebreider gaan werken met http://be2.php....d-data.php hangt ervan af welke data je later allemaal wil gaan gebruiken en/of nodig hebt van een image.
Offline Grayen - 12/07/2007 09:02
Avatar van Grayen PHP ver gevorderde Ik zou op zowel extensie en mimetype gaan controleren, anders kan men alsnog php uitvoeren op je server.

Bron: http://phpfreak...mp;page=13
Offline Voldemort - 12/07/2007 09:21 (laatste wijziging 12/07/2007 09:22)
Avatar van Voldemort PHP ver gevorderde Is deze goed qua veiligheid?

  1. <?php
  2. if((substr($url,-4) == '.jpg' || substr($url,-4) == '.png' || substr($url,-4) == '.gif') && exif_imagetype($url) !== FALSE)
  3. echo 'Alles ok, upload maar';
  4. else
  5. echo 'Alles niet ok, upload niet';
Offline Grayen - 12/07/2007 11:30
Avatar van Grayen PHP ver gevorderde Jep, is veilig. Maar ik zou het zo aanpakken:

  1. <?php
  2. $sImage = 'grayen.gif';
  3. $aImageTypes = array(1 => 'gif', 2 => 'jpeg', 3 => 'png', 6 => 'bmp', 15 => 'wbmp', 16 => 'xbm');
  4. if(($iType = exif_imagetype($sImage)) !== false && isset($aImageTypes[$iType]) && $aImageTypes[$iType] == substr($sImage, strrpos($sImage, '.') + 1))
  5. ?>
Offline Voldemort - 19/07/2007 12:23
Avatar van Voldemort PHP ver gevorderde Ik heb een script samengesteld, alleen heb ik nu nog 1 probleem:

Als het bestand niet bestaat krijg ik een error van file_get_contents. Hoe kan ik controleren of het bestand op de server bestaat?
Offline citroen - 19/07/2007 12:26
Avatar van citroen Onbekend PHP.net: file_exists
Offline Voldemort - 19/07/2007 12:30 (laatste wijziging 19/07/2007 12:31)
Avatar van Voldemort PHP ver gevorderde Het is een url dat moet worden gecontroleerd en ik heb geen PHP 5 (PHP 4). Dus die functie zal niet werken.
Offline citroen - 19/07/2007 12:34
Avatar van citroen Onbekend dan doe je if ( file_get_contents( ... ) ) {} bij error return die false...
Offline Voldemort - 19/07/2007 12:53
Avatar van Voldemort PHP ver gevorderde Hier returnt die warning:

  1. $sSource = file_get_contents($data);
  2.  
  3. if($sSource === FALSE)
  4. return FALSE;


==>

Citaat:
Warning: file_get_contents(http://www.metalendakramen.be/afbeeldingen/wp4fc462a8.php) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/quinten/www/hp-d_v30/imagesize.php on line 17
Offline citroen - 19/07/2007 12:57 (laatste wijziging 19/07/2007 13:12)
Avatar van citroen Onbekend
  1. if ( $sSource = file_get_contents($data) ) {
  2. }


Citaat:
Code tags vergeten!
Offline Voldemort - 19/07/2007 15:37
Avatar van Voldemort PHP ver gevorderde @citroen: Dan krijg ik nog steeds die warning.
Offline smoos - 25/07/2007 10:06
Avatar van smoos PHP gevorderde Is het eigenlijk gelukt?
Je kan met getimagesize() veilig bekijken of het echt een plaatje is
Offline xSc - 25/07/2007 11:58
Avatar van xSc Onbekend En als je het i.c.m. curl doet? Mijn ervaring is dat curl zeer snel werkt.

curl i.c.m. getimagesize?
Offline Thomas - 25/07/2007 12:44
Avatar van Thomas Moderator Ik denk dat file_get_contents() (naast false) tevens een warning produceert, geen error, als een bestand niet bestaat.
Deze kun je onderdrukken d.m.v. een @ voor de aanroep van deze functie.
Offline smoos - 25/07/2007 13:43
Avatar van smoos PHP gevorderde zelf vind ik het netter om het dan in een if statement te doen.
Offline Thomas - 25/07/2007 14:26
Avatar van Thomas Moderator In dit geval is het niet "fataal" als een extern plaatje niet (meer) bestaat, so why not? De functie geeft toch false terug, waarmee aangegeven wordt dat het bestand niet (meer) bestaat, dus die notice/warning heb je niet nodig.
Hoe wou je het trouwens in een if-statement doen? Die notice krijg je dan ook :].
Offline smoos - 25/07/2007 15:30
Avatar van smoos PHP gevorderde ging nog even testen en je krijg dat idd die melding. Dus toch maar gebruik van @
Offline Grayen - 25/07/2007 18:22
Avatar van Grayen PHP ver gevorderde Krijg je de foutmelding ook als je het als volgt doet?

  1. if(($sContents = file_get_contents($sLocation)) !== false)
  2. {
  3. // Code.
  4. }
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.253s