[PHP]Bestand heeft onjuiste grootte bij download

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
Ik heb een pagina, waar de gebruiker doorgestuurd word naar een bestand. Vervolgens moet hij dus dit bestand gaan downloaden.

Hier een stukje code :
PHP:
4
5
6
$link = $file_link.$filename;

header("Location: $link");


Dit is maar een klein gedeelte, maar dit stuk stuurt de gebruiker dus door. Nu is de grootte i.p.v. ongeveer 4gb maar 228mb ?! Ik heb de config's van PHP en Apache al nagekeken maar daar kon ik niets vinden over een maximale grootte van de bestanden ? Ook hier op het forum kon ik niets vinden.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Je gebruikt een header waarmee je de browser doroverwijst naar een andere pagina. Vanaf dat moment heeft de download niets meer met die php-script te maken.

Of doet het probleem zich niet voor als je het bestand direct download, en niet via dit script?

Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Is het mogelijk dat je webserver applicatie of de client die het bestand download niet tegen bestanden kan die groter dan 4GB zijn?

Acties:
  • 0 Henk 'm!

  • CLB
  • Registratie: Oktober 2004
  • Niet online

CLB

Is 't niet zo dat pff NTFS (iets met je harde schijf te maken) ofzo (ik begrijp er niet veel van)
geen bestanden op kan slaan groter dan 4 gb en ze dan misschien verkeerd weergeeft?

Asus ZenBook BX410UA-GV182R: 14,0" 1920x1080 mat IPS/ Intel HD 620 / Intel Core i5-7200U 3,1GHz/ 8192MB 2133MHz RAM
512GB SSD + 2TB HDD/ Backlight keyboard, BlueTooth, Wi-Fi AC, HDMI, USB 2.0, USB 3.0, USB C, Cardreader / Windows 10 Pro 64 bit


Acties:
  • 0 Henk 'm!

  • Martine
  • Registratie: Mei 2002
  • Niet online
Misschien heb je hier iets aan, dan geeft hij de bestandsgroote wel aan.

PHP:
1
2
3
4
5
header("Content-type: application/x-zip-compressed");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Length: ".filesize($link));

readfile($link);

[ Voor 32% gewijzigd door Martine op 22-11-2005 16:31 ]


Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
Martine schreef op dinsdag 22 november 2005 @ 16:26:
Misschien heb je hier iets aan, dan geeft hij de bestandsgroote wel aan.

PHP:
1
2
3
4
5
header("Content-type: application/x-zip-compressed");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Length: ".filesize($link));

readfile($link);
Nu krijg ik een bestand van 1,9 mb ?!
frickY schreef op dinsdag 22 november 2005 @ 15:28:
Je gebruikt een header waarmee je de browser doroverwijst naar een andere pagina. Vanaf dat moment heeft de download niets meer met die php-script te maken.

Of doet het probleem zich niet voor als je het bestand direct download, en niet via dit script?
Wanneer ik gewoon in html <a href="blabla">blabla</a> gebruik, werkt het nog steeds niet :?
Gaat het nu toch liggen aan de webserver?

Dat is trouwens Apache 2.0.55. Ik heb al in de conf gekeken, maar ik kan daar echt niets vinden m.b.t. maximale download grootte.

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 15:31

orf

Waarom gaat een bestand van 4gb via HTTP, daar is het protocol totaal niet voor bedoeld. Gebruik dan FTP.

Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
orf schreef op dinsdag 22 november 2005 @ 18:05:
Waarom gaat een bestand van 4gb via HTTP, daar is het protocol totaal niet voor bedoeld. Gebruik dan FTP.
FTP heb ik ook al geprobeerd, maar dat gaat om de een of andere reden heel langzaam bij ons op school op het netwerk. Maar het moet toch wel gewoon mogelijk zijn via HTTP ?!

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je PHP script heeft er dus 0.0 mee te maken omdat je de browser een nieuwe http request laat doen met die Location header. Er gebeurd dus hetzelfde als wanneer de user zelf direct de URL van dat bestandje aanroept.
Razr schreef op dinsdag 22 november 2005 @ 18:01:
[...]


Nu krijg ik een bestand van 1,9 mb ?!
Lijkt me stug dat die content-length header echt 1.9 mb zegt, dus print die eens, of bekijk de output van filesize() gewoon eens. En probeer het eens met een andere browser. Verder gaat de gemiddelde browser ook door als er meer binnenkomt dan content-length deed vermoeden, dus de download moet gewoon werken, je progressbar/schatting van downloadtijd zal alleen niet kloppen.

[ Voor 23% gewijzigd door Voutloos op 22-11-2005 18:51 ]

{signature}


Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 18-09 12:47

