[php] Eerste afbeelding wordt niet weergeven, rest wel *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo allemaal,
Ik gebruik dit script:
show_image.php
code:
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
<?php
// The file
$filename = $_GET['plaatje'];

// Set a maximum height and width
$width = $_GET['width'];
$height = $_GET['height'];

// Content type
$the_content = mime_content_type($filename);

header("Content-type: $the_content");

// Get new dimensions
list($width_orig, $height_orig) = getimagesize($filename);

$ratio_orig = $width_orig/$height_orig;

if ($width/$height > $ratio_orig) {
   $width = $height*$ratio_orig;
} else {
   $height = $width/$ratio_orig;
}

// Resample
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

// Output
imagejpeg($image_p, null, 100);
?>

met deze html:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div style="border:0;height:200px;overflow:auto;padding:5px;">
<table border='1' style="border-collapse:collapse;width:100%;">
<?php
$result = mysql_query("SELECT * FROM gallerij");
while($row = mysql_fetch_array($result)) {
echo "<tr><td style='width:80%'>
<style type='text/css'>
a {
border: none;
}
a:hover {
border: none;
}
</style>

<a title='" . $row['naam'] . "' href='show_image.php?plaatje=" . $row['bestandsnaam'] . "&amp;width=300&amp;height=300' rel='lightbox[gallerij]'>

<img style='max-width:400;max-height:100px;' src='./" . $row['bestandsnaam'] . "' title='" . $row['naam'] . "' alt='" . $row['naam'] . "' /></a></td><td style='width:20%'>" . $row['naam'] . "<br />
<a href=\"javascript:ubb('[img]http://markvanoort.nl/admin/" . $row['bestandsnaam'] . "','[/img]')\">invoegen</a></td></tr>";
}
?>

</table>
</div>

bij het eerste plaatje werkt de lightbox niet (hij blijft maar door laden),bij de 2e wel.

hoe kan dit? want ik ben ten einde raad 8)7

EDIT: ik kom er net achter dat dit op elke pagina het geval is (dus elke 2e plaatje werkt, maar de 1e niet)

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Kloppen de content types die je uit mime_content_type() krijgt? Die functie is namelijk deprecated omdat er betere alternatieven zijn.

Wat kan je aan debugging doen? Wat heb je geprobeerd?

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
eigenlijk ben ik niet ZO goed met PHP, dus heb ik nog niet veel eraan gedaan. Welke alternatieven zijn er dan?

EDIT: het is alleen bij de plaatjes die op JPG eindigen en niet die op jpg, welke verklaring hiervoor?

[ Voor 32% gewijzigd door Verwijderd op 09-05-2009 22:59 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Bekijk de uitvoer gewoon eens los in je browser. Werkt de afbeelding dan wel? Zoja, dan ligt het aan de clientside kant. Zoniet, dan moet je het script gaan debuggen (error_reporting(E_ALL|E_STRICT)).

Die mime-functies zijn vrij waardeloos want die checken alleen de extensie. Er is nog geen php-functie zover ik weet die dit bepaald op inhoud. Zelf check ik altijd eerste de extensie en probeer ik de bijhorende imagecreatefrom*-functie. Als die faalt probeer ik ze allemaal om te zorgen dat een png met jpg extensie ook werkt :)

edit: leer debuggen dus ;) Controleer wat die mime-functie teruggeeft. Als iets "het niet doet" is er een reden voor en daarvoor moet je error_reporting aanhebben staan.

