[php] string downloaden in ie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • vitrix
  • Registratie: Januari 2006
  • Laatst online: 23-08-2021
Ik ben bezig met stage.
Nu heb ik een opdracht dat met csv bestanden moet werken.
Ik laat een csv bestand in en zorg dat dubbele regels worden verwijderd.
Dit werkt allemaal perfect.

dan wordt de goede inhoud via een string / form naar de download pagina gestuurt.
Maar nu werkt het downloaden niet goed.
In firefox als ik op download druk werkt het gewoon goed.
Het bestand wordt ook opgeslagen als csv.
Maar in ie zeg die dat het bestandtype onbekend is en slaat hem zonder extentie op.
code:
1
2
3
4
5
6
7
8
<?php
    $file = stripslashes($_POST['file']);
    header("Content-Description: File Transfer");
    header("Content-Type: application/force-download");
    header("Content-Disposition: attachment; filename=".$_POST['naam'].date('dmY').".csv");
    echo $file;
    readfile($file); 
?>

[ Voor 5% gewijzigd door vitrix op 11-09-2006 15:44 ]


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16-06 22:31

TeeDee

CQB 241

Wat is nu je vraag? Hoe dit op te lossen?

Misschien dat application/octet-stream je de correcte extensie op laat slaan.
Blegh, ben in de war. Moment :)

Technisch gezien zou je de correcte MIME type mee moeten zenden, ware het niet dat bestanden als .csv/.doc/.ppt etc. etc. in de browser instance worden geopend. Dat is een 'feature' van IE (hoogstwaarschijnlijk ook andere browsers). Een oplossing is om het file te streamen, bijkomend nadeel is dat bij grote files je geheugen gebruik ook omhoog kan schieten. Daarvoor zal je het e.e.a. weer in chunks in moeten delen.

[ Voor 70% gewijzigd door TeeDee op 11-09-2006 16:04 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • vitrix
  • Registratie: Januari 2006
  • Laatst online: 23-08-2021
Hoe ik kan zorgen dat je een string in een csv bestand kan opslaan.

Je heb b.v. in een string staan.

naam;datum;
vitrix;11-09-2006

Dan moet dat in een csv bestand worden gedownload.

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Nu online

Cyphax

Moderator LNX
Ik heb daar ook weleens mee lopen klooien, ik heb het toen zo opgelost ('t is wel VBScript maargoed, misschien heb je er wat aan :)):
code:
1
2
3
4
5
Response.Buffer = TRUE
Response.ContentType = "text/csv;"
Response.Charset = "ISO-8859-1"
Response.AddHeader "Content-Disposition",  "attachment; filename=""export.csv"""
Response.Write(CSV)

CSV dan een string dus, zoals jij het ook wil doen. Het nadeel zou wel kunnen zijn dat een client zelf uitmaakt wat 'ie met text/csv doet.

[ Voor 9% gewijzigd door Cyphax op 11-09-2006 16:10 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 18-05 10:18

JayVee

shibby++!

Wij gebruiken dit
PHP:
1
2
3
4
header( 'Content-Type: text/comma-separated-values' );
header( 'Content-Disposition: attachment; filename=' . $filename . '.csv' );
header( 'Pragma: private' );        // should be No-cache, however our friends @ MS added a bug in IE which causes the download to crash when using pragma: no-cache
header( 'Expires: 0' );

ASCII stupid question, get a stupid ANSI!


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:34

crisp

Devver

Pixelated

Zorg in ieder geval dat je filename tussen quotes staat in de header. Verder heeft IE problemen met filenames waar meer dan 1 punt in staat.
Dit werkt bij mij goed:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$file = stripslashes($_POST['file']);
$filename = $_POST['naam'] . date('dmY') . '.csv';
if (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE'))
{
    $filename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1);
}
header('Cache-Control: '); //-- IE
header('Pragma: '); //-- IE
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Length: ' . strlen($file));
echo $file;

(note dat de stripslashes hier q&d is - dit is zo geen portable code en eigenlijk zou je alle userinput moeten checken op geldige of ongeldige data)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • vitrix
  • Registratie: Januari 2006
  • Laatst online: 23-08-2021
crisp schreef op maandag 11 september 2006 @ 16:15:
Zorg in ieder geval dat je filename tussen quotes staat in de header. Verder heeft IE problemen met filenames waar meer dan 1 punt in staat.
Dit werkt bij mij goed:
PHP:
1
..

(note dat de stripslashes hier q&d is - dit is zo geen portable code en eigenlijk zou je alle userinput moeten checken op geldige of ongeldige data)
Ik had ook al met quotes geprobeerd en de filename is zonder punten er in.
Als ik jouw script gebruikt dan ziet hij hem als html en wil hij hem als txt downloaden.
Firefox pakt hem gewoon goed.

Acties:
  • 0 Henk 'm!

  • vitrix
  • Registratie: Januari 2006
  • Laatst online: 23-08-2021
Heb ze allemaal getest en krijg ze niet werkend.
De laatste werkt het beste.
Zoals ik al heb gezegd krijg ik dat die een html pagina wil downloaden.
Het is al een begin :)
Nog ff door zoeken hoop dat ik achter kom hoe ik het kan fixen.

Acties:
  • 0 Henk 'm!

  • vitrix
  • Registratie: Januari 2006
  • Laatst online: 23-08-2021
Ik heb even wat anders gemaakt.
Tot dus ver lijkt het goed te werken.
In de download pagina wordt er gecontroleerd of het ie browser is of niet.
Zoniet dan wordt er een download aangeboden:

PHP:
1
2
3
4
header("Content-Description: File Transfer");
header("Content-Type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . $filename . '"');
echo $file;


Als het wel ie is dan doe ik fopen om een nieuw bestand te maken op de c:\\
Daarin schrijf ik de string.
Er komt een bericht te staan dat er met succes een nieuw bestand is gemaakt.

PHP:
1
2
3
4
5
6
7
8
9
10
$name = explode("\\", $filename);
$counter = count($name) -1;
$filename = $name[$counter];
if (!file_exists('C:\\' . $filename)) {
    $handle = fopen('C:\\'  . $filename, 'w');
    fwrite($handle, $file);
    fclose($handle);
} else {
    $bestaat = 'true';
}


Tot dus ver lijkt het allemaal goed te werken.
Pagina: 1