killercow

eth0

A, waarom zou je in gods naam niet gewoon naar het bestand linken.
B, als ftp bij jullie op school langzaam is, wilt dat nog niet zeggen dat je het daarom via http moet doen, of downloaden jullie op school altijd ebstanden van 4GB van jouw server?
C, Never nooit niet 4GB aan data via je php gaat sturen via readfile, (of wil je je webserver omleggen met een aantal bizar lang openstaande php requests?
D, ik denk niet dat het aan je webserver ligt, maar probeer de packages eens te sniffen. dan kun je zo zien wat apache voor content-length aan je client geeft.

openkat.nl al gezien?


Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
hmm.. als ik de de filesize() laat zien, dan komt er uit : 233439232. Dat komt dus wel ongeveer neer op wat het download venster van bijvoorbeeld IE of FF aangeeft (228mb). Hoe komt hij echter bij deze grootte en geeft hij niet gewoon 4gb aan ?!

edit: ook als ik de file in dezelfde map zet als het script en ik doe
PHP:
4
echo(filesize("blabla.mdf"));


Zelfs dan krijg ik nog de verkeerde grootte ?!

[ Voor 27% gewijzigd door Razr op 22-11-2005 22:17 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Als je ff op php.net had gekeken dan had je het volgende gevonden:
Note: Because PHP's integer type is signed and many platforms use 32bit integers, filesize() may return unexpected results for files which are larger than 2GB. For files between 2GB and 4GB in size this can usually be overcome by using sprintf("%u", filesize($file)).

[ Voor 8% gewijzigd door Verwijderd op 22-11-2005 22:23 ]


Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
Verwijderd schreef op dinsdag 22 november 2005 @ 22:20:
Als je ff op php.net had gekeken dan had je het volgende gevonden:


[...]
Klinkt lekker maar na:
PHP:
4
echo(sprintf("%u", filesize($link)));

Nog steeds : 233439232. Onveranderd dus :?

Acties:
  • 0 Henk 'm!

  • Mithrandir
  • Registratie: Januari 2001
  • Laatst online: 09:19
tsja, 4 gigabyte kan net meer of net minder dan 4 gigabyte zijn... Je weet dus niet of het nog net wél binnen de range die op php.net staat of daar buiten valt.

Is het misschien niet verstandiger je FTP probleem op te lossen in plaats van dit te hacken? Deze oplossing gaat volgens mij niets beter of makkelijker dan via FTP, dus daar zou ik nog maar eens goed naar kijken als ik jou was.

Verbouwing


Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
Ja daar heb je zeker een punt mee.

Nu ben ik al bezig met FTP dan, maar heb nog één probleempje. De bestandsgrootte is hierbij helemaal onbekend. Moet ik die ook meesturen, met header() ? Lijkt mij niet overigens.

Ik gebruik de volgende code:
PHP:
4
5
6
$link = "ftp://user:pass@localhost/".$filename;

header("Location: $link");

Nu werkt dit wel maar de bestandsgrootte blijft onbekend.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Filesize wordt waarschijnlijk verkeerd weergegeven doordat het bestand te groot is en niet meer in een 32 bits integer past. Waarschijnlijk is het orgineel 4,528,406,527 bytes (2^32 -1 + 233,439,232)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
Janoz schreef op dinsdag 22 november 2005 @ 23:05:
Filesize wordt waarschijnlijk verkeerd weergegeven doordat het bestand te groot is en niet meer in een 32 bits integer past. Waarschijnlijk is het orgineel 4,528,406,527 bytes (2^32 -1 + 233,439,232)
Ah natuurlijk, heb ik nog gehad met A+ had ik moeten weten ;)

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
orf schreef op dinsdag 22 november 2005 @ 18:05:
Waarom gaat een bestand van 4gb via HTTP, daar is het protocol totaal niet voor bedoeld. Gebruik dan FTP.
Onzin, HTTP is ook gewoon een streaming protocol, en heeft behalve de headers geen extra overhead. Als z'n webserver i.p.v. 4GB maar ~100MB stuurt, lijkt het me dat er gewoon een config error o.i.d. optreedt.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 15:31

orf

Hydra schreef op woensdag 23 november 2005 @ 15:25:
[...]


Onzin, HTTP is ook gewoon een streaming protocol, en heeft behalve de headers geen extra overhead. Als z'n webserver i.p.v. 4GB maar ~100MB stuurt, lijkt het me dat er gewoon een config error o.i.d. optreedt.
En zonder de juiste headers gaat een browser fijn het bestand in de browser proberen te openen.
Standaard kun je bij een uitval van de verbinding over HTTP het hele bestand opnieuw downloaden, Via FTP zal standaard alleen het resterende deel gedownload worden.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Martine schreef op dinsdag 22 november 2005 @ 16:26:
Misschien heb je hier iets aan, dan geeft hij de bestandsgroote wel aan.

PHP:
1
2
3
4
5
header("Content-type: application/x-zip-compressed");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Length: ".filesize($link));

readfile($link);
Vergeet dan ook niet set_time_limit(0); niet om te voorkomen dat het script na 30 seconden afbreekt, en je download dus stopt.
Overigens vind ik het zonde om de parser met een bestand van 4 gieg te belasten, als het ook buiten de parser omkan.

Aangezien een directe download ook niet werkt ligt het, zoals ik al zei, niet aan je PHP script.
De verbinding zal wel timeouten na een bepaalde tijd.

  • Razr
  • Registratie: September 2005
  • Niet online
Janoz schreef op dinsdag 22 november 2005 @ 23:05:
Filesize wordt waarschijnlijk verkeerd weergegeven doordat het bestand te groot is en niet meer in een 32 bits integer past. Waarschijnlijk is het orgineel 4,528,406,527 bytes (2^32 -1 + 233,439,232)
Nu heb ik het volgende stukje code geschreven:

PHP:
4
5
6
7
8
9
10
11
12
    if (is_file($link)) {
        
        if(sprintf("%u", filesize($link)) >= $maximale_grootte) {
            $size = $maximale_grootte + sprintf("%u", filesize($link));
        } else { 
            $size = sprintf("%u", filesize($link)); 
        }
    
    }else{ die("Geen geldig bestand."); }


Maar als ik nu de $size laat echo'en. Dan krijg ik nog steeds de verkeerde groote. Het lijkt alsof hij de vergelijking niet goed maakt. PHP zelf weet toch wel dat het bestand uit meer bytes bestaat dan de max (2^32) ? Alleen hij kan het niet weergeven, daarom telt hij opnieuw.
Nu leek mij dat als de waarde filesize groter is dan de max (2^32). Dat hij dan de max, en wat hij opnieuw heeft geteld, bij elkaar opteld voor een juist resultaat. Weliswaar werkt dit maar tot 8gb ofzo maar dat is zat.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Tja, wanneer je aan de maximale waarde zit dan kun je daar niet opeens wel meer rekenen als het een string wordt. PHP ziet niet wanneer er een overflow plaatsgevonden heeft dus je kunt het ook niet op een redelijk simpele manier detecteren.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • defusion
  • Registratie: Juli 2003
  • Niet online
Kun je het bestand niet gewoon direct downloaden, zonder die php onzin :S

  • Razr
  • Registratie: September 2005
  • Niet online
defusion schreef op donderdag 24 november 2005 @ 09:53:
Kun je het bestand niet gewoon direct downloaden, zonder die php onzin :S
Nee :>
Janoz schreef op donderdag 24 november 2005 @ 09:46:
Tja, wanneer je aan de maximale waarde zit dan kun je daar niet opeens wel meer rekenen als het een string wordt. PHP ziet niet wanneer er een overflow plaatsgevonden heeft dus je kunt het ook niet op een redelijk simpele manier detecteren.
Hoe zou ik er dan achter kunnen komen dat de bestandsgrootte groter is dan 2^32 ? Ik zou dan bijvoorbeeld gewoon iets willen laten zien van 4gb of meer. Maar niet dat de gebruiker ziet dat een bestand 233 mb is terwijl het over de 4gb is.

[ Voor 15% gewijzigd door Razr op 24-11-2005 09:54 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Helaas, de overflow heeft al plaatsgevonden, dus filesize is gewoon altijd mod 232 berekend.
Offtopic: Met de info die hier gegeven is, lijkt de oplettende gebruiker het wel te kunnen. De 'Location:'-header zorgt voor een nieuwe request en iedereen kan die request wel doen. ;)

Ik weet niet waar je het linkje naar dit doorverwijsscriptje hebt staan, maar een pleistermethode is dus om handmatig bij die link aan te geven dat de file wél > 4GB is. :) Is sowieso wel aardig om dat te zeggen bij zulke linkjes. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • Arto
  • Registratie: November 2005
  • Laatst online: 20-09 21:40
probeer dit eens

PHP:
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
/* stat function test */

/*
 * $file  => file name
 * $stats => all stats of $file
 */

$file = "stat.php"; 
$fo = fopen($file, "r");

$stats = fstat($fo);

echo $stats['size'];
//print_r($stats);
?>


nog niet geprobeert met hoger dan 2gb maar daar wassik te lui voor (8>

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Zit je dan niet die complete film in te laden in je script? Dat lijkt me dan ook verre van ideaal...
Pagina: 1