[PHP] CSV bestand downloaden

Pagina: 1
Acties:
  • 197 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb code geschreven die waarden uit een database haalt, en ze wegschrijft naar een file.
Nou wil ik graag dat dit bestand als het aangeklikt wordt, gedownload wordt (om op te slaan, dus met een schermpje 'Openen'-'Opslaan' etc)
Ik heb headers gebruikt:
PHP:
1
2
3
4
5
header('Content-type: application/excel');
header("Content-disposition: filename=emailadressen.csv"); 
header("Content-type: application/octetstream"); 
header("Pragma: no-cache"); 
header("Expires: 0");


(De waarden worden dus geschreven in emailadressen.csv...)
Echter downloadt ie nu de PHP pagina waar deze code instaat, althans hij download een bestand 'download_csv' (dus zonder extensie).

Wat gaat er fout?

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Mis je niet wat headers? Probeer het met deze eens:

PHP:
1
2
3
4
5
6
7
8
9
10
11
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ". gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Cache-control: private");
header("Content-Type: application/vnd.ms-excel"); 
header("Content-Disposition: attachment; filename=emailadressen.csv");
header("Content-Transfer-Encoding: binary");

echo $content;

March of the Eagles


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op woensdag 31 januari 2007 @ 21:09:
(De waarden worden dus geschreven in emailadressen.csv...)
Neenee zo werkt dat niet. De waarden komen direct onder de headers.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hacku schreef op woensdag 31 januari 2007 @ 21:18:
Mis je niet wat headers? Probeer het met deze eens:

PHP:
1
2
3
4
5
6
7
8
9
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ". gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Cache-control: private");
header("Content-Type: application/vnd.ms-excel"); 
header("Content-Disposition: attachment; filename=emailadressen.csv");
header("Content-Transfer-Encoding: binary");
Het lijkt nu goed te gaan, maar als Excel automatisch opent, krijg ik de volgende melding:
code:
1
C:\Documents and Settings\....blabla...\emailadressen[1].csv kan niet worden gevonden.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GlowMouse schreef op woensdag 31 januari 2007 @ 21:20:
[...]

Neenee zo werkt dat niet. De waarden komen direct onder de headers.
Dus eerst de headers en dan pas de code waarin ik de waarden in de file schrijf?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik hem eerst opsla, en dan open, krijg ik de melding : "Kan het bestand niet lezen."

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op woensdag 31 januari 2007 @ 21:22:
[...]


Dus eerst de headers en dan pas de code waarin ik de waarden in de file schrijf?
Er komt helemaal geen file aan te pas. Je moet de CSV-waarden echo'en na het versturen van de headers.

gebruik voortaan de edit-knop ipv drie berichten na elkaar te plaatsen

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GlowMouse schreef op woensdag 31 januari 2007 @ 21:24:
[...]

Er komt helemaal geen file aan te pas. Je moet de CSV-waarden echo'en na het versturen van de headers.

gebruik voortaan de edit-knop ipv drie berichten na elkaar te plaatsen
Dus de volgorde moet zijn:
1. headers
2. waarden uit database halen
3. echo'en van waarden in while-lus
???

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
De volgorde maakt niet uit, zolang je maar onder de headers print.

PHP:
1
2
3
4
5
$content = 'data';

header (); // headers

echo $content;

March of the Eagles


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op woensdag 31 januari 2007 @ 21:25:
[...]

Dus de volgorde moet zijn:
1. headers
2. waarden uit database halen
3. echo'en van waarden in while-lus
???
Inderdaad, zo gaat het goed. De file heb je dus niet nodig, maar wil je toch per se als tussenbron gebruiken, bijvoorbeeld omwille van caching, kun je readfile gebruiken.

Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
Dit is code die ik gebruik om een bestand door te sturen voor download.
Ik geef b.v. ook de bestands grote door, en hebt wat optimalisaties voor IE gemaakt ...
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    if(!$fdl=@fopen($fileString,'r'))
    {
        die("Cannot Open File!");
    }
    else 
    {
        header("Cache-Control: ");// leave blank to avoid IE errors
        header("Pragma: ");// leave blank to avoid IE errors
        header("Content-type: application/octet-stream");
        header("Content-Disposition: attachment; filename=\"".$fileName."\"");
        header("Content-length:".(string)(filesize($fileString)));
        sleep(1); // to avoid errors
        fpassthru($fdl);
    }
    return true;

