Link naar bestand

Status
Niet open voor verdere reacties.

aeweber

Gebruiker
Lid geworden
17 mrt 2005
Berichten
36
Een nieuwe vraag.

Ik heb op een pagina een link naar een bestand (noem het "test.zip"). Nu wil ik telkens als iemand op de link klikt een downloads-teller ophogen (die is opgeslagen als record-veld in een SQLite database). Dat betekent dat ik eerst wil dat er een php-scriptje (met daarin een bepaalde query) wordt uitgevoerd voordat de bezoeker naar het eigenlijke bestand wordt verwezen.

Is dit mogelijk en zo ja, hoe? Ik kom er zelf niet uit... Alvast bedankt voor de hulp! ;)
 
aeweber zei:
Een nieuwe vraag.

Ik heb op een pagina een link naar een bestand (noem het "test.zip"). Nu wil ik telkens als iemand op de link klikt een downloads-teller ophogen (die is opgeslagen als record-veld in een SQLite database). Dat betekent dat ik eerst wil dat er een php-scriptje (met daarin een bepaalde query) wordt uitgevoerd voordat de bezoeker naar het eigenlijke bestand wordt verwezen.

Is dit mogelijk en zo ja, hoe? Ik kom er zelf niet uit... Alvast bedankt voor de hulp! ;)

welke velden staan er in die tabel? Dan kan ik wel de php code schrijven.
Het is eigenlijk gewoon een php die je aan laat roepen met een id code erbij en dat dat php scriptje bij de id de teller met 1 verhoogd en daarna het bestand wat bij die id hoort opent.
maar zonder te weten hoe jij je tabel ingedeeld hebt is het lastig hier een scriptje voor te maken :)

Of is het nog een lege tabel en moet die nog ingedeelt worden :)
 
Hey Aeweber,

Om jouw doel echt goed te behalen moet je wel rekening houden met het feit dat sommige mensen direct zullen linken naar het zip bestand. In dat geval zou het PHP bestand nooit worden uitgevoerd...

Er zijn een aantal mogelijkheden om dat voor elkaar te krijgen, maar ik zal mij eerst beperken tot het script.

Ik ga ervan uit dat je een constructie wilt waarbij je "index.php?did=10" in de browser typt en dan het bestand download. Natuurlijk willen we ook "index.php?did=blaat.zip" in de browser kunnen typen en dan ook downloaden.

De eerste query haalt het bestand uit de database wat gedownload moet worden.
Code:
$query = "SELECT `id`, `filename`, `count` FROM `downloads` WHERE 1 AND (`id`='$did OR `filename`='$did') LIMIT 1'";

Nu kunt je allemaal leuke dingen uitvoeren. Zorg dat voor je de volgende query uitvoert je al hebt gezorgd dat $count eentje hoger was dan toen je begon.

Code:
$query = "UPDATE `downloads` SET `count`='$count' WHERE 1 AND `id`='$did' LIMIT 1";

Dan moet je nu nog gaan zorgen dat het bestand als download wordt aangeboden. Daarvoor hebben we de volgende lieve code:

Code:
	$ctype = " application/zip"; // Applicatie type, dit geval zip
	$filename = "HAAL_DEZE_UIT_DE_DATABASE"; // Bestandsnaam
	header("Pragma: public");
	header("Expires: 0");
	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
	header("Cache-Control: private",false); 
	header("Content-Type: $ctype");
	header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
	header("Content-Transfer-Encoding: binary");
	header("Content-Length: ".filesize($filename));
	readfile("$filename");
	exit();

Dat is het wat betreft de code die je in eerste instantie vroeg. Nu heb je ook nog niets nodig waardoor het bestand niet kan worden gedownload zonder dat het langs de PHP file is geweest. Dat kan op twee manieren:

