Verwijzing naar bestandslocatie onjuist?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ivar Labordus

Ivar Labordus

16/02/2020 15:03:08
Quote Anchor link
Een aanwijzing over de mogelijke fout, die ik hier maak, zou zeer welkom zijn.
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    $PadInfo
="//LAB01/Users/Ivar Labordus/Pictures/Saved Pictures/Levi/";
?>

En in de Body:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php             
    $FileName
="0001.jpg";
    $FullName = $PadInfo . $FileName;
    ?>

<a target="_blank" href=
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $FullName ?>
>
<h>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $FullName ?>
</h>
<img src=
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $FullName ?>
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.
 
PHP hulp

PHP hulp

28/03/2024 19:49:19
 
- Ariën  -
Beheerder

- Ariën -

16/02/2020 15:13:06
Quote Anchor link
Zou je de code tussen code-tags kunnen plaatsen ?

Toevoeging op 16/02/2020 15:13:15:

Zou je de code tussen code-tags kunnen plaatsen ?
 
Thomas van den Heuvel

Thomas van den Heuvel

16/02/2020 15:19:30
Quote Anchor link
Het lijkt erop dat $PadInfo spaties bevat. Je zult dus in ieder geval (dubbele) quotes om de waarde van het href-attribuut moeten zetten.

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.
 
Ivar Labordus

Ivar Labordus

16/02/2020 20:00:38
Quote Anchor link
Dank voor de snelle reacties.
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.
 
- Ariën  -
Beheerder

- Ariën -

16/02/2020 20:23:55
Quote Anchor link
b-tags is om iets vet te maken, en code tags maken codeblokken ;-)

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 -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

16/02/2020 22:43:21
Quote Anchor link
Bovendien moet er in de src attribuut van het <img> element helemaal geen filepath gebruikt worden maar een URL. De browser moet het plaatje namelijk via een sub-request van de server (over het internet) kunnen plukken. Om die reden kun je ook zelf direct de image openen in je browser zoals je dat bijvoorbeeld op deze site kunt met het logo helemaal links boven. De HTML van dit logo ziet er zo uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<img src="/img/phphulp-logo.jpg" title="PHPhulp kerst logo" alt="PHPhulp logo">

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
 
- Ariën  -
Beheerder

- Ariën -

16/02/2020 22:52:51
Quote Anchor link
Anyway.... mooie vinding: "PHPhulp kerst logo"
 
Frank Nietbelangrijk

Frank Nietbelangrijk

16/02/2020 23:02:06
Quote Anchor link
- 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
 
Ivar Labordus

Ivar Labordus

17/02/2020 11:21:16
Quote Anchor link
OK. Helder.
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?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

17/02/2020 11:43:15
Quote Anchor link
Min of meer. Je webserver heeft een DocumentRoot als instelling. Dit is de directory waar de bestanden komen te staan die de server mag delen met de rest van de wereld. In deze directory mogen wel sub-directories geplaatst worden. Zo zie je vaak een map css, js en images bijvoorbeeld.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>

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
 
Michael -

Michael -

17/02/2020 12:40:53
Quote Anchor link
Even inhakend op Frank, je zou dus een dynamisch bestand kunnen maken om de afbeelding in de laden
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>


en in een ander bestand vervolgens zo weergeven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<img src="image.php?img=0001.jpg">


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 -
 
- Ariën  -
Beheerder

- Ariën -

17/02/2020 12:57:13
Quote Anchor link
Bijna goed:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<img src="image.php?img=0001.jpg">


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.
 
Rob Doemaarwat

Rob Doemaarwat

17/02/2020 17:02:54
Quote Anchor link
... 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).
 
Frank Nietbelangrijk

Frank Nietbelangrijk

17/02/2020 22:46:13
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.