/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
header problem... måske
Fra : Kim Emax


Dato : 01-10-09 10:27

Hej

Jeg har et virkeligt underligt problem, jeg ikke kan gennemskue. Jeg
har lavet et site, hvor man downloader musik. En mp3 fil hentes og
renames i headeren, der pushes til brugeren. Det fungerer fint og har
gjort det i flere år. Nu vil jeg lave mulighed for at hente flere
filer i en zip fil, men så låser browseren siden indtil downloaden er
færdig, den samme rutine sker ikke med download af et enkelt track,
jeg mistænker headerne eller selve zip klassen og har prøvet med div.
content types uden held.

Mp3:
$new_filename = "attachment; filename=\"{$artist} - {$title}.mp3\"";
header('Content-Description: File Transfer');
header("Content-Type: application/octet-stream");
header("Content-Length: $size");
header("Content-Disposition: $new_filename");
header("Content-Transfer-Encoding: binary");
readfile($source_file);

Zip:
if(mysql_num_rows($result)) {
$zip = new zipfile();
$zip->add_dir(".");
$new_filename= "{$artist} - {$title}.mp3";
$zip->add_file($file, $new_filename);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-
check=0");
header("Cache-Control: private",false);
header("Content-type: application/zip");
#header("Content-Type: application/octet-stream");
header("Content-disposition: attachment; filename=\"zipTest.zip
\"");
header('Content-Transfer-Encoding: binary');
ob_end_clean();
echo $zip->file();
}

Kode eksempel: http://www.emax.dk/test/test_zip.class.php

Nogen, der har en go ide til, hva pokker, der kan være galt?

--
Mvh
Kim Emax

 
 
Kim Emax (01-10-2009)
Kommentar
Fra : Kim Emax


Dato : 01-10-09 10:31

On Oct 1, 6:27 pm, Kim Emax <kime...@gmail.com> wrote:

> Jeg har et virkeligt underligt problem, jeg ikke kan gennemskue. Jeg
> har lavet et site, hvor man downloader musik. En mp3 fil hentes og
> renames i headeren, der pushes til brugeren. Det fungerer fint og har
> gjort det i flere år. Nu vil jeg lave mulighed for at hente flere
> filer i en zip fil, men så låser browseren siden indtil downloaden er
> færdig, den samme rutine sker ikke med download af et enkelt track,
> jeg mistænker headerne eller selve zip klassen og har prøvet med div.
> content types uden held.

Det skal lige siges at jeg har prøvet både at lave zipfilen i memory
og pushe den via header til brugeren og at pushe en fil fra serveren
via headeren til brugeren, begge dele låser sitet (vi snakker >50mb
filer, så det er for længe man venter), mens skriver jeg filen til
disken og laver et link i stedet, så downloader den fint og imens kan
jeg browse rundt på siden. Af forskelllige grunde kan denne løsning
bare ikke bruges.

--
Mvh
Kim Emax

Michael Rasmussen (01-10-2009)
Kommentar
Fra : Michael Rasmussen


Dato : 01-10-09 18:00

On Thu, 1 Oct 2009 09:27:04 -0700 (PDT)
Kim Emax <kimemax@gmail.com> wrote:

>
> Zip:
> if(mysql_num_rows($result)) {
> $zip = new zipfile();
> $zip->add_dir(".");
> $new_filename= "{$artist} - {$title}.mp3";
> $zip->add_file($file, $new_filename);
> header("Pragma: public");
> header("Expires: 0");
> header("Cache-Control: must-revalidate, post-check=0, pre-
> check=0");
> header("Cache-Control: private",false);
> header("Content-type: application/zip");
> #header("Content-Type: application/octet-stream");
> header("Content-disposition: attachment; filename=\"zipTest.zip
> \"");
> header('Content-Transfer-Encoding: binary');
> ob_end_clean();
> echo $zip->file();
> }
>
> Kode eksempel: http://www.emax.dk/test/test_zip.class.php
>
> Nogen, der har en go ide til, hva pokker, der kan være galt?

Et hurtigt bud. Dit zip-download specificerer ikke content-length,
hvorfor browseren ikke har nogen ide om, hvornår download er færdig.

Et andet aspekt er manglende angivelse af transfer encoding:
Transfer-Encoding: chunked <-- data kan leveres i bider. Default er,
at alt sendes som en klump.
http://en.wikipedia.org/wiki/Chunked_transfer_encoding

--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.


Kim Emax (01-10-2009)
Kommentar
Fra : Kim Emax


Dato : 01-10-09 11:45

On Oct 1, 7:00 pm, Michael Rasmussen <m...@miras.org> wrote:
> On Thu, 1 Oct 2009 09:27:04 -0700 (PDT)
>
>
>
> Kim Emax <kime...@gmail.com> wrote:
>
> > Zip:
> >   if(mysql_num_rows($result)) {
> >     $zip = new zipfile();
> >     $zip->add_dir(".");
> >     $new_filename= "{$artist} - {$title}.mp3";
> >     $zip->add_file($file, $new_filename);
> >     header("Pragma: public");
> >     header("Expires: 0");
> >     header("Cache-Control: must-revalidate, post-check=0, pre-
> > check=0");
> >     header("Cache-Control: private",false);
> >     header("Content-type: application/zip");
> >     #header("Content-Type: application/octet-stream");
> >     header("Content-disposition: attachment; filename=\"zipTest.zip
> > \"");
> >     header('Content-Transfer-Encoding: binary');
> >     ob_end_clean();
> >     echo $zip->file();
> >   }
>
> > Kode eksempel:http://www.emax.dk/test/test_zip.class.php
>
> > Nogen, der har en go ide til, hva pokker, der kan være galt?
>
> Et hurtigt bud. Dit zip-download specificerer ikke content-length,
> hvorfor browseren ikke har nogen ide om, hvornår download er færdig.

Tjae, det kunne være meget rigtigt. Da filen laves on the fly i
memory, er det ikke muligt at måle filesize og jeg har fundet ud af at
den _skal_ være nøjagtig, ellers kommer der en fejl, jeg ikke længere
husker, hvad er. Men da jeg nu har testet med at skrive filen til
disken først, så kan jeg få den korrekte filesize, det gør bare ikke
en forskel desværre

> Et andet aspekt er manglende angivelse af transfer encoding:
> Transfer-Encoding: chunked  <-- data kan leveres i bider. Default er,
> at alt sendes som en klump.http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Se, den kunne jeg prøve... Og har så nu, men det spiller desværre
ikke. jeg prøvede at lave et link, hvor jeg så hiver filen fra og
straks kan jeg downloade zippen og derefter browse videre.

--
Mvh
Kim Emax

Kim Emax (01-10-2009)
Kommentar
Fra : Kim Emax


Dato : 01-10-09 12:03

On Oct 1, 7:00 pm, Michael Rasmussen <m...@miras.org> wrote:

> Et hurtigt bud. Dit zip-download specificerer ikke content-length,
> hvorfor browseren ikke har nogen ide om, hvornår download er færdig.
>
> Et andet aspekt er manglende angivelse af transfer encoding:
> Transfer-Encoding: chunked  <-- data kan leveres i bider. Default er,
> at alt sendes som en klump.http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Jeg kom i tanke om FF pluginnet live http headers, hentede det ned og
har denne header på den zip, der hentes via link og som gør som jeg
gerne vil ha siden skal opføre sig:

HTTP/1.x 200 OK

Date: Thu, 01 Oct 2009 17:52:34 GMT

Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch
mod_ruby/1.2.6 Ruby/1.8.6(2007-09-24) mod_ssl/2.2.8 OpenSSL/0.9.8g

Last-Modified: Thu, 01 Oct 2009 17:52:26 GMT

Etag: "460885-24955bd-474e34f704a80"

Accept-Ranges: bytes

Content-Length: 38360509

Keep-Alive: timeout=15, max=71

Connection: Keep-Alive

Content-Type: application/zip


Og den header, hvor jeg flusher via PHP ser således ud:
HTTP/1.x 200 OK
Date: Thu, 01 Oct 2009 17:49:21 GMT
Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch
mod_ruby/1.2.6 Ruby/1.8.6(2007-09-24) mod_ssl/2.2.8 OpenSSL/0.9.8g
X-Powered-By: PHP/5.2.4-2ubuntu5.6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-
check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3158
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

Flere headers sender jeg ikke selv, bl.a. encoding: gzip, type: text/
html, vary og content lenght er bestemt ikke så kort.

Jeg tror det, der komplicerer tingene er at siden jeg klikker på
download zip fra er index.php, den validerer om man må få lov til at
hente og aktiverer en popup, der åbner en ny side, hvor zip headeren
pushes. Men samtidig så er der jo et response på/fra index.php, så
måske er der nogle headers, der overskrives i den rutine?

--
Mvh
Kim Emax

Kim Emax (01-10-2009)
Kommentar
Fra : Kim Emax


Dato : 01-10-09 12:13

On Oct 1, 8:03 pm, Kim Emax <kime...@gmail.com> wrote:

> Jeg tror det, der komplicerer tingene er at siden jeg klikker på
> download zip fra er index.php, den validerer om man må få lov til at
> hente og aktiverer en popup, der åbner en ny side, hvor zip headeren
> pushes. Men samtidig så er der jo et response på/fra index.php, så
> måske er der nogle headers, der overskrives i den rutine?

Og nu er jeg ret sikker på at det er der, der sker. Dette er headers
fra den testside jeg har linket til tidligere (den ligger på en anden
server skal det lige siges):

HTTP/1.x 200 OK

Date: Thu, 01 Oct 2009 18:10:03 GMT

Server: Apache/1.3.37 (Unix) PHP/5.2.3 mod_throttle/3.1.2
mod_psoft_traffic/0.2 mod_ssl/2.8.28 OpenSSL/0.9.8b FrontPage/
5.0.2.2635

X-Powered-By: PHP/5.2.3

Pragma: public

Expires: 0

Cache-Control: must-revalidate, post-check=0, pre-check=0, private

Content-Disposition: attachment; filename="zipTest.zip"

Content-Transfer-Encoding: binary

Connection: close

Transfer-Encoding: chunked

Content-Type: application/zip


Her er content-type som det skal være (og sjovt nok er transfer-
encoding chunked selvom det ikke er sat i på testsiden?)

Any hints til dette?

--
Mvh
Kim Emax

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409075
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste