[PHP] Download bestand (zip)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
Ik heb een download op mijn pagina en daarvoor gebruik ik de class httpdownload van http://www.phpclasses.org/browse/file/9051.html
Deze werkt perfect of anders gezegd werkte perfect ..... O-)

Helaas heb ik niet meer de bestanden van de situatie waarin het wel werkte, want dat is de reden ook dat ik nu zolang aan het stoeien ben en toch even om hulp moet vragen.

Wat de class doet kan je zien in de link.

Mijn PHP pagina ziet er als volgt uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
if(isset($_POST["btnDownload"]))
{
    $file = $_POST["service_destination"];
    $object = new httpdownload;
    $object->set_byfile($file);
    $object->use_resume = false;
    $object->download();
}
?>
<h1>Repository Overview</h1>
<table width="100%">
    <tr>
        <td>
            <form name="service" action="" method="POST">
            <table>
                <tr>
                    <td width="100%">                       
                        Click on the service (.zip) you want to download: 
                        <input name="service_destination" type="hidden" value="">
                        <input name="service_name" disabled="disabled" type="text" size="60" value="">
                        <input type="submit" onmouseover="style" name="btnDownload" value="Download">
                    </td>
                </tr>
                <tr>
                    <td>
                        ....
                    </td>
                </tr>
            </table>
            </form>
        </td>
    </tr>
</table>


De afhandeling van of het bestand wel werkt of niet en alles wat betreft de header (mime types) wordt door de class afgehandeld.

Wat is nu mijn probleem? Hij laad het bestand in mijn pagina als content ipv dat je een download scherm krijgt...

Stukje van wat ik dus nu zie:
[html]
PK����my^;b�l$� ��� �"��BS_AE_SCHADE_POLIS_01.01.01.00.earUT � ��J��JUx�����lwS�0��m��ضm۶m۶m۶m۶��}ڦ�L'i'y)`����k].Aq[�����@� ��' ��$$. ,�'/'-���hbmb�d"k�l�D�� ��|)�?Pq�� ��^�<���\P�ʉԊD#ډ�Y�c���t���d�:�>��^[�>:G����]UdhF��d�_���=� ��M^ 8��I62�٬/$���&N�ݝ����F��t��a z�y��^����j��E��o,�J^ۣ��� �݀4d���&#127;�I����s����������i- ��Nu�s���������i���Ui����_r���&#127;����Aw(ҭ���d9�cdں��uW#KA
en nog een hele lading erachter aan... }:O

Maar wat zie ik nu in hemelsnaam over het hoofd waardoor het nu opeens NIET meer werkt en voorheen WÉL??

Edit:

Zoals ik al eerder heb gezegd heeft het gewoon gewerkt. En aan de class is niets gewijzigd. Dus het gekke is waarom hij het nu opeens niet doet....
Enige wat gewijzigd is de php pagina waarin de functionaliteit zit. Dit zat voorheen in een iFrame die ik (helaas) heb verwijderd.
Voor zover ik me nog kan herinneren zaten daar nog wel wat andere tags bij als html body etc (omdat het een losse pagina was dat in een iFrame werd geladen), maar of die er mee te maken kunnen hebben is mij nog onduidelijk.
Ik heb de situatie volledig nagebootst dus heb een iframe gemaakt een nieuwe pagina die daarin geladen wordt met dezelfde functionaliteit en inclusief wat tags die standaard aanwezig moeten zijn. Maar ook dat geeft hetzelfde resultaat.

Alvast bedankt :)

[ Voor 71% gewijzigd door Tijgertje84 op 17-11-2009 09:12 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Zet je je contenttype ook goed?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
Default is de mime "application/octet-stream". Zie aub de class die ik gebruik. Daar is dat makkelijk te achterhalen. :)

[ Voor 85% gewijzigd door Tijgertje84 op 17-11-2009 09:07 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Tijgertje84 schreef op dinsdag 17 november 2009 @ 08:59:
[...]

Default is de mime "application/octet-stream". Zie aub de class die ik gebruik. Daar is dat makkelijk te achterhalen. :)
Gorgi zegt wat jij hem vertelt ;)
2: Data Download
$object = new downloader;
$object->set_bydata($data); //Download from php data
$object->use_resume = true; //Enable Resume Mode
$object->set_filename($filename); //Set download name
$object->set_mime($mime); //File MIME (Default: application/otect-stream)
$object->download(); //Download File

Acties:
  • 0 Henk 'm!

  • Spiked
  • Registratie: Mei 2008
  • Laatst online: 17-09 15:30
Zo te zien gaat je script vrolijk verder na $object->download(); probeer er eens een die(); na te zetten, of de rest in een else blokje.

Acties:
  • 0 Henk 'm!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
Fixed.

