Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Zip files in folder wanneer URL wordt aangeroepen

Pagina: 1
Acties:

  • CedricD
  • Registratie: Augustus 2009
  • Laatst online: 10-11 16:07
Tweakers,

Naar aanleiding van mij vorig (gesloten) topic ben ik na een tijd Googlen op een script gestoten dat perfect zou moeten doen wat ik wil: https://gist.github.com/ninetwentyfour/1177068

Echter werkt het niet.

Ik heb de file opgeslagen als 'zipfolders.php' op de locatie http://domein.com/downloads/zipfolders.php
In diezelfde locatie zijn er folders aanwezig met bestanden in die zouden moeten worden ingepakt:
code:
1
2
3
4
5
6
7
8
9
10
http://domein.com/downloads/01052014
http://domein.com/downloads/01052014/test.mp3
http://domein.com/downloads/01052014/test2.mp3
http://domein.com/downloads/01052014/filmpje.mp4
http://domein.com/downloads/05052014
http://domein.com/downloads/05052014/test.mp3
http://domein.com/downloads/05052014/test2.mp3
http://domein.com/downloads/05052014/filmpje.mp4

/var/www/domein.com/downloads/.......


De folder http://domein.com/downloads is writable.

Als ik het script aanroep met de URL: http://domein.com/downloa....php?directtozip=01052014 dan krijg ik een zipfile van 0 bytes die uiteraard corrupt is.

Buiten het feit dat het script onveilig is (dat los ik later wel op), wat doe ik verkeerd?


Met dit script kan ik wel files inpakken zonder problemen... Dus ik veronderstel dat de rechten op de mappen correct zijn en dat mijn php intallatie ook correct is...

Cedric

  • Merethil
  • Registratie: December 2008
  • Laatst online: 09:03
Geef je in de header de content-type en content-length mee?
Op die manier kan je aangeven wat er gedownload moet worden en hoe groot het is.

Zie hier voor meer:
http://www.php.net/manual/en/function.header.php

Daarnaast: Hoe bied je de file aan? Is het een kwestie van een directe URL naar een item dat aangemaakt wordt? Of doe je het via een stream op de een of andere manier? Zo ja, dan moet er vaak nog een flush() of soortgelijk aangeroepen worden.

edit:
Check ook de eerste comment hier, gezien de problemen met file-grootte e.d.:
http://www.php.net/manual/en/function.fpassthru.php

[ Voor 53% gewijzigd door Merethil op 29-05-2014 20:19 ]


  • Xaero
  • Registratie: November 2007
  • Laatst online: 19-11 09:31
Waarom zou je een script gebruiken die een 'exec' uitvoert? Meeste (shared) webhosts ondersteunen zoiets al niet.

Het is (volgens mij) beter om gebruik te maken van de zip class van PHP zelf. Een ZIP object aanmaken, vullen met files, en deze naar de gebruiker sturen..

Voorbeeld, wanneer ik zoek op 'zip files php', krijg ik bijvoorbeeld het volgende:
http://davidwalsh.name/create-zip-php
http://stackoverflow.com/...339/creating-zip-file-php

  • CedricD
  • Registratie: Augustus 2009
  • Laatst online: 10-11 16:07
Merethil schreef op donderdag 29 mei 2014 @ 20:15:
[...]


Geef je in de header de content-type en content-length mee?
Op die manier kan je aangeven wat er gedownload moet worden en hoe groot het is.

Zie hier voor meer:
http://www.php.net/manual/en/function.header.php

Daarnaast: Hoe bied je de file aan? Is het een kwestie van een directe URL naar een item dat aangemaakt wordt? Of doe je het via een stream op de een of andere manier? Zo ja, dan moet er vaak nog een flush() of soortgelijk aangeroepen worden.
Het script is een exacte kopie van dit:
https://gist.github.com/ninetwentyfour/1177068

Hierin worden:
  • header("Content-Type: archive/zip");
  • header("Content-Disposition: attachment; filename=$filename_no_ext".".zip");
  • header("Content-Length: $filesize");
aangeroepen

Daarnaast is het de bedoeling dat, als een bezoeker de folder bezoekt waar er bestanden in staan, de zip file wordt aangemaakt door het script. Deze zipfile hoeft niet op de server aanwezig te blijven.

Xaero schreef op donderdag 29 mei 2014 @ 20:17:
Waarom zou je een script gebruiken die een 'exec' uitvoert? Meeste (shared) webhosts ondersteunen zoiets al niet.

