Verwijzing naar bestandslocatie onjuist?
In een poging een foto naar een webpagina te zetten loop ik tegen het volgende probleem aan (ondanks talloze pogingen de fout te vinden). De bedoeling is via een in PHP aangemaakte variabele naar het pas te verwijzen.
De volgende tekst staat in de Header-sectie:
En in de Body:
<a target="_blank" href=>
<h> </h>
<img src= alt="Pad naar /Levi/0001.jpg op \\Lab01 niet gevonden" width="600" height="400">
</a>
In de header wordt het pad keurig weergegeven, maar het ophalen van de foto lukt niet. Steeds wordt de ALT tekst weergegeven.
Ik zou mij zeer geholpen voelen met een aanwijzing waar ik de fout moet zoeken.
Toevoeging op 16/02/2020 15:13:15:
Zou je de code tussen code-tags kunnen plaatsen ?
Ook lijkt het erop het een intern pad betreft, of een soort van netwerklocatie. Weet je zeker dat iedereen toegang heeft tot deze (netwerk)locatie? En misschien is het beter om deze foto's ook echt fysiek op de locatie van de webserver te zetten? Mogelijk hebben anderen die wel toegang hebben tot deze webpagina geen toegang tot $PadInfo? Dus sla de "content" bij voorkeur lokaal op de webserver op.
Van die code-tags: dat moet ik nog even bestuderen (ik ben nieuw op dit forum en meende dat gedaan te hebben).
Inderdaad gaat het om een verwijzing naar een netwerklocatie. De hele applicatie is vooralsnog alleen bedoeld om hier lokaal draaien.
En ik ga het nog een keer proberen, maar de 'truc' met de quotes heb ik eerder geprobeerd. Ook heb ik de foto all eens verplaatst naar een map, waar geen spaties in het pad voorkomen.
Toevoeging op 16/02/2020 20:25:56:
Thomas van den Heuvel op 16/02/2020 15:19:30:
Ook lijkt het erop het een intern pad betreft, of een soort van netwerklocatie. Weet je zeker dat iedereen toegang heeft tot deze (netwerk)locatie?
Een netwerklocatie heeft twee backslashes en geen slashes.
Ik denk zelf dat het een fout pad is.
Gewijzigd op 16/02/2020 20:26:51 door - Ariën -
De tekst die aan het src attribuut gegeven wordt is /img/phphulp-logo.jpg
Als je hier het protocol en de servernaam aan plakt dan krijg je https://www.phphulp.nl/img/phphulp-logo.jpg . Klik je op deze link dan opent je browser het plaatje.
Conclusie: geen filepaths zoals C:\xampp\htdocs\index.php en URL's zoals https://www.phphulp.nl/index.php door elkaar halen.
Gewijzigd op 16/02/2020 22:48:40 door Frank Nietbelangrijk
Anyway.... mooie vinding: "PHPhulp kerst logo"
- Ariën - op 16/02/2020 22:52:51:
Anyway.... mooie vinding: "PHPhulp kerst logo"
Haha ja ik moest er ook even van smilen :p
Maar betekent dat dus dat de fotos onder de map geplaatst moeten worden waarin het PHP-bestand staat? Je kunt dan dus niet naar een willekeurige andere map op dezelfde PC of een andere PC in het netwerk verwijzen? Ook niet als je deze applicatie alleen lokaal wilt gebruiken?
Er zijn ook situaties waarbij je bestanden niet zomaar openbaar wilt maken. In dat geval plaats je ze juist buiten de DocumentRoot. PHP(!) kan dat bestand wel lezen en terugsturen naar de client. En dit kan je zo programmeren dat php dat enkel doet wanneer een gebruiker ingelogd is en voldoende rechten heeft.
Toevoeging op 17/02/2020 11:52:43:
Voorbeeldje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// lees inhoud bestand (let op dit is de ruwe data)
$image = file_get_contents('C:\xampp\private\images\test.jpg');
// zet in de header van ons antwoord naar de client dat het om een JPG foto gaat
header('Content-type: image/jpeg');
// en knal de image data weg
echo $image;
// einde script
exit;
?>
// lees inhoud bestand (let op dit is de ruwe data)
$image = file_get_contents('C:\xampp\private\images\test.jpg');
// zet in de header van ons antwoord naar de client dat het om een JPG foto gaat
header('Content-type: image/jpeg');
// en knal de image data weg
echo $image;
// einde script
exit;
?>
Aangezien hier als het ware de ruwe data van een afbeelding teruggeeft mag je de output niet laten verstoren met aanvullende tekst of een foutmelding of iets dergelijks. Je echo-t dus echt alleen de inhoud van het bestand!
Gewijzigd op 17/02/2020 11:44:16 door Frank Nietbelangrijk
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//image.php
// lees inhoud bestand (let op dit is de ruwe data)
if(isset($_GET['img'])) {
$image = file_get_contents('//LAB01/Users/Ivar Labordus/Pictures/Saved Pictures/Levi/' . htmlspecialchars($_GET['img']));
// zet in de header van ons antwoord naar de client dat het om een JPG foto gaat
header('Content-type: image/jpeg');
// en knal de image data weg
echo $image;
}
// einde script
exit;
?>
//image.php
// lees inhoud bestand (let op dit is de ruwe data)
if(isset($_GET['img'])) {
$image = file_get_contents('//LAB01/Users/Ivar Labordus/Pictures/Saved Pictures/Levi/' . htmlspecialchars($_GET['img']));
// zet in de header van ons antwoord naar de client dat het om een JPG foto gaat
header('Content-type: image/jpeg');
// en knal de image data weg
echo $image;
}
// einde script
exit;
?>
en in een ander bestand vervolgens zo weergeven:
Edit; Bedankt Arien. Was nog niet helemaal scherp ;)
Ik denk dat je ook wel basename() kan gebruiken als je toch nooit in een andere directory wilt zijn (als aanvulling op Rob)
Gewijzigd op 17/02/2020 17:18:33 door Michael -
En nog mooier is het als je een isset() check doet op je $_GET['img'], en eventueel een readfile doet naar een 'Oops, image not found' plaatje.
... en misschien "een paar kleine controles inbouwen" om te voorkomen dat "gebruikers" image.php?img=../../../../../../../../../etc/passwd op gaan vragen ... (of elke willekeurige andere file - je serveert 'm namelijk gewoon plat uit, dus ook PHP wordt leesbaar, wel met een content-type: image header, maar dat maakt niet uit).
Mja ik zou zelf helemaal geen bestandsnamen accepteren. Gewoon een id en dan haal ik de bestandsnaam wel uit de database. Dat sluit ook prima aan als je aanvullende informatie wilt opslaan over je bestanden zoals uploaddatum en wie de eigenaar is.