[PHP] Download mirror; Externe PDF via readfile werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Neejoh
  • Registratie: Juni 2001
  • Laatst online: 24-04 18:27
Op m'n website heb ik een eigen gemaakt magazine die ik in PDF laat downloaden. Aangezien de PDF 10MB groot is en deze redelijk veel gedownload wordt wil ik hem via een mirrorscript willekeurig via andere servers laten downloaden.
Een header location gaat niet op want ik wil de bezoeker niet van mijn pagina weg sturen. Ik wil dus direct een download dialog laten openen.

Nu heb ik het probleem dat de download niet goed gaat, 500kb dummy PDF ipv het volledige 10MB PDf bestand.
Het mirror path (extern http://<mirror>/magazine.pdf) is correct als ik ze echo — #10 in downloadMag();

Het gaat om onderstaande code (wel wat uitgekleed om leesbaar te houden).
php.ini
code:
1
2
allow_url_fopen = On
allow_url_include = On


Om het bestand te downloaden:
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
/**
 * $mirrorId is een random getal tussen 1 en x-aantal mirrors
 * DOWNLOAD FILE
 */
function downloadMag($mirrorId){
  $mirrorId = mysql_escape_string($mirrorId);
  $getFile = mysql_query("SELECT * FROM mag_mirror WHERE mag_mirror.id = ".$mirrorId."");
  $getFileResult = mysql_fetch_array($getFile, MYSQL_ASSOC);

  $file = $getFileResult['url'];
  //echo $file;

  header('Content-type: application/pdf');
  header('Content-Description: File Transfer');
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Pragma: public');
  //header('Content-Disposition: attachment; filename="ModernWarfare247-01-June09-mirror'.$mirrorId.'.pdf"');
  //header("Content-Length: " . filesize($file));

  // what file to download:
  readfile($file);
}

[ Voor 21% gewijzigd door Creepy op 21-06-2009 10:33 . Reden: ontspammed ;) ]


Acties:
  • 0 Henk 'm!

  • trinite_t
  • Registratie: Maart 2003
  • Laatst online: 17-09 14:06
Ik wil niet lopen zeuren, maar door readfile te gebruiken downloaden mensen nog net zo hard het bestand via jouw server, en dus verbruiken ze data van jou limiet. En nu gebruik je het zelfs twee keer per download aangezien je het bestand zelf eerst moet downloaden en daarna weer upload.

Ik snap niet waarom je niet gewoon linkt naar een bestand op een andere server, maar dat je de link door die randomize functie laat bepalen.. die kun je dan weer heel makkelijk via php in je link zetten. En anders kom je toch bij bijvoorbeeld een header refer aan, maar dat is volgens mij ook geen probleem, aangezien je de mensen niet van je website af stuurt, je schotelt ze alleen een pdf voor die ze downloaden vanaf een andere website... Volgens mij krijgen ze niets van die andere site te zien dan...

[ Voor 47% gewijzigd door trinite_t op 20-06-2009 15:38 ]

The easiest way to solve a problem is just to solve it.


Acties:
  • 0 Henk 'm!

  • Neejoh
  • Registratie: Juni 2001
  • Laatst online: 24-04 18:27
Echt waar? Slimme actie dus...

Dus toch maar gewoon
PHP:
1
header('Location: '.$mirrorUrl)
gebruiken?

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Of je kijkt eventjes hoe sites zoals SourceForge dat doen. Die lui werken ook met mirrors. Je kunt allicht even in de source van de HTML koekeloeren. D'r zit vaak zo'n delay tussen en dan een linkje met "Als er na 5 seconden niets gebeurt, klik hier."

Wat je nu doet is iig zoals trinite_t al aangeeft erg onhandig.

Acties:
  • 0 Henk 'm!

  • trinite_t
  • Registratie: Maart 2003
  • Laatst online: 17-09 14:06
Neejoh schreef op zaterdag 20 juni 2009 @ 15:41:
Echt waar? Slimme actie dus...