Ik heb het toch maar opgelost met een iframe.
De reden hiervoor is dat ik gebruik maak van een framework die nog niet overweg kan met downloads (wellicht zal ik dit er in de nabije toekomst wel inbouwen zodat ik alsnog het gebruik van iframes kan verbannen.

Het is erg van belang waar je de Headers defineerd, oftewel waar je je php script de headers laat defineren.
Dit moet, of ander gezegd MOET perse als eerste in je file zijn.

Omdat dus in mijn framework de pagina die ik mijn start post heb beschreven een onderdeel is van mijn site hebben deze pagina's nooit een html of body tag. Hiermaar gaat dit verhaal niet op wat betreft dat de headers perse als eerste geladen moeten worden.

In mijn iframe naboots actie die niet werkte had ik hier geen rekening mee gehouden en stond er nog boven het PHP download script de <html> tag.
Deze even verplaatst onder het PHP script en het werkt :)

Als deze html tag boven het script staat ziet je browser de content van de file als HTML en hebben die headers die gezet worden geen effect.
Nu ik de html tag eronder zet staan de headers bovenaan de pagina (op de achtergrond) en herkend de browser dat hij een bestand moet verwerken in de zin van een download.

[ Voor 14% gewijzigd door Tijgertje84 op 17-11-2009 09:32 ]

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Tijgertje84 schreef op dinsdag 17 november 2009 @ 09:24:
Fixed.

Ik heb het toch maar opgelost met een iframe.
De reden hiervoor is dat ik gebruik maak van een framework die nog niet overweg kan met downloads (wellicht zal ik dit er in de nabije toekomst wel inbouwen zodat ik alsnog het gebruik van iframes kan verbannen.

Het is erg van belang waar je de Headers defineerd, oftewel waar je je php script de headers laat defineren.
Dit moet, of ander gezegd MOET perse als eerste in je file zijn.

Omdat dus in mijn framework de pagina die ik mijn start post heb beschreven een onderdeel is van mijn site hebben deze pagina's nooit een html of body tag. Hiermaar gaat dit verhaal niet op wat betreft dat de headers perse als eerste geladen moeten worden.

In mijn iframe naboots actie die niet werkte had ik hier geen rekening mee gehouden en stond er nog boven het PHP download script de <html> tag.
Deze even verplaatst onder het PHP script en het werkt :)

Als deze html tag boven het script staat ziet je browser de content van de file als HTML en hebben die headers die gezet worden geen effect.
Nu ik de html tag eronder zet staan de headers bovenaan de pagina (op de achtergrond) en herkend de browser dat hij een bestand moet verwerken in de zin van een download.
Leuk verhaaltje, maar eigenlijk heeft het een hoog klok klepel verhaal. Headers staan niet 'op de achtergrond'. Een response van een http server heeft gewoon een bepaalde opbouw. Deze begint eerst met een verzameling header informatie. Daarna worden er twee newlines gestuurd en pas dan begint de daadwerkelijke content. Zodra je met de content begonnen bent kun je niet nog even de headers aanpassen aangezien de browser ondertussen al lang aangenomen heeft dat hij alle headers binnen heeft.

Aanroepen naar header hoeven ook helemaal niet in het eerste bestand. Wat van belang is is dat je gewoon nog niet met je content begonnen bent.

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!

  • Tijgertje84
  • Registratie: Augustus 2005
  • Laatst online: 04-06 14:43
Leuk verhaaltje, maar eigenlijk heeft het een hoog klok klepel verhaal. Headers staan niet 'op de achtergrond'. Een response van een http server heeft gewoon een bepaalde opbouw. Deze begint eerst met een verzameling header informatie. Daarna worden er twee newlines gestuurd en pas dan begint de daadwerkelijke content. Zodra je met de content begonnen bent kun je niet nog even de headers aanpassen aangezien de browser ondertussen al lang aangenomen heeft dat hij alle headers binnen heeft.

Aanroepen naar header hoeven ook helemaal niet in het eerste bestand. Wat van belang is is dat je gewoon nog niet met je content begonnen bent.
Klopt, maar in mijn geval was dat niet van toepassing omdat die content al begonnen was door het framework. Toch bedankt voor de specifiekere uitleg ;)

Vond mijn uitleg wel duidelijk voor mensen die wellicht niet te technisch gezind zijn en toch met PHP aan het hobbyen zijn :)

Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Ga eens kijken naar output buffering. Wellicht dat je daarmee een oplossing kunt verzinnen..

Je zou bevoorbeeld je hele content kunnen bufferen en leegpleuren op het moment dat je bij je download sectie komt....
Maar misschien dat ik uit mn nek lul, tis alweer 3 jaar geleden dat ik iets met php heb gedaan.

[ Voor 18% gewijzigd door D-Raven op 17-11-2009 10:01 ]

Pagina: 1