[PHP] na het genereren van een zip deze laten downloaden

Pagina: 1
Acties:

  • bwiep
  • Registratie: September 2000
  • Niet online

bwiep

Bla Bla Bla..

Topicstarter
Wat ik doe is in een scriptje dat geen output heeft een zipje laten genereren.

Deze wil ik graag aan het einde van het scriptje doorpasen naar de browser zodat hij hem kan downloaden.

Ik heb al geprobeerd met passthru en readfile e.d..

Als ik het script uitvoer en hij de zip gemaakt heeft. Krijg je een download schermpje, waar je dan op opslaan klikt ofzo.

Hier zit al een fout in dat de bestandsnaam de naam is van het php bestand. Terwijl met de header:

header("Content-Disposition: inline; filename=c:\\temppdf\\$gebruikersnaam\\projectstaten.zip");

al aangegeven is dat het een andere naam heeft.

Verder als je dan op opslaan klikt krijg je een melding dat hij het bestand niet kan downloaden van de server.

Iemand enig idee wat er verkeerd gaat??

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

c:\\blabla werkt niet bij die filename
En je moet natuurlijk niet de url geven, maar na die header de data van de file (dus gewoon byte voor byte) opsturen...

  • bwiep
  • Registratie: September 2000
  • Niet online

bwiep

Bla Bla Bla..

Topicstarter
Iets zoals:

header("Content-type: application/octet-stream");
readfile ("c:\\temppdf\\dus.zip");

Maar dit werkt ook niet :(

[ Voor 0% gewijzigd door bwiep op 14-08-2002 11:53 . Reden: typo ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier


Wat werkt er niet aan? :)

  • bwiep
  • Registratie: September 2000
  • Niet online

bwiep

Bla Bla Bla..

Topicstarter
Dit geeft het zelfde probleem. Dus bij opslaan enzo.. Zie eerste post.

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 09-08 19:19
Kijk anders een in de source van phpmyadmin. Daar bieden ze ook dezelfde functionaliteit, waar het wel goed werkt.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Weet je zeker dat je script verder goed werkt?
Want je code die je hier toont is in principe goed.
Laat bijvoorbeeld de header calls even weg.

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 31-03 16:47

CyberSnooP

^^^^ schrijft --->

Workaround: Plaats je zipje binnen de document-root en stuur een HTTP-Header terug met een location veld zodat de browser dat bestand gaat downloaden.

Apache handelt vervolgens de rest af (zonder PHP). Dat levert een klein performance voordeel oplevert en vinden de meeste browsers dat ook leuker omdat Content-Disposition niet altijd ondersteund wordt.
(om maar niet te spreken over script time-outs)

[ Voor 0% gewijzigd door CyberSnooP op 14-08-2002 12:40 . Reden: mooiere zinnetjes ]

|_____vakje______|


  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 17-08 09:30

giMoz

iets met meester...

De zip wordt op de server gegenereerd, je zult dus ook op een map in de server moeten opslaan. in ASP is dat te doen met Server.mappath e.d. kweet niet precies hoe de PHP code daarvan is.
Als de zip is gegenereerd zul je de browser van de client moeten doorsturen naar die map die bij de client bekend staat als een http://www....enz enz.
Tis even uitvogelen maar dat is volgens mij de enige manier!

Of niet natuurlijk...


  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 31-03 16:47

CyberSnooP

^^^^ schrijft --->

Je methode is goed, althans ik raad hem een post erboven zelf aan dus moet ie wel goed zijn ;)
giMoz schreef op 14 augustus 2002 @ 12:48:
Tis even uitvogelen maar dat is volgens mij de enige manier!
Maar dit is niet waar. Een browser interessert het geen *** wat er op de server gebeurt, en dat hebben veel php-ers/ASP-ers niet door, helaas.

De browser vraag om een bestand, de server stuurt een antwoord. Of dat antwoord nou wordt opgebouwd door Apache of je eigen code in een server-side-script is totaal irrelevant, en in de response als het goed is niet eens terug te zien.

De vraag is hier meer: Hoe vorm ik de juiste response :).. Omdat dat nu eenmaal wat lastig is, raad ik de methode aan die gebruikt maakt van een redirect (zoals jij ook zegt).

|_____vakje______|


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

bwiep:
Iets zoals:

header("Content-type: application/octet-stream");
readfile ("c:\\temppdf\\dus.zip");

Maar dit werkt ook niet :(
readfile is niet binary safe. Gebruik liever fpassthru
Verder kun je als content-disposition beter attachment gebruiken

code:
1
2
3
4
5
6
Header ( "Content-disposition: attachment; filename=SuggestieBestandsnaam.zip" );
Header ( "Content-type: application/x-zip-compressed" );

$fd = fopen ( 'c:\temppdf\dus.zip', 'rb' );
fpassthru ( $fd );
fclose ( $fd );


Vervolgens naar dit php-tje linken met een <a href> tag en je krijg een mooi save-as dialogje

hth :)