Het is (volgens mij) beter om gebruik te maken van de zip class van PHP zelf. Een ZIP object aanmaken, vullen met files, en deze naar de gebruiker sturen..

Voorbeeld, wanneer ik zoek op 'zip files php', krijg ik bijvoorbeeld het volgende:
http://davidwalsh.name/create-zip-php
http://stackoverflow.com/...339/creating-zip-file-php
Webserver staat momenteel als testopstelling op een VPS.
Later komt hij op een dedicated machine te staan.

Het script moet dynamisch zijn omdat er minstens wekelijks bestanden worden geupload die daarna door verschillende gebruikers worden gedownload.
Het script dat ik hierboven heb doet perfect wat ik wil (als ik het werkende krijg tenminste)...

  • Merethil
  • Registratie: December 2008
  • Laatst online: 09:03
CedricD schreef op donderdag 29 mei 2014 @ 20:27:
[...]


Het script is een exacte kopie van dit:
https://gist.github.com/ninetwentyfour/1177068

Hierin worden:
  • header("Content-Type: archive/zip");
  • header("Content-Disposition: attachment; filename=$filename_no_ext".".zip");
  • header("Content-Length: $filesize");
aangeroepen

Daarnaast is het de bedoeling dat, als een bezoeker de folder bezoekt waar er bestanden in staan, de zip file wordt aangemaakt door het script. Deze zipfile hoeft niet op de server aanwezig te blijven.
Kijk dan even naar de edit die ik heb gedaan. Daar staat waarschijnlijk een oplossing:

PHP:
1
2
ob_end_clean();//required here or large files will not work
@fpassthru($handle);//works fine now

  • CedricD
  • Registratie: Augustus 2009
  • Laatst online: 10-11 16:07
Merethil schreef op donderdag 29 mei 2014 @ 20:37:
[...]


Kijk dan even naar de edit die ik heb gedaan. Daar staat waarschijnlijk een oplossing:

PHP:
1
2
ob_end_clean();//required here or large files will not work
@fpassthru($handle);//works fine now
Helaas, de file blijft 0 bytes.

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Wat is de output van de exec (even een echo of vardump)? Eventueel stderr redirecten naar stdout als dat niks oplevert.

[ Voor 12% gewijzigd door Feanathiel op 29-05-2014 20:59 ]


  • Dreeass
  • Registratie: Februari 2014
  • Laatst online: 27-12-2023
CedricD schreef op donderdag 29 mei 2014 @ 20:56:
[...]


Helaas, de file blijft 0 bytes.
Vermijd het gebruik van het @ symbool in PHP. Waarom ZIP je de bestanden niet bij het uploaden trouwens?

  • CedricD
  • Registratie: Augustus 2009
  • Laatst online: 10-11 16:07
Heb na veel gefoefel zelf een script geschreven dat gebaseerd is op 26 andere scripts, maar het werkt!
  • /var/www/site.com/files/createzip.php
  • /var/www/site.com/files/28.05.14
  • /var/www/site.com/files/28.05.14/bestand1.png
  • /var/www/site.com/files/28.05.14/bestand2.png
  • /var/www/site.com/files/28.05.14/bestand3.png
  • /var/www/site.com/files/28.05.14/bestand5.png
Als ik het script aanroep door te surfen naar http://site.com/files/createzip.php?date=28.05.14, dan wordt er een zipfile gemaakt in de map /var/www/site.com/files/28.05.14 met bestandsnaam 28.05.14.zip.
De zipfile ziet er vanbinnen zo uit:
  • 28.05.14
  • 28.05.14/bestand1.png
  • 28.05.14/bestand2.png
  • 28.05.14/bestand3.png
  • 28.05.14/bestand4.png
Als het bestand 28.05.14.zip al bestaat op de server dan wordt het script om de zipfile te genereren niet meer aangeroepen en krijgt de bezoeker direct het bestand aangeboden om te downloaden.

Daarnaast worden zipfiles ouder dan 14 dagen automatisch verwijderd als 'createzip.php' aangeroepen wordt.

En als de bezoeker een datum aanroept dat niet bestaat dan wordt er een pagina getoond dat ze iets verkeerd doen...

Thnx voor jullie hulp.

[ Voor 5% gewijzigd door CedricD op 30-05-2014 13:47 ]

Pagina: 1