[ Voor 8% gewijzigd door djexplo op 31-01-2007 21:31 ]

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik doe het volgende, maar nog steeds dezelfde foutmelding.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
    header("Last-Modified: ". gmdate("D, d M Y H:i:s") . " GMT"); 
    header("Cache-Control: no-store, no-cache, must-revalidate"); 
    header("Cache-Control: post-check=0, pre-check=0", false); 
    header("Pragma: no-cache"); 
    header("Cache-control: private"); 
    header("Content-Type: application/vnd.ms-excel");  
    header("Content-Disposition: attachment; filename=emailadressen.csv"); 
    header("Content-Transfer-Encoding: binary"); 
    
    include ("../connect.php");
    $query1 = "select distinct emailadres from gestelde_vragen";
    $result1 = mysql_query($query1) or die(mysql_error());
    while(list($email1) = mysql_fetch_row($result1)){//alle emailadressen uit gestelde vragen
      echo "$email1;";
    }
?>

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Dat ligt aan jouw excel ofzo, want hier gaat het perfect :)

March of the Eagles


Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
Trouwens al geprobeerd om de file op de server weg te schrijven en dan te bekijken?, als het dan wel werkt zit de fout niet in de headers...

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
djexplo schreef op woensdag 31 januari 2007 @ 21:33:
Trouwens al geprobeerd om de file op de server weg te schrijven en dan te bekijken?, als het dan wel werkt zit de fout niet in de headers...
Kan hem inderdaa wel wegschrijven en tonen...als ik fread("emailadressen.csv"); doe, geeft ie het weer op het scherm...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hacku schreef op woensdag 31 januari 2007 @ 21:33:
Dat ligt aan jouw excel ofzo, want hier gaat het perfect :)
Kan ik hem ook in word openen? Of in textpad?

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op woensdag 31 januari 2007 @ 21:35:
[...]
Kan ik hem ook in word openen? Of in textpad?
Ja, notepad, file, open, en dan de url invoeren.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Verwijderd schreef op woensdag 31 januari 2007 @ 21:35:
[...]


Kan ik hem ook in word openen? Of in textpad?
Ja, en dat kon je vast zelf wel bedenken ;)

PHP:
1
2
    header("Content-Type: application/vnd.ms-word");  
    header("Content-Disposition: attachment; filename=emailadressen.doc");

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik hem nu eerst opsla op het Bureaublad en dan open, doet ie het wel...vaag

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hacku schreef op woensdag 31 januari 2007 @ 21:38:
[...]


Ja, en dat kon je vast zelf wel bedenken ;)

PHP:
1
2
    header("Content-Type: application/vnd.ms-word");  
    header("Content-Disposition: attachment; filename=emailadressen.doc");
Had ik inderdaad al geprobeerd...jammer dat ie dan nog steeds excel opent...

[ Voor 5% gewijzigd door Verwijderd op 31-01-2007 21:39 ]


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Verwijderd schreef op woensdag 31 januari 2007 @ 21:38:
[...]


Had ik inderdaad al geprobeerd...jammer dat ie dan nog steeds excel opent...
Hier opent 'ie gewoon Word.

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hacku schreef op woensdag 31 januari 2007 @ 21:42:
[...]


Hier opent 'ie gewoon Word.
Bij mij nu ook...bestands-extensie stond nog steeds op .csv hahaha [sorry]

Acties:
  • 0 Henk 'm!

  • stappel_
  • Registratie: Augustus 2000
  • Laatst online: 14-09 12:59
Ik heb ook tijden tegen het excel probleem aangekeken. Bij ons was het probleem 2-ledig:
- de pagina's stonden op https://, hierdoor wordt de pagina niet lokaal opgeslagen kan excel hem nooit openen
- alles liep via een proxy, maar dat was mijn fout.

de headers die wel werkten zijn:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer excel file");

session_cache_limiter("must-revalidate");
header("Content-Type: application/vnd.ms-excel");
header("Content-Length: ".(string)(filesize($filename)));
header("Content-Disposition: attachment; filename=\"" . basename($filename) ."\"");
header("Content-Transfer-Encoding: binary");


later zijn we overgegaan naar Spreadsheet_Excel_Writer van PEAR. die doet de headers voor jou.

Ubero: #2, Euler: #1, GOT: #1, Des: #1, Zeta: #1, Eon: #3, OGR-24: #3, OGR-25: #7,
LM: #7, AP: #5, DF: #19, D2OL: #37, SOB: #50, TSC: #63, RC5: #96


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 16:14

pietje63

RTFM