Dus toch maar gewoon
PHP:
1
header('Location: '.$mirrorUrl)
gebruiken?
Dat is idd een van de makkelijkste oplossingen, een andere zou zijn, zoals ik al zei, de link naar de download in de html embedden, dus ipv een link met GET paramters op je website link je direct naar een mirror. Nadeel is dan dat je geen counter kunt bijhouden hoevaak hij gedownload wordt natuurlijk.

Maar zoals ik al zei, ik zie niet in waarom mensen "van je website" af gaan als ze op een download link klikken.

offtopic:
ow ja, nog een klein dingetje, volgens mij moet die pdf ook wel kleiner kunnen, misschien iets meer compressie op de afbeeldingen en dergelijke? Of meer vector afbeeldingen? Iig vindt ik 10 MB voor dit aantal pagina's nogal extreem, iig als het gedownload moet worden, drukkerij is natuurlijk wat anders

[ Voor 27% gewijzigd door trinite_t op 20-06-2009 15:50 ]

The easiest way to solve a problem is just to solve it.


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

trinite_t schreef op zaterdag 20 juni 2009 @ 15:45:
[...]

Maar zoals ik al zei, ik zie niet in waarom mensen "van je website" af gaan als ze op een download link klikken .
Het hangt er een beetje vanaf. Als je direct linkt naar het bestand op de andere server, dan gaan de meeste browsers niet van de huidige pagina (en dus jouw website) af. Als je gaat linken naar een pagina bij de mirror waar ze een downloadlink aan moeten klikken, is het een ander verhaal.

Acties:
  • 0 Henk 'm!

  • Neejoh
  • Registratie: Juni 2001
  • Laatst online: 24-04 18:27
Momenteel doe ik het zo:

PHP:
1
2
3
4
5
6
7
//vul $magId met $_GET['mag']
//check of hij binnen het uur gedownload is op dat IP
  //--true; mirror bepalen door randMirror();
  //--false; update naar database ($counter++) > mirror bepalen door randMirror();
//downloadMag();
  //--hier de header location, je ziet wel van welke website hij afkomt in het save-dialog
//generate een afbeelding met $counter

Hij gaat wel direct naar de PDF dus niet een landingspagina op de externe link.

[ Voor 11% gewijzigd door Neejoh op 20-06-2009 15:51 ]


Acties:
  • 0 Henk 'm!

  • H004
  • Registratie: Maart 2006
  • Laatst online: 28-05 19:55
Overigens, ongeacht het feit dat jouw oplossing in de TS dus niet echt doet wat je wil: wat er mogelijk fout gaat is dat je mod-rewrite-functie in de weg zit, en je dus niet alleen readfile meestuurt, maar ook de inhoud van index.php. (Althans, dat was toen bij mij het probleem. Een aparte .htaccess met "RewriteEngine off "erin in de downloadmap loste het probleem toen op.)

Je zou overigens ook via javascript de href van de link kunnen aanpassen...

JavaScript:
1
2
3
4
function changeDownloadLink(elm){
  var array = ['http://www.tweakers.net', 'http://www.google.com', 'http://www.yahoo.com'];
  elm.href = array[ Math.round( Math.random()*2 ) ];
}

HTML:
1
<a href="http://www.tweakers.net" onmousedown="changeDownloadLink(this);">link</a>

ofzo..

Acties:
  • 0 Henk 'm!

  • Neejoh
  • Registratie: Juni 2001
  • Laatst online: 24-04 18:27
Aha! Dat zal nog best wel eens het geval kunnen zijn...

Bestand inmiddels te ver aangepast (geen backups :Y)) dus kan het zo 1-2-3 niet meer testen... Bedankt voor de tip in ieder geval, had er niet aan gedacht.

Ik doe de random mirror overigens dmv. SQL zelf en niet via een PHP array: "ORDER BY RAND() LIMIT 1"
Maar dat even terzijde...

[ Voor 23% gewijzigd door Neejoh op 20-06-2009 16:17 ]

Pagina: 1