PHPExcel output to browser doesn't work in IE - php

I have a PHP script that uses PHPExcel to open a template, insert values from a database query then return the result to the browser. It works perfectly in Firefox, but in Internet Explorer (8), when it attempts to open the file, it breaks with:
Internet Explorer cannot download generate.php from my.domain.
Internet Explorer was not able to open this Internet site. The
requested site is either unavailable or cannot be found. Please try
again later.
The code that I'm using (generate.php) is as follows:
// Open template
$xlRead = PHPExcel_IOFactory::createReader('Excel5');
$xl = $xlRead->load('Template.xls');
$xl->setActiveSheetIndex(0);
// Write data
$xl->getActiveSheet()->fromArray($dbOutput, null, 'A1');
// Output to browser
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('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename=MyReport.xls');
$xlWrite = PHPExcel_IOFactory::createWriter($xl, 'Excel5');
$xlWrite->save('php://output')
EDIT Seems like this problem only affects IE when behind SSL. As such, this is an identical problem to several similar SO questions. People's advice is to tweak the headers, but so far, no combination of what I've seen as solutions has worked...

If none of the above works for you, and you would still like to run under SSL, you could always write the file to disk and provide a download link, or you could prompt the user for an email address and email the file as an attachment. If you go the email route, PHPMailer has a fairly easy way of sending attachments. I'm not 100% for sure, but I think the file needs to be written to disk before it can be attached using PHPMailer, but you can always unlink the file immediately after send.

It all comes down to IE's handling of the headers you set. Microsoft's own answer to this known problem should resolve things for you.
Summary of their solution: "remove the no-cache header or headers."

Related

PDF redirection shows blank on Chrome

I'm having this issue that I can't solve for the life of me.
I have a simple php script that redirects to pdfs, the code is as follows:
$file = "url/to/file";
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Description: File Transfer");
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="somefile.pdf"');
header('Content-Transfer-Encoding: binary');
readfile($file);
exit();
If I try it directly in a browser tab, it works, it connects with Chrome's pdf plugin and shows it to me. If I try to put this on a link on another page, or try to open it via window.open in javascript, It shows a blank page. This only happens in Chrome and Safari, Firefox and Edge show it fine. Before anyone asks, I've tried it with and without the cache and content-description headers, which I've got from answers I found here, this is just the last version I have.
Any ideas?
Thanks in advance
EDIT
I forgot to mention that the problem persists on the blank tab even if I reload the page. I've checked the Network tab on devtools, they show identical results for bot requests and responses (the redirect and the direct one) but the redirect doesn't work. Also, no errors of any kind on either one.
Also, I've tried it without the exit(), doesn't change a thing.
As mentioned in the comments by ylva, for anyone searching for this, the answer can be found here
Open PDF from Chrome IFRAME failed with default PDF viewer
Main thing is, Chrome's PDF viewer embeds the PDF as an application, so if the link to a PDF file comes from an iframe, and this iframe has the sandbox attribute, chrome won't let it run, you either have to remove the sandbox attribute or have to install your own PDF viewer. So it had nothing to do with the PHP code itself.
Cheers

"Network failure" to download PDF generated with with PHP FPDF/FPDF2File class in Google Chrome

I have reports generated in PHP / FPDF / FPDF2File that are usually displayed in the browser window.
Notice:
The parameters are passed to the PHP that generates report POST.
The file is being accessed exclusively via HTTPS with a valid certificate.
The web server is able to log all errors and errors are being properly recorded in the log, but no error related to that FPDF/PHP is being recorded. (Ie I clean the error log, run the report and no error appears in the log ... forcing a mistake on purpose and it is registered). Thus, it seems that there is no syntax error.
The Content-type used is: header ( 'Content-type: application / pdf');
The problem occurs in Windows computers with Google Chrome (tested on multiple machines).
All buttons of the PDF rendering plug-in browsers (save, print, rotate, zoom, etc.) work normally. Except the save button in Google Chrome (in other browsers work normal).
When trying to save the PDF already opened and displayed on Google Chrome, the following error occurs:
Failure - Network error
Therefore, you can not save the PDF, unless you go to print and print in PDF, or print the PDF PDF, which does not make much sense.
Could someone tell how to solve this error?
Thanks a lot!
Do you set the no-store property of the Cache-Control header?
I don't know why, but for me it worked after changing
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
to
header("Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0");
#Amryn's answer actually worked for me. Here's my full header setup:
header('Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0');
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="relatorio-clientes.pdf"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . strlen(ltrim($content)));
header('Accept-Ranges: ' . strlen(ltrim($content)));
echo $content;
If you use the Print option and Save as PDF, network error does not occur (workaround).
That's works for me :
Remove all characters like space after the php close tag ?>
Found here :
https://stackoverflow.com/a/13463631/2267379
Simple solution: Don't do a
return $pdf->Output('medienpass.pdf', 'D');
in your getPdf() function because the output will be wrapped up in a
lot of html code.
Instead return only your pdf to the client:
die($pdf->Output('medienpass.pdf', 'D'));

Excel Launching Blank Workbook On Opening Custom File

