Avatar billede heyn Nybegynder
08. juli 2010 - 11:37 Der er 6 kommentarer og
1 løsning

Min download downloader php dokumentet istedet for filen.

Hej Eksperter.

Jeg har lavet en side som starter med at downloade et dokument.
Koden ser således ud:

// En masse der opbygger et excel-dokument med PHPExcel
...
// PHP-Excel gemmer filen på serveren
$filename = fremmoede_2010-03-01_2010-08-31.xlsx;
$objWriter->save(str_replace('.php', '.xlsx',$filename));
// Filen downloades
header("Content-type: application/vnd.ms-excel");
header("Content-Size: ".filesize($filename));
$Content = "Content-Disposition: attachment; filename=".$filename;
header($Content);
header("Cache-Control: must-revalidate,post-check=0,pre-check=0");
header("Pragma: public");
header("Expires: 0");
...
Den egentlige side opbygges.

Excel-filen bliver gemt på serveren, og jeg får også mulighed for at downloade den. Problemet er at mens filen på serveren er ok, så er indholdet af filen der downloades det ikke. Indholdet er i stedet den html-kode som siden indeholder.

Kan nogle gennemskue problemet?

Mvh Christian
Avatar billede repox Seniormester
08. juli 2010 - 11:59 #1
For det første er angiver du ikke filnavnet som en streng.
$filename = fremmoede_2010-03-01_2010-08-31.xlsx;
bør være
$filename = "fremmoede_2010-03-01_2010-08-31.xlsx";


Og hvad laver du her?
$objWriter->save(str_replace('.php', '.xlsx',$filename));


Hvor er det indhold du vil sende til brugeren?

Og hvad betyder "Den egentlige side opbygges."?
Avatar billede heyn Nybegynder
08. juli 2010 - 12:16 #2
Jeg havde glemt " i min beskrivelse.

$objWriter->save(str_replace('.php', '.xlsx',$filename));
er en kommando tilhørende pakken PHPExcel. Den gemmer simpelthen den excel-fil man har opbygget på serveren. Excel-filen indeholder et regnskab.

Indholdet er den fil som er blevet opbygget før alle mine headerstatements kommer.
$objPHPExcel = new PHPExcel();
$cellRange = "A1:F1";
$objPHPExcel->getActiveSheet()->mergeCells($cellRange);
...
...
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$filename = "fremmoede_2010-03-01_2010-08-31.xlsx";
$objWriter->save(str_replace('.php', '.xlsx',$filename));
OSV som vist ovenover.
...
<html>
<head>
<title>Regnskab</title>
</head>
<body>
...
Nogle tabeller med regnskabet
...
</body>
</html>

Der skal altså vises et regnskab på siden, og det skal samtidig kunnet downloades i excel-format.
Avatar billede repox Seniormester
08. juli 2010 - 12:21 #3
Jeg kan også spørge på en anden måde:
Hvorfor bruger du str_replace() i din save() metode?

Jeg forstår ikke din forklaring på indholdet. Som jeg læser det, laver du noget indhold til download, som du gerne vil sende til brugeren på samme side som du vil præsentere indhold i browseren. Det kan du ikke.
Avatar billede heyn Nybegynder
08. juli 2010 - 12:49 #4
Altså -
I starten af regnskab.php opbygges et exceldokument når filens sti er regnskab.php?opret=create_excel. Data hentes fra en mysql db.
Dette dokument gemmes på serveren.
Dette fungerer godt nok. Filen der gemmes på serveren er i excel-format og med rette indhold

Derefter kommer mit forsøg på at downloade dette dokument. Her fejler det. excelfilens indhold er indholdet af den side der vises i browseren, og som jo ikke er i excel-format, men i html-format.

Endelig opbygges den side som skal vises i browseren. Denne del indeholder html såvel som php kode. Det er dette som bliver lagt ind i den fil som downloades.
Avatar billede repox Seniormester
08. juli 2010 - 13:02 #5
Det lyder som om du ikke ved hvordan en HTTP forespørgsel foregår; du har ikke en logisk opdeling af dine ønsker.

Hvis du kan lave filen og gemme den på serveren kan du sende den til download vha. dette:
<?php
  $filename = "filnavnet_på_filen_der_skal_sendes_til_download.xls";

  header("Content-type: application/zip"); // skidt med at der står zip, det er ikke vigtigt
  header("Content-Size: ".filesize($filename));
  header("Content-Disposition: attachment; filename=".$filename);
  header("Cache-Control: must-revalidate,post-check=0,pre-check=0");
  header("Pragma: public");
  header("Expires: 0");

  $content = file_get_contents($filename);
  echo $content;
?>


Det er alt hvad der skal til.

Dit præsentationslag - altså, den html side du vil vise må blive på sin egen side.
Avatar billede heyn Nybegynder
08. juli 2010 - 13:37 #6
Fantastisk - Det virker!!!

Jeg havde ikke helt fattet hvordan det der med header og download fungerer.

Mange mange tak

Så mangler vi bare et svar

Mvh og god sommer fra Christian
Avatar billede repox Seniormester
08. juli 2010 - 13:41 #7
Det fik du her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester