[php] zip bestand downloaden met headers.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Om een gebruiker een bestand te laten downloaden gebruik ik deze code:

header("Content-disposition: attachment; filename=\"$filename\"");
header("Content-type: $mimetype");
header("Content-Length: $filesize");
rpassthru("$directory$id");

Hierin zijn alle variabelen correct gedefinieerd.

Het zooite werkt ook. De bestand krijgen de naam $filename het mimetype $mimetype en ook nog informatie over de filesize $filsize. Bij plaatjes muziekjes bestanden gaat dit allemaal prima. Ook met zip bestanden met daarin deze bestandenl. Maar als er een ander archief in die zip zit gaat het mis. Los het bestand van de server plukken is geen optie maar werkt wel. Maar door deze code te gebruiken krijg ik een error. Ik gebruik trouwens Ubuntu met de standaard archive tool. Deze geeft deze meldig met een archief in archief:
[/tmp/qwerty-3.zip]
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
zipinfo: cannot find zipfile directory in one of /tmp/qwerty-3.zip or
/tmp/qwerty-3.zip.zip, and cannot find /tmp/qwerty-3.zip.ZIP, period.
In Nautilus (verkenner) krijg ik een andere melding als ik het wil openen...
De bestandsnaam "qwerty.zip" geeft aan dat dit bestand van type "ZIP-archief" is. De inhoud van het bestand geeft echter aan dat het van type "platte tekst document" is. Als u dit bestand opent, kan het een veiligheidsrisico vormen voor uw systeem.

Open het bestand niet tenzij u het zelf aangemaakt hebt, of ontvangen van een vertrouwde bron. Om het bestand te openen, hernoemt u het met het correcte achtervoegsel voor "platte tekst document". Open het bestand daarna op de normale manier. U kunt ook het 'Openen met'-menu gebruiken om een specifieke toepassing voor het bestand te kiezen.
Het gekke is dat als er bijvoorbeeld een plaatje in zit het wel goed gaat. Dus ik neem aan dat de combo headers/zip niet echt wil... Iemand suggesties?

Acties:
  • 0 Henk 'm!

Verwijderd

Welk mime-type gebruik je? Al verschillende browsers gebruikt om te downloaden?

Als het echt niet wilt lukken kun je eens kijken of je met php exact dezelfde headers kan nemen als in je browser (in Firefox kun je de headers met livehttpheaders bijv achterhalen). Kan best zijn dat het aan de cache-control ligt bijvoorbeeld, kwestie van ff wat dingetjes uitproberen het zijn wel minimale headers die je op dit moment aan het gebruiken bent.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Wat doet rpassthru?

Heb je het bestand al in een texteditor geopend om te kijken of er echt niet eerst nog wat ascii-tekens (bv. een foutmelding) verstuurd werd?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het in 2 varianten. 1 variant gebruikt een directe download maar dat is in dit geval niet mogelijk dus variant 2 gebruikt headers. (rpassthru stuurt een bestand door naar de browser om te downloaden)

Hier download ik een zip bestand met daarin een archief (livehttpheaders), eerst via variant 1
http://83.117.15.32/upstr...sta_XCPUMeter_tar_gz.zip&


GET /upstream/index.php/?fileid=64750-LiNsta_XCPUMeter_tar_gz.zip& HTTP/1.1

Host: 83.117.15.32

User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11

Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive


HTTP/1.x 200 OK

Date: Thu, 07 Feb 2008 12:27:45 GMT

Server: Apache/2.2.4 (Unix)

X-Powered-By: PHP/5.2.1

Content-Length: 3196

Keep-Alive: timeout=5, max=100

Connection: Keep-Alive

Content-Type: text/html

----------------------------------------------------------

http://83.117.15.32/upstr...Nsta_XCPUMeter_tar_gz.zip


GET /upstream/upload/64750-LiNsta_XCPUMeter_tar_gz.zip HTTP/1.1

Host: 83.117.15.32

User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11

Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

Referer: http://83.117.15.32/upstr...sta_XCPUMeter_tar_gz.zip&

If-Modified-Since: Thu, 07 Feb 2008 12:25:52 GMT