I work on a website, and up until Monday we were able to download a custom excel file sheet and display it. At this point, whenever we try to open it, it launches a blank, grayed-out workbook if Excel is not currently running, and nothing if it is. I have tried editing the content type to no avail. I have tried creating documents with older data that worked at the time and it doesn't work. Nothing has changed on the file system regarding this in a month, and it only just started. Here is the current code used to generate the file:
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/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename=' . $fname);
ob_clean();
ob_flush();
echo $somecontent;
exit;
Here is what happens when I try to open the created file.
The only way I have found that fixes this currently is to open the file in Notepad++, edit it, and save it, which then allows it to open properly in Excel.
Any help would be appreciated.
EDIT 1: So because the comments below didn't help much, I took a look around and found this video, and upon disabling those three options I could open the files again without having to go through Notepad++ first. I then narrowed down the field that was causing issues to "Protect files originating from the internet" even though before they worked fine.

Problems with header() when displaying a PDF file in IE8

So, I have a file that sends the following:
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: private");
header("Content-type: application/pdf");
header("Content-disposition: inline; filename=file.pdf");
header("Content-length: 7735");
then I echo out the file - it is a PDF file.
Works fine in IE6 & 7 on XP (and FF for that matter)
The very same code shows nothing when running on IE8 on either XP or Vista.
There are no security warnings, etc so I don't think it has to do with that.
And, if my memory serves me correctly, this worked on IE8 a while ago.
What am I doing wrong here? Am I missing something out of the headers?
Is there a way for me to see what header information normal comes over when viewing a PDF in IE8 so I know what to emulate?
After looking at things it still works in IE8 EXCEPT when SSL is on
Under HTTPS and IE8, those headers fix the download problem:
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public");
Other X-something headers did not make any difference.
It has probably to do do with the SSL. I read this article (in German, with code examples) where the author set the following header:
header('Pragma: anytextexeptno-cache', true);
I'm not sure what is needed, but here is what you could do.
Put the file temporarily in a public place on your server, make syre you can download that with a direct link in IE8, Use firefox LiveHTTP headers or similar to grab all headers that the server sends. Spit them out in exactly the same way and order in your script. (And don't forget to delete the file).
Something I want to add, as I faced this problem, too, in a slightly different way using Joomla.
Normal PDF-Output of content worked fine, in all browsers.
But the generation of a pdf from within my own component (using JDocument, tho) generated the bevahiour mentioned above.
My solution: Explicitly enable caching for my component using the following statement in view.html.php:
JResponse::allowCache(true);
Maybe that helps somebody.
I'm using HTTPS and i had some problems, but using those headers the download did.
Try it.
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public");
header("X-Download-Options: noopen "); // For IE8
header("X-Content-Type-Options: nosniff"); // For IE8
header("Content-type: application/pdf");
header("Content-disposition: inline; filename=file.pdf");
header("Content-length: 7735");
The problem is you cant direct open. Just save.
Possibly related: Can't display PDF from HTTPS in IE 8 (on 64-bit Vista)

How to use the CSV MIME-type?

In a web application I am working on, the user can click on a link to a CSV file. There is no header set for the mime-type, so the browser just renders it as text. I would like for this file to be sent as a .csv file, so the user can directly open it with calc, excel, gnumeric, etc.
header('Content-Type: text/csv');
echo "cell 1, cell 2";
This code works as expected on my computer (Isn't that how it always is?) but does not work on another computer.
My browser is a nightly build of FF 3.0.1 (on linux). The browsers it did not work in were IE 7 and FF 3.0 (on windows)
Are there any quirks I am unaware of?
You could try to force the browser to open a "Save As..." dialog by doing something like:
header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyVerySpecial.csv');
echo "cell 1, cell 2";
Which should work across most major browsers.
You are not specifying a language or framework, but the following header is used for file downloads:
"Content-Disposition: attachment; filename=abc.csv"
With Internet Explorer you often have to specify the Pragma: public header as well for the download to function properly..
header('Pragma: public');
Just my 2 cents..
This code can be used to export any file, including csv
// application/octet-stream tells the browser not to try to interpret the file
header('Content-type: application/octet-stream');
header('Content-Length: ' . filesize($data));
header('Content-Disposition: attachment; filename="export.csv"');
I tried to use text/csv but it did not work for me after that tried different stuff and I figured out that if we use this text/plain. Now the file upload is completed. as expected. This problem was in the Yii2 file upload widget.
Example response after success.
{"files":[{"name":"unit_ids list - Sheet1.csv","type":"text/plain","size":30,"base_url":"https://s3-eu-west-1.amazonaws.com/cdn.abc.co","path":"1/g2qVy3JtyZBLaRUd8c5gMOtSyrTEwdzR.csv","url":"https://s3-eu-west-1.amazonaws.com/cdn.abc.co/1/g2qVy3JtyZBLaRUd8c5gMOtSyrTEwdzR.csv","delete_url":"/coupons/default/sheet-delete?path=1%2Fg2qVy3JtyZBLaRUd8c5gMOtSyrTEwdzR.csv"}]}

Categories