.htacces:password
Als je de ZIP in een met .htacces beveiligde map zet dan kan de gebruiker er niet bij. Dit is erg makkelijk te doen, mocht je dat niet vinden op google of op helpmij dan hoor ik het wel, maar er zijn volgens mij genoeg berichten over geschreven. Je kunt het bestand dan alleen nog met de server benaderen(wat het PHP bestand doet), of door een password in te typen in de browser.

.htacces:mod_rewrite
Momenteel is mod_rewrite erg in. Het zorgt ervoor dat je bepaalde URL's die worden ingetypt kunt ombuigen. Wat je in dat geval kunt doen is zorgen dat je alle aanvragen voor een .zip ombuigt naar het PHP bestand en ze dan verwerkt. Ook daar kan ik de code voor geven, al verwacht ik dat die ook al op het forum te vinden is. Mocht je die willen hebben dan hoor ik het wel.

Veel succes.


Wout
 
Hartelijk dank voor de antwoorden! :thumb: Ik zal eerst mijn code tot nu toe laten zien: in een map staan de volgende 4 bestanden:

1. testzip.zip: een dummy-bestand die de bezoeker kan downloaden.

2. down.sdb: een SQLite database die de tabel "downloadstabel" bevat, met twee kolommen "id" (primary key) en "aantal": dit getal representeert het aantal downloads. In de tabel staat, om het simpel te houden, 1 record met waarden id=1 en aantal=0 (startwaarde).

3. pagina.php: hierop staat een link waarop bezoekers kunnen klikken om testzip.zip te downloaden en daarachter het aantal downloads (wordt uit de database geplukt). De code ziet er als volgt uit:

Code:
<html><head><title>Pagina</title></head><body>

<?php
$db = sqlite_open("down.sdb");
$result = sqlite_query($db, "select * from downloadstabel where id=1;");
?>

<a href="testzip_doorverwijs.php" target=_blank>Download testzip.zip</a> Aantal downloads: 

<?php
while ($rij = sqlite_fetch_array($result))
{  echo ( $rij['aantal'] . "<br>\n" );
}
sqlite_close($db);
?>

</body></html>

In feite verwijst de link niet direct naar het bestand, maar naar:

4. testzip_doorverwijs.php: hierop staat php code die te teller in de database ophoogt en een html meta-tag om door te verwijzen naar testzip.zip. Inderdaad is het mooier om GET argumenten te gebruiken maar ik heb het nu eenvoudig gehouden. Dit is de code:

Code:
<?php
$db = sqlite_open("down.sdb");
$result = sqlite_query($db, "select * from downloadstabel where id=1;");
while ($rij = sqlite_fetch_array($result)) $tel = $rij['aantal'];
$tel++;
sqlite_query($db, "update downloadstabel set aantal = " . $tel . " where id=1;");
?>

<html><head>
<meta http-equiv="refresh" content="1; url=testzip.zip">
<title>Doorverwijs</title>
</head><body>
</body></html>

Dit werkt op zich goed, behalve dat de geopende doorverwijspagina open blijft staan. Ik zou die graag automatisch willen sluiten nadat is doorverwezen naar het bestand. Ik heb de javascript functie close() al uitgeprobeerd, maar het gevolg daarvan is dat het hele doorverwijzen niet doorgaat... iemand een idee hoe dit anders kan? Wout, misschien kan ik iets doen met die code die je zojuist gaf (helaas begrijp ik die niet zo goed...)?

Dat er eventueel direct naar het bestand wordt gelinkt vind ik niet erg, in principe houd ik alleen bij hoe vaak er op de download-link wordt geklikt.
 
Inmiddels heb ik een oplossing gevonden die bijna goed werkt, namelijk doorsturen op de doorverwijspagina naar het zip-bestand m.b.v. header(); de code wordt derhalve:

testzip_doorverwijs.php:
Code:
<?php
$db = sqlite_open("down.sdb");
$result = sqlite_query($db, "select * from downloadstabel where id=1;");
while ($rij = sqlite_fetch_array($result)) $tel = $rij['aantal'];
$tel++;
sqlite_query($db, "update downloadstabel set aantal = " . $tel . " where id=1;");