If-None-Match: "41286-15541-9313d400"


HTTP/1.x 304 Not Modified

Date: Thu, 07 Feb 2008 12:27:45 GMT

Server: Apache/2.2.4 (Unix)

Connection: Keep-Alive

Keep-Alive: timeout=5, max=100

Etag: "41286-15541-9313d400"

----------------------------------------------------------
En nu variant 2 (die een error geeft)
http://83.117.15.32/devschuur/upstream2/index.php/file/16


GET /devschuur/upstream2/index.php/file/16 HTTP/1.1

Host: 83.117.15.32

User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11

Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

Authorization: Basic R01PVFVTMjpxd2VydHU=


HTTP/1.x 200 OK

Date: Thu, 07 Feb 2008 12:29:33 GMT

Server: Apache/2.2.4 (Unix)

X-Powered-By: PHP/5.2.1

content-disposition: attachment; filename="zipname.zip"

Content-Length: 150

Keep-Alive: timeout=5, max=100

Connection: Keep-Alive

Content-Type: application/zip

----------------------------------------------------------
opera werkt ook niet mee...

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
rpassthru is geen standaard PHP functie, vandaar. Het lijkt wat op fpassthru, maar die werkt met heel andere parameters. Wat je nu doet, lijkt meer op readfile. En daarmee kom ik terug op mijn eerste post: open de zipfile in een texteditor en je ziet de foutmelding:
<br />
<b>Fatal error</b>: Call to undefined function rpassthru() in <b>/opt/lampp/htdocs/devschuur/upstream2/index.php</b> on line <b>139</b><br />
Let je erop dat er in je vorige post een username/wachtwoord staat? En je kunt beter al die newlines wat weghalen, dat maakt het overzichtelijker. Bij copy/pasten zijn die erin gekomen, maar die horen er niet.

[ Voor 26% gewijzigd door GlowMouse op 07-02-2008 13:34 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
UPDATE: Alle archieven weigeren nu dienst maar werken wel als ik ze los van de server pluk...

[ Voor 3% gewijzigd door Verwijderd op 07-02-2008 14:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GlowMouse schreef op donderdag 07 februari 2008 @ 13:33:
rpassthru is geen standaard PHP functie, vandaar. Het lijkt wat op fpassthru, maar die werkt met heel andere parameters. Wat je nu doet, lijkt meer op readfile. En daarmee kom ik terug op mijn eerste post: open de zipfile in een texteditor en je ziet de foutmelding:

[...]


Let je erop dat er in je vorige post een username/wachtwoord staat? En je kunt beter al die newlines wat weghalen, dat maakt het overzichtelijker. Bij copy/pasten zijn die erin gekomen, maar die horen er niet.
quote: zipbestand
<br />
<b>Fatal error</b>: Call to undefined function rpassthru() in <b>/opt/lampp/htdocs/devschuur/upstream2/index.php</b> on line <b>139</b><br />
Heb jij een magische bol?

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 07 februari 2008 @ 13:39:
[...]


[...]

Heb jij een magische bol?
Je post precies om welke url en bestand het gaat, dan heb je geen magische bol meer nodig om het na te bootsen he ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het probleem zit weer alleen in archieven, ik heb ondertussen iets lopen klooien...

if($mimetype=='image/png' or $mimetype=='image/jpeg' or $mimetype=='image/gif')
{
header("Content-disposition: inline; filename=\"$filename\"");
header("Content-Type: $mimetype");
header("Content-Length: $filesize");
$file = fopen("$upload_directory$id", 'r');
fpassthru($file);
}

else
{
header("Content-disposition: attachment; filename=\"$filename\"");
header("Content-type: $mimetype");
header("Content-Length: $filesize");
$file = fopen("$upload_directory$id", 'r');
fpassthru($file);
}
}

Gaat nu alleen mis bij archieven met daarin een archief. De rest gaat wel goed... Het bovenste stuk kan genegeerd worden... (download plaatjes niet)

Acties:
  • 0 Henk 'm!

Verwijderd

Staat zlib.output_compression in je php.ini misschien aan? Probeer het eens door deze uit te zetten. Als je het in je source met php_ini doet dan _voor_ de headers.

edit
geldt natuurlijk alleen als je zlib gebruikt, maar weet niet waar die zip vandaan komt?

[ Voor 22% gewijzigd door Verwijderd op 07-02-2008 14:10 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Die zip word dynamisch gemaakt door het script... zlib staat uit...

http://66.102.9.104/searc...ssthru&hl=nl&ct=clnk&cd=8
Ik kwam dat ook tegen ^

[ Voor 71% gewijzigd door Verwijderd op 07-02-2008 14:22 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Gaat het om een groot bestand? Anders kun je mss beter loopen en hem als chunks fpassthru-en.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Als je nu van hetzelfde bestand het origineel en de niet werkende versie in een texteditor opent, zie je gelijk waar het misgaat.

Je post van 13.25 is nog steeds erg rommelig, maar gelukkig hebben we een edit-knop. Die kun je ook gebruiken wanneer je wat vergeten bent, want als je daarvoor een nieuwe post plaatst terwijl de laatste post al van jou was, kick je het topic onnodig omhoog.
Voor het posten van php-code kun je trouwens [php]-tags gebruiken, dan wordt het een stuk leesbaarder. Je hebt nu een if { } else { } met tussen beide accolades vrijwel dezelfde code. Vuistregel is dat wanneer een stukje code ergens tweemaal bijna hetzelfde is, het vaak eenvoudiger kan:
PHP:
1
2
3
4
5
6
7
8
9
if($mimetype=='image/png' or $mimetype=='image/jpeg' or $mimetype=='image/gif') {
  header("Content-disposition: inline; filename=\"$filename\"");
} else {
  header("Content-disposition: attachment; filename=\"$filename\"");
}
header("Content-type: $mimetype");
header("Content-Length: $filesize");
$file = fopen("$upload_directory$id", 'r');
fpassthru($file);
Verwijderd schreef op donderdag 07 februari 2008 @ 14:24:
Gaat het om een groot bestand? Anders kun je mss beter loopen en hem als chunks fpassthru-en.
fpassthru is al heel liev voor je geheugen :)

En let je ook op de beveiliging? Je hebt nu geen bescherming van magic_quotes_gpc, dus je moet alles zelf doen.

[ Voor 49% gewijzigd door GlowMouse op 07-02-2008 14:31 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heel leuk die nieuwe code maar hij werkt nog steeds niet...

En user input is toch nu vrijwel niet gevaarlijk tot zo ver ik weet? Wat moet ik aan de beveiliging doen. Maar eerst ff dat domme archieven probleem oplossen

[ Voor 57% gewijzigd door Verwijderd op 07-02-2008 14:35 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op donderdag 07 februari 2008 @ 14:34:
Heel leuk die nieuwe code maar hij werkt nog steeds niet...
Anders lees je mijn hele post :/ het was nooit als bugfix bedoeld, maar slechts als advies om overzichtelijker code te schrijven. Je ziet ook direct dat de code hetzelfde doet als wat je eerst had, dus waarom jij je afvraagt dat het nog steeds niet werkt :?
En user input is toch nu vrijwel niet gevaarlijk tot zo ver ik weet?
Vrijwel altijd, behalve als je 'geluk' hebt dat magic_quotes_gpc aanstaat. Google bijvoorbeeld eens op sql injection.

[ Voor 35% gewijzigd door GlowMouse op 07-02-2008 14:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
anyways dat is een zorg voor later...

<br />
<b>Fatal error</b>: Call to undefined function rpassthru() in <b>/opt/lampp/htdocs/devschuur/upstream2/index.php</b> on line <b>139</b><br />

Dit krijg ik nu uit een zip bestand...

Het gekke is dat rpassthru() niet in het script staat maar is vervangen door fpassthru(), de cache is gereset en lijn 139 zit er zo uit:

PHP:
1
fpassthru($file);


suggesties?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
NVM ik denk dat ik het gefixed heb...

[ Voor 81% gewijzigd door Verwijderd op 08-02-2008 13:23 ]

Pagina: 1