Goedenavond 
Ik ben momenteel bezig met een download script, je kent ze wel: Zorgen dat men niet kan hotlinken, aantal downloads bijhouden etc etc. Gaat prima, maar ik loop tegen een probleempje op:
Op dit moment gebruik ik de volgende code om het bestand naar de bezoeker te sturen:
En ja...dit werkt perfect. Maar het heeft ook een groot nadeel: Hij laad het complete bestand in het geheugen. En bij meerdere simultane downloads (Van grote files, bijv. 100MB) gaat dat dus niet goed. Het hele RAM geheugen loopt vol.
Toen bedacht ik hetvolgende:
Mijn idee was dus om een andere filenaam mee te geven dan de naam op schijf. Zodat als iemand de url direct zou benaderen (met de bestandsnaam dat gegeven wordt) , het bestand niet bestaat.
Helaas werkt dit niet: Hij pakt de originele bestandsnaam. Die header ("Location is dus echt een soort van redirect, en dit truucje werkt niet.
Dus...dan zal er (denk ik) een soort van stream gemaakt moeten worden. Kleine stukjes inlezen, en outputten. Hiervoor probeerde ik de volgende code:
Maar dit geeft een "break", oftewel: hij laadt sowieso al geen data in. Maar het path is goed...dus ik snap het probleem niet.
Iemand die me kan vertellen of bovenstaande manier te gebruiken is? En/of wat ik fout doe, waarom hij denkt dat de file geen data bevat?
Ik denk dat het ook handig is om het aantal bytes dat hij opent te verhogen, naar bijvoorbeeld een aantal MB. Want op deze manier zal hij mischien wel vreselijk veel processor kracht kosten.
Of zit ik helemaal verkeerd te denken, en kan dit simpeler?
Bedankt
Ik ben momenteel bezig met een download script, je kent ze wel: Zorgen dat men niet kan hotlinken, aantal downloads bijhouden etc etc. Gaat prima, maar ik loop tegen een probleempje op:
Op dit moment gebruik ik de volgende code om het bestand naar de bezoeker te sturen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| // open the file in a binary mode $totaal_path = "$file_path/$bestand_name"; $fp = fopen($totaal_path, 'r'); // send the right headers header("content-type: application/octet-stream"); header("Content-Length: ".filesize($totaal_path)); header("Content-Disposition: attachment; filename=$bestand_name"); // dump the picture and stop the script fpassthru($fp); exit; |
En ja...dit werkt perfect. Maar het heeft ook een groot nadeel: Hij laad het complete bestand in het geheugen. En bij meerdere simultane downloads (Van grote files, bijv. 100MB) gaat dat dus niet goed. Het hele RAM geheugen loopt vol.
Toen bedacht ik hetvolgende:
PHP:
1
2
3
4
5
| // send the right headers header("content-type: application/octet-stream"); header("Content-Length: ".filesize($totaal_path)); header("Content-Disposition: attachment; filename=test.test"); header("Location: www.***.com/$bestand_naam"); |
Mijn idee was dus om een andere filenaam mee te geven dan de naam op schijf. Zodat als iemand de url direct zou benaderen (met de bestandsnaam dat gegeven wordt) , het bestand niet bestaat.
Helaas werkt dit niet: Hij pakt de originele bestandsnaam. Die header ("Location is dus echt een soort van redirect, en dit truucje werkt niet.
Dus...dan zal er (denk ik) een soort van stream gemaakt moeten worden. Kleine stukjes inlezen, en outputten. Hiervoor probeerde ik de volgende code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| $handle = fopen("test.test", "r"); $contents = ""; do { $data = fread($handle, 8192); if (strlen($data) == 0) { echo "break"; break; } fpassthru($data); } while (true); fclose($handle); |
Maar dit geeft een "break", oftewel: hij laadt sowieso al geen data in. Maar het path is goed...dus ik snap het probleem niet.
Iemand die me kan vertellen of bovenstaande manier te gebruiken is? En/of wat ik fout doe, waarom hij denkt dat de file geen data bevat?
Ik denk dat het ook handig is om het aantal bytes dat hij opent te verhogen, naar bijvoorbeeld een aantal MB. Want op deze manier zal hij mischien wel vreselijk veel processor kracht kosten.
Of zit ik helemaal verkeerd te denken, en kan dit simpeler?
Bedankt