[ Voor 13% gewijzigd door Cartman! op 09-05-2009 23:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
apart werkt het ook niet, hij doet het ook alleen bij hoofdletter extensies, reden voor dit?

Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
Ik zou geen verouderde mime functie gebruiken maar het nieuwere finfo_file om het type te achterhalen.
met deze html: ...
Dat is duidelijk geen html maar een brij van php en html. Je kan beter een apart html bestand aanmaken, waarbij als php iets moet invullen gewoon %textje% gebruiken. Dan kan je in php het html bestand inlezen en met str_replace de % plekken invullen. Of natuurlijk gewoon een kant en klaar template systeem gebruiken.

Dus:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

function gettemplate($filename)
{
    $handle = fopen($filename, "r");
    $template = fread($handle, filesize($filename));
    fclose($handle);
    return $template;
}

$pagina=gettemplate("voorbeeld.html");
$pagina= str_replace("%text%", "hello world",$pagina);
echo $pagina

HTML:
1
2
3
4
5
<html>
<body>
%text%
</body>
</html>

[ Voor 32% gewijzigd door djexplo op 09-05-2009 23:21 ]

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, die mime_functie doet GEWOON zijn werk, het zit hem aleen in die JPG en jpg. Zijn daar antwoorden voor?

EDIT: nu doet hij het ook bij .jpg (gwoon laag dus) het ook al niet meer bij SOMMIGE plaatjes:'(

[ Voor 31% gewijzigd door Verwijderd op 09-05-2009 23:21 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Wat heb je nu al geprobeerd dan? Je hebt nu toch een richting waarin je kunt zoeken?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja maar de site is al bijna af, maar ik wilde alleen dit nog even aanpassen

EDIT: vrijwel niets, ik heb alleen die functie even weg gedaan (mime_content_type)

[ Voor 36% gewijzigd door Verwijderd op 09-05-2009 23:24 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dan zou ik eerst even debuggen. Kijk of je een patroon kunt vinden in welke files t niet doen (zijn ze te groot? zijn t wel echt jpg's en niet stieken png's?). Gewoon even debuggen en checken bij welke functie het nu mis gaat.

En ik zeg t nog maar n keer: zet error_reporting aan!

edit: die finfo functie ziet er ook niet geweldig uit als ik zo de comments eens lees. Ook is het een optioneel iets wat een hoster los moet activeren, reken er maar op dat 80% van de hosts dit dus niet ondersteunt.

[ Voor 27% gewijzigd door Cartman! op 09-05-2009 23:27 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nee, het zijn geen png;) hoe debug je? gewoon door te kijken wat er eventueel is foutgegaan.

EDIT: ik heb de errorreport aangezet met
<?php
error_reporting(E_ALL|E_STRICT);
?>

is dat zo goed?

[ Voor 37% gewijzigd door Verwijderd op 09-05-2009 23:30 ]


Acties:
  • 0 Henk 'm!

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 09-09 17:18
Lost onderstaande code je probleem op?
Regel 10
code:
1
$the_content = mime_content_type(strtolower($filename));

Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
imagejpeg($image_p, null, 100);
Je geeft altijd een JPEG terug volgens je code ook in het geval van een png, stel dan ook Content-type vast in op jpg...

ook de regel
$image = imagecreatefromjpeg($filename);
werkt natuurlijk niet bij png...

[ Voor 23% gewijzigd door djexplo op 09-05-2009 23:33 ]

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Trouwens, wat me ook opvalt is dat jij nadat je de JPG laat zien dat je het niet weer vernietigd.
Voeg eens toe aan de laatste regel:
PHP:
1
imagedestroy($image_p);

Of:
PHP:
1
imagedestroy($image);


Ik weet zo niet of dit zal werken maar het scheelt je veel geheugen verbruik ;)

EDIT: Voeg
PHP:
1
header('Content-type: image/jpeg');
toe aan de bovenkant.

[ Voor 12% gewijzigd door Manuel op 09-05-2009 23:33 . Reden: Iets over het oog gezien. ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
als je dat doet, verwijderd die dan het hele plaatje v/d server?

@djexplo: heb ik al gedaan ;)

[ Voor 20% gewijzigd door Verwijderd op 09-05-2009 23:34 ]


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Verwijderd schreef op zaterdag 09 mei 2009 @ 23:33:
als je dat doet, verwijderd die dan het hele plaatje v/d server?
Dat lijkt me niet.
Kijk anders voor meer informatie eens hier: http://nl.php.net/manual/en/function.imagejpeg.php

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, maar is er een oplossing die echt WERKT?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Cartman! schreef op zaterdag 09 mei 2009 @ 23:26:
Dan zou ik eerst even debuggen. Kijk of je een patroon kunt vinden in welke files t niet doen (zijn ze te groot? zijn t wel echt jpg's en niet stieken png's?). Gewoon even debuggen en checken bij welke functie het nu mis gaat.

En ik zeg t nog maar n keer: zet error_reporting aan!

edit: die finfo functie ziet er ook niet geweldig uit als ik zo de comments eens lees. Ook is het een optioneel iets wat een hoster los moet activeren, reken er maar op dat 80% van de hosts dit dus niet ondersteunt.
te groot? daarvoor is het script tocht juist ;)
want is die 'finfo functie'?

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

Verwijderd schreef op zaterdag 09 mei 2009 @ 22:34:
EDIT: het is alleen bij de plaatjes die op JPG eindigen en niet die op jpg, welke verklaring hiervoor?
Verwijderd schreef op zaterdag 09 mei 2009 @ 23:04:
apart werkt het ook niet, hij doet het ook alleen bij hoofdletter extensies, reden voor dit?
Verwijderd schreef op zaterdag 09 mei 2009 @ 23:17:
ok, die mime_functie doet GEWOON zijn werk, het zit hem aleen in die JPG en jpg. Zijn daar antwoorden voor?

EDIT: nu doet hij het ook bij .jpg (gwoon laag dus) het ook al niet meer bij SOMMIGE plaatjes:'(
Staat je site op een Linux-host toevallig (of weet je dit niet)? Linux-machines, in tegenstelling tot Windows-machines, maken namelijk wel onderscheid tussen hoofd- en kleine letters in bestandsnamen. Je kan dus plaatje1.jpg en plaatje1.JPG tegelijk in dezelfde map hebben en het zijn echt verschillende bestanden. Ik gok dat het hieraan ligt.
Laat voor de gein eens een paar bestandsnamen uit je galerij-tabel met de bijbehorende bestandsnamen in je plaatjes-map zien?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nee. gewoon Windows hebben wij;)
hier kun je het vinden: http://markvanoort.nl/weerspiegeling_schilderijen.php
EDIT: er staan geen dubele bij hoor;)