[ Voor 0% gewijzigd door drm op 14-08-2002 15:23 . Reden: tnx LuCarD :* ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • bwiep
  • Registratie: September 2000
  • Niet online

bwiep

Bla Bla Bla..

Topicstarter
drm schreef op 14 augustus 2002 @ 13:09:
[...]


readfile is niet binary safe. Gebruik liever fpassthru
Verder kun je als content-disposition beter attachment gebruiken

code:
1
2
3
4
5
6
Header ( "Content-disposition: attachment; filename=SuggestieBestandsnaam.zip" );
Header ( "Content-type: application/x-zip-compressed" );

$fd = fopen ( 'c:\temppdf\dus.zip' );
fpassthru ( $fd );
fclose ( $fd );


Vervolgens naar dit php-tje linken met een <a href> tag en je krijg een mooi save-as dialogje

hth :)
Als ik dit doe, dan als ik de headers weglaat, zie je mooi het filetje voorbijkomen. Maar als de headers erbij zitten nogsteeds hetzelfde probleem.

  • bwiep
  • Registratie: September 2000
  • Niet online

bwiep

Bla Bla Bla..

Topicstarter
CyberSnooP schreef op 14 augustus 2002 @ 12:38:
Workaround: Plaats je zipje binnen de document-root en stuur een HTTP-Header terug met een location veld zodat de browser dat bestand gaat downloaden.

Apache handelt vervolgens de rest af (zonder PHP). Dat levert een klein performance voordeel oplevert en vinden de meeste browsers dat ook leuker omdat Content-Disposition niet altijd ondersteund wordt.
(om maar niet te spreken over script time-outs)
Dit zou ik liever niet gebruiken, omdat de map normaal niet te bereiken is vanaf buiten. Het is een tijdelijke map, waarin de user wat kan genereren en dan opgestuurd krijgt. Het mag niet voor andere mensen beschikbaar zijn.

  • bwiep
  • Registratie: September 2000
  • Niet online

bwiep

Bla Bla Bla..

Topicstarter
Ik heb het nu werkend door een ander php file de file te laten verzenden. Dan werkt het wel. Maar als ik het in 1 file doe werkt het niet.

Terwijl de uitvoer als ik die zonder headers stuur er goed uitziet??

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Is het nou de bedoeling dat je zowel html als een zipfile te zien krijgt?

Zo ja, dan kun je in het php-tje wat de html genereert een header
code:
1
Header ( "Refresh: 4; url=./file.php" );

zetten, en dan in file.php de oplossing die ik hierboven zette. De browser zal de pagina laten staan, maar een attachment downloaden (Content-disposition is ook attachment ;))

that should do the trick...

In het andere geval, werkt m'n oplossing ook, want dan link je gewoon direct naar dat bestandje, en gaat-ie ook downloaden....

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • bwiep
  • Registratie: September 2000
  • Niet online

bwiep

Bla Bla Bla..

Topicstarter
Wat het php filetje nu doet is een serie pdfjes genereren deze inpakken als zip en die zip opsturen... Verder geen output genereren.

Het genereren van pdf en inpakken naar zip gaat goed. Maar in dezelfde php file kan ik het niet ook nog eens streamen.

Maar als ik dat vanuit een andere file doe wel.. (niet zo mooi, maar het werkt)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Maar dat komt toch uiteindelijk op hetzelfde neer?

code:
1
2
3
4
5
Header ( "Content-disposition: attachment; filename=SuggestieBestandsnaam.zip" );
Header ( "Content-type: application/x-zip-compressed" );

$zipdata = genereerZip ( $pdf_files );
print ( $zipdata );

:? Wat gaat er nou mis dan :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • bwiep
  • Registratie: September 2000
  • Niet online

bwiep

Bla Bla Bla..

Topicstarter
Das een hele goede vraag...

BTW wat ook raarrrr is is dat op de work around manier je de file wel kan opslaan. Maar niet kan openen als iexplore dat aan je vraagt. Omdat hij dan leeg is ???

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

bwiep:
Das een hele goede vraag...
Kun je niet even je volledige code posten, inclusief een beschrijving van evt. foutmeldingen en welk resultaat je nu hebt in welke context, en welk resultaat je wilt hebben.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

drm schreef op 14 augustus 2002 @ 13:09:
[...]


readfile is niet binary safe. Gebruik liever fpassthru
Verder kun je als content-disposition beter attachment gebruiken

code:
1
2
3
4
5
6
Header ( "Content-disposition: attachment; filename=SuggestieBestandsnaam.zip" );
Header ( "Content-type: application/x-zip-compressed" );

$fd = fopen ( 'c:\temppdf\dus.zip' );
fpassthru ( $fd );
fclose ( $fd );


Vervolgens naar dit php-tje linken met een <a href> tag en je krijg een mooi save-as dialogje

hth :)
Goeie tip!

Zeg er dan gelijk ook bij dat fopen op window systemen niet binary safe zijn... :)
Je moet dan een extra optie mee geven, dus in dit:

$fd = fopen ( 'c:\temppdf\dus.zip', 'rb');

Programmer - an organism that turns coffee into software.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

:D typisch geval van een typo op precies de verkeerde plek

*edited*

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • bwiep
  • Registratie: September 2000
  • Niet online

bwiep

Bla Bla Bla..

Topicstarter
Ach ja, met de work around werkt het nu.. Ze zijn er tevreden mee :D...
Pagina: 1