Hmm, toen ik nog met csv bestanden werkte schreef ik ze gewoon weg met frwite, zonder headers of wat dan ook, en dan ging het goed.

CSV bestanden zijn in principe ook gewoon plain/text en hebben daaro geen (Excel) headers nodig.

(stukje oude ranzige code)
PHP:
1
2
3
4
5
6
7
8
9
10
11
$handle = fopen ("data/backup/".$datum.".csv", "a+");
fwrite ($handle, "voornaam;tussenvoegsel;achternaam;adres;postcode;plaats;telefoon;mobiel;email;geboortedatum;studie;studiejaar;sauruslidsinds;stuur;bboord;cskiff;bskiff;coach;coacha;team;wedstrijdteam;wachtwoord\n");
$result=mysql_query("select * ".
    "from smoelenboek ");
while ($row = mysql_fetch_array($result)) {
$id = $row["id"];
$voornaam = $row["voornaam"];
[...]
$wedstrijdteam = $row["wedstrijdteam"];
$data = trim("$voornaam;$tussenvoegsel;$achternaam;$adres;$postcode;$plaats;$telefoon;$mobiel;$email;$geboortedatum;$studie;$studiejaar;$sauruslidsinds;$stuur;$bboord;$cskiff;$bskiff;$coach;$coacha;$team;$wedstrijdteam;$wachtwoord");
fwrite ($handle, $data."\n");


[edit]Lol, ik heb nu stiekem toch al een paar kleine dingen verandert omdat ik vroeger anders programmeerde

[ Voor 67% gewijzigd door pietje63 op 01-02-2007 21:48 ]

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

  • xces
  • Registratie: Juli 2001
  • Laatst online: 20-09 16:56

xces

To got or not to got..

In het kader van Open Source enzo, hier eens een bijdrage van mijn kant. Dit script gebruik ik al tijden (op zowel PHP4 als PHP5) en werkt bij mij voortreffelijk. Het is een generieke wrapper voor het sturen van downloads naar de browser, waarmee je zelf content headers mee kunt geven. Het draait wel op een van mijn eigen servers, maar volgens mij heb ik niets spannends in de PHP config gedaan.

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    /**
     * Stuurt een download naar een browser toe
     */
    function send_file($strPath, $strServeAs='', $strContentType='application/octet-stream') {
        session_write_close();
        ob_end_clean();
        if (!is_file($strPath) || (connection_status() != 0))
            return false;

        //
        // To prevent long file from getting cut off
        set_time_limit(0);

        //
        // Get filename
        if ($strServeAs != '')
            $strFilename = $strServeAs;
        else
            $strFilename = basename($strPath);

        //
        // Filenames in IE containing dots will screw up the filename unless we add this
        if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
            $strFilename = preg_replace('/\./', '%2e', $strFilename, substr_count($strFilename, '.') - 1);
        }

        //
        // Required, or it might try to send the serving document instead of the file
        header("Cache-Control: ");
        header("Pragma: ");
        header("Content-Type: ".$strContentType);
        header("Content-Length: " .(string)(filesize($strPath)) );
        header('Content-Disposition: attachment; filename="'.$strFilename.'"');
        header("Content-Transfer-Encoding: binary\n");

        //
        // Start sending the file
        $intFile = fopen($strPath, 'rb');
        if ($intFile) {
            while ((!feof($intFile)) && (connection_status()==0)) {
                print(fread($intFile, 1024*8));
                flush();
            }
            fclose($intFile);
        }

        return ((connection_status() == 0) and !connection_aborted());
    }


Hope this helps someone.

[ Voor 14% gewijzigd door xces op 01-02-2007 22:44 ]


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Hetgene wat je mist is waarschijnlijk de content-length header :)

zo moet het worden, dan werkt het wel, ook in de brakkere browsers:

• Haal eerst de output binnen, plemp dat in een string.
• Spuug dan je headers uit, inclusief content-length = strlen($string)
• die($string);
klaar :)

[ Voor 5% gewijzigd door SchizoDuckie op 02-02-2007 00:04 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Alles werkt nu op 1 punt na:
Als ik een database uitlees in een csv bestand, neemt ie bijvoorbeeld een tekst met enters (die dus in een formulier als textfield staat en in de database wordt gezet met enters) niet goed over in excel.

Ik heb geprobeerd om een str_replace te doen door de <br /> te vervangen door een spatie, maar dat levert nog niet het gewenste resultaat.

Hoe kan ik enters vervangen door een spatie? Heb ook al met '\n' en 'ln' geprobeerd...
Pagina: 1