[ Voor 14% gewijzigd door Verwijderd op 10-05-2009 00:03 ]


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

ERROR 500: Internal Server Error.
Ik denk dat je script ergens crasht :+ Het zou trouwens, zoals hierboven gezegd, best zo kunnen zijn dat je plaatjes te groot zijn. Het eerste plaatje (werkt niet) is namelijk ongeveer 3MB terwijl het tweede plaatje (werkt wel) slechts 1MB is. Als je hoster een geheugen-limiet van 2MB voor een script heeft ingesteld is het vrij logisch dat de eerste niet werkt.

Afgezien daarvan denk ik serieus dat je deze aanpak in deze situatie niet gaat willen gebruiken (en je hoster ook niet). Je hoeft je plaatje namelijk in principe maar eenmalig te schalen om hem daarna weer te laten geven. De server verricht nou onnodig veel werk voor iets waarvan het resultaat elke keer hetzelfde gaat zijn. Zeker met veel plaatjes en veel bezoekers gaat de server heel hard over de zeik. Ik zou je echt aanraden de plaatjes vooraf op je eigen pc te schalen of via een apart script (als je commandline-toegang hebt zou je dat kunnen proberen, het geheugenlimiet kan daarvoor wel eens hoger ingesteld staan), om ze daarna gewoon direct te linken in je pagina.

Edit: ook zit er een mooie DoS in je script, welke netjes wordt afgevangen door de geheugen-instellingen. Als ik bijvoorbeeld een plaatje met resolutie 20000x60000 opvraag probeert jouw script dat gewoon te maken, met als resultaat dezelfde 500 Internal Server Error als met je eerste plaatje. Ook zal de server relatief makkelijk plat te krijgen zijn met veel tegelijke requests op een van de plaatjes, ik denk niet dat je daar meer dan 1 machine voor nodig hebt. Allemaal dingen die ik in overweging zou nemen.

Edit2: het is ook triviaal voor anderen om jouw script te ge/misbruiken:
code:
1
/show_image.php?plaatje=http://example.com/plaatje.jpg&height=200&width=600

Deze resizet netjes het plaatje vanaf de andere host. Scheelt weer bandbreedte voor de persoon die hem geschaald wil gebruiken om welke reden dan ook.

[ Voor 23% gewijzigd door DataGhost op 10-05-2009 00:16 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
TS: verdiep je eerst in eens in de functies die je aanroept en wat die precies doen want volgens mij heb je geen flauw idee waar je mee bezig bent. Opzich niet erg dat je het nog niet allemaal weet maar er wordt wel verwacht dat je zelf een beetje inzet toont natuurlijk.

Daarmee doel ik vooral op:
te groot? daarvoor is het script tocht juist ;)
want is die 'finfo functie'?
als je dat doet, verwijderd die dan het hele plaatje v/d server?

Acties:
  • 0 Henk 'm!

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

Matis

Rubber Rocket

Allereerst, ligt het er waarschijnlijk al aan op wat voor een host je draait mbt filenames en uppercase extenties e.d. In linux is .jpg != .JPG, maar windows vind het allemaal prima.

Ik heb dit een keer zelf gemaakt op een linux host: http://meuk.matis-digital.com/photobook/
http://meuk.matis-digital.com/Photobook/ (doet het dus niet)

Ik scan elke directory voor afbeeldingen, checkt of de extentie jpg of gif of png oid is (allemaal eerst naar lowercase) en dan laat hij de afbeeldingen zien in de shadowbox.

[ Voor 6% gewijzigd door Matis op 10-05-2009 10:26 ]

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


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, maar er definitieve oplossing is er dus niet?

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Verwijderd schreef op zondag 10 mei 2009 @ 11:53:
ok, maar er definitieve oplossing is er dus niet?
Natuurlijk zijn er wel oplossingen, maar voordat je verder gaat adviseer ik / (vele anderen) je toch eerst een beetje hierin te gaan verdiepen, als ik namelijk zo ook je reacties lees snap je haast niets van PHP.

Neem een voorbeeld aan de php-documentatie, je kan er veel uit leren, zo heb ik ook PHP geleerd.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Er zijn inderdaad waarschijnlijk wel oplossingen, maar je zult toch eerst goed moeten debuggen wat er precies fout gaat.

Over debuggen hebben we een mooi stuk in de FAQ staan ( Debuggen: Hoe doe ik dat? ), dus dat zou je eens door kunnen lezen. Het mooist zou een IDE zijn waar je ook break-points kunt zetten, maar ik heb begrepen dat er voor PHP weinig gratis IDE's zijn die dat kunnen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1