include PDF file?
/opdrachten
1.pdf
2.pdf
3.pdf
Om nu te voorkomen dat een bezoeker door de map gaat bladeren heb ik een .htacces file geplaatst die ik elders ook gebruik om te voorkomen dat documenten in deze dir direct aangeroepen kunnen worden:
Options +Includes
AddType text/html shtml php
AddHandler server-parsed shtml
Tot dusver ben ik nog niet tegen het probleem aangelopen, omdat ik via een include of require scripts toevoegde uit dergelijke directories, maar nu wil ik de PDF bestanden openen in een nieuw browser venster.
Kan dit ook met een include of require of is er een slimmere manier?
Mijn idee is om een post te doen naar een .php script buiten deze map waarbij ik de bestandsnaam en dirnaam mee geef.
Tips?
Ondertussen vroeg ik me ook nog af of ik bij AddType (in htaccess) PDF moet toevoegen in de huidige setup? (ben geen expert in htaccess)
Direct aanroepen wil dan niet meer, maar omdat je PHP script niet via Apache bij de bestanden komt maar gewoon via het bestandssysteem, kan die er wel zonder beperkingen bij.
Het is wel veiliger om de bestanden buiten je www-root te zetten, want hier is het nog mogelijk dat bij een upgrade oid de configuratie van Apache verandert, en .htaccess bestanden worden genegeerd waardoor je plots wel bij de bestanden kan. (ook leuk als datzelfde gebeurt en PHP bestanden als platte tekst worden gezien)
Code (php)
1
2
3
4
2
3
4
<?php
$file = "/server/".$_POST['dirnaam']."/".$_POST['bestandsnaam'];
readfile($file);
?>
$file = "/server/".$_POST['dirnaam']."/".$_POST['bestandsnaam'];
readfile($file);
?>
dus zonder enige html, eigenlijk hetzelfde als wanneer je rechtstreeks naar het bestand een link maakt?
In plaats van Apache die de bytes van het bestand leest en naar de browser stuurt is het nu PHP die dat doet. Voor de rest gebeurt er (ongeveer) hetzelfde.
Toevoeging op 22/04/2011 14:22:08:
Nou, ik ben er bijna...
Heb even geinformeerd, maar zoals verwacht heb ik geen rechten om buiten de root te schrijven! Het zal dus binnen de www map moeten met een .htaccess beveiliging op de dir met pdf bestanden.
So far, so good! Maar, nu ik met het onderstaande script een PDF wil openen, wordt het bestand als tekst geopend. Ik vermoed dat ik iets van een embed ofzo zal moeten doen?? Het resultaat is nu zoiets als:
"%PDF-1.7 3 0 obj <> /Resources 2 0 R /Contents 4 0 R>> endobj 4 0 obj <> stream xœí[KoÛ8¾ûWÌehX>DI잤O4ív뢇¶Å¢Ùz8²ì=õ§ä§.©W(GubÇv”…DÉh̙Ùá eaĸ ïþÿT|õûÂèwÜ‡ç¯ ¬hèáU¿‡7t\pD]õ9 ®E%³1²]........... enz"
Code (php)
Toevoeging op 22/04/2011 14:29:38:
Ohh... nevermind, ik heb de oplossing gevonden!
Even gekeken naar een voorbeeld van readfile:
Het moet zijn:
Na voorgaande loop ik toch nog tegen een ding aan... namelijk als ik vanuit een venster een PDF bestand wil openen in een nieuw venster:
<html>
<form action="/pdf.php" method="post" name="form1" target="_new" id="form1">
<input type="image" name="Open" id="Open" value="Open" src="/buttons/application-pdf-2.png" width="48" height="48" border="0" align="middle" alt="Open inkoopopdracht" />inkoopopdracht
<input name="file" type="hidden" id="file" value="" />
<input name="path" type="hidden" id="path" value="" />
</form>
</html>
In eerste instatie gaat dit goed, maar als de gebruiker dit nieuwe venster niet sluit en vervolgens nogmaals op het icoon klikt om deze (of een andere) pdf te openen dan geeft de controle van onderstaande script foutmeldingen:
> de bestandsnaam is ongeldig!
> het pad is ongeldig!
Het volledige script voor het openen van de PDF:
Code (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
55
56
57
58
59
60
61
62
63
64
65
66
67
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
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
# Met dit script kunnen PDF bestanden worden geopend
# via een POST naar dit script wordt het "pad" en de "bestandsnaam" opgegeven
# via de variabelen '$_POST['file'] en $_POST['path']
# In onderstaande parameters geven we op welke extenties zijn toegestaan,
# wat de naam van de rootdir is en of bestanden buiten de rootdir ook opgevraagd mogen worden.
# Vervolgens wordt het bestand geopend in het venster
# ---------------------------------- PARAMETERS ----------------------------------
# onderstaande parameters moeten worden ingesteld voor de juiste werking van de controles!
// de bestandsextenties die we verwachten
$toegestane_extenties = "pdf|PDF"; // bijvoorbeeld extenties voor afbeeldingen: "jpg|jpeg|gif|png";
// naam van de web(root)dir (meestal: "www")
$rootdir = "httpd.www";
// is het toegestaan om bestanden buiten de web(root)dir op te halen: (J/N)
$buiten_root = "N";
# --------------------------------------------------------------------------------
# Controle of de bestandsnaam een toegestane extentie .pdf heeft
// string voor toegestane extenties
$rEFileTypes = "/^\.(".$toegestane_extenties."){1}$/i";
// als alles achter de laatste '.' overeenkomst met de toegestane extenties
if (preg_match($rEFileTypes, strrchr($_POST['file'], '.'))) {
// zet de waarde voor $bestandsnaam
$bestandsnaam = $_POST['file'];
} else {
echo "de bestandsnaam ".$_POST['file']." is ongeldig!<br />";
}
// de huidige locatie opvragen
$huidige_locatie = getcwd();
// haal het pad naar de root uit $huidige_locatie
$rootpad = strstr($huidige_locatie, $rootdir, true);
// bestand buiten de "WWW" map toestaan:
if (($buiten_root == "J") AND (strstr($_POST['path'], $rootdir, true) == $rootpad)) {
$pad = $_POST['path'];
}
else
// alleen bestanden binnen de "WWW" map toestaan:
if (($buiten_root == "N") AND ((strstr($_POST['path'], $rootdir, true).$rootdir) == ($rootpad.$rootdir))) {
$pad = $_POST['path'];
} else {
echo "het pad ".$_POST['path']." is ongeldig!<br />";
}
// als de variabelen zijn gezet, openen we het bestand
if (($pad) AND ($bestandsnaam)) {
$file = $pad.$bestandsnaam;
if (file_exists($file)) {
header('Content-Type: application/pdf');
ob_clean();
flush();
readfile($file);
exit;
}
}
?>
# Met dit script kunnen PDF bestanden worden geopend
# via een POST naar dit script wordt het "pad" en de "bestandsnaam" opgegeven
# via de variabelen '$_POST['file'] en $_POST['path']
# In onderstaande parameters geven we op welke extenties zijn toegestaan,
# wat de naam van de rootdir is en of bestanden buiten de rootdir ook opgevraagd mogen worden.
# Vervolgens wordt het bestand geopend in het venster
# ---------------------------------- PARAMETERS ----------------------------------
# onderstaande parameters moeten worden ingesteld voor de juiste werking van de controles!
// de bestandsextenties die we verwachten
$toegestane_extenties = "pdf|PDF"; // bijvoorbeeld extenties voor afbeeldingen: "jpg|jpeg|gif|png";
// naam van de web(root)dir (meestal: "www")
$rootdir = "httpd.www";
// is het toegestaan om bestanden buiten de web(root)dir op te halen: (J/N)
$buiten_root = "N";
# --------------------------------------------------------------------------------
# Controle of de bestandsnaam een toegestane extentie .pdf heeft
// string voor toegestane extenties
$rEFileTypes = "/^\.(".$toegestane_extenties."){1}$/i";
// als alles achter de laatste '.' overeenkomst met de toegestane extenties
if (preg_match($rEFileTypes, strrchr($_POST['file'], '.'))) {
// zet de waarde voor $bestandsnaam
$bestandsnaam = $_POST['file'];
} else {
echo "de bestandsnaam ".$_POST['file']." is ongeldig!<br />";
}
// de huidige locatie opvragen
$huidige_locatie = getcwd();
// haal het pad naar de root uit $huidige_locatie
$rootpad = strstr($huidige_locatie, $rootdir, true);
// bestand buiten de "WWW" map toestaan:
if (($buiten_root == "J") AND (strstr($_POST['path'], $rootdir, true) == $rootpad)) {
$pad = $_POST['path'];
}
else
// alleen bestanden binnen de "WWW" map toestaan:
if (($buiten_root == "N") AND ((strstr($_POST['path'], $rootdir, true).$rootdir) == ($rootpad.$rootdir))) {
$pad = $_POST['path'];
} else {
echo "het pad ".$_POST['path']." is ongeldig!<br />";
}
// als de variabelen zijn gezet, openen we het bestand
if (($pad) AND ($bestandsnaam)) {
$file = $pad.$bestandsnaam;
if (file_exists($file)) {
header('Content-Type: application/pdf');
ob_clean();
flush();
readfile($file);
exit;
}
}
?>
Heeft iemand een idee hoe ik dit kan oplossen?