header("Location: testzip.zip");
?>

Dit werkt nu prima in Internet Explorer: het bestand wordt gedownload en het doorverwijsvenster meteen gesloten, alleen: in Firefox blijft het venster open staan... :confused: Iemand een idee hoe ik dit nog kan verbeteren?
 
Waarom zoveel code..

PHP:
<?php

$db = sqlite_open ( 'down.sdb' );
sqlite_query ( $db, 'UPDATE downloadstabel SET aantal = aantal + 1 WHERE id = 1' );

header ( 'Location: testzip.php' );

?>

Dat het venster open blijft staan is een Fx eigenschap, lijkt mij.

En eventjes dit stukje:

PHP:
$result = sqlite_query($db, "select * from downloadstabel where id=1;");
while ($rij = sqlite_fetch_array($result)) $tel = $rij['aantal'];
Waarom een while ().. Je hebt een primary key (zeg je), en je selecteerd op die primary key een rij (id = 1 in dit geval), dan is het zeker dat je maar 1 rij hebt, dus waarom de while..

Hier:

PHP:
while ($rij = sqlite_fetch_array($result))
{  echo ( $rij['aantal'] . "<br>\n" );
}

Precies hetzelfde ! :\
 
Hoi bash,

Dat eerste stuk code kan idd korter, bedankt hiervoor.
Wat die tweede betreft, ik kan het mis hebben, maar volgens mij is een rij iets anders dan een tabel met 1 rij. In eerste instantie had ik ook geprobeerd wat je voorstelt, maar dat werkte niet goed, dus heb ik het wat ingewikkelder gedaan met de while lus.

Anyway, iemand nog een idee hoe ik ook firefox kan forceren het vernster te sluiten (zonder javascript)? Bij voorbaat dank!
 
Laatst bewerkt:
Hey Aeweber,

Wanneer je headers zet om een download te forcen, dan kun je daarna natuurlijk geen andere header versturen. Het is eigenlijk vreemd dat IE dat wel ondersteund, want wat je eigenlijk doet is vertellen dat je pagina een "downloadable" is, maar ook een "doorverwijzing"... dat is iemand vertellen dat hij links en rechts af moet.

Browsers hebben natuurlijk wel een foefje ingebouwd dat je niet zo'n blank scherm krijgt. Het hele principe van de header "downloadable" (even een naam voor de duidelijkheid, bestaat niet :-p) is dat er helemaal geen pagina aan verbonden zit. Het is namelijk een download, en geen pagina. De witte pagina komt puur omdat de browser zichzelf niet kan "afsluiten" omdat je een type pagina zonder pagina hebt geopend. Hij toont daarom (wanhoopsdaad :p) een about:blank pagina.

Genoeg theorie van het waarom. Zorg dat de browser de URL niet hoeft te tonen, alleen maar uitvoeren: een download scherm laten zien.

<a href="delinkvandedownloadfile.php">De link</a>

Hij zal nu linken naar de PHP file die een "download" scherm naar voren brengt. Verder hoeft hij er niks mee te doen, dus dat doet hij ook niet. Je blijft dus op je originele pagina.

Ik hoop dat het een beetje te begrijpen is :-P.

wout
 
Genoeg theorie van het waarom. Zorg dat de browser de URL niet hoeft te tonen, alleen maar uitvoeren: een download scherm laten zien.

<a href="delinkvandedownloadfile.php">De link</a>

Hij zal nu linken naar de PHP file die een "download" scherm naar voren brengt. Verder hoeft hij er niks mee te doen, dus dat doet hij ook niet. Je blijft dus op je originele pagina.

Dus eingelijk precies wat ik had, maar dan zonder target=_blank in de link. Nu ik heb het geprobeerd en het werkt!! :D Zowel in IE als in Firefox komt er geen blanco scherm en de originele pagina blijft behouden, terwijl keurig het script wordt uitgevoerd en het bestand wordt gedownload. Hartelijk dank voor de tip, geweldig! :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan