php ie9 automatic downloads - php

Hi guys I'm trying to get an automatic download box to appear when people go a page.
I've got this working on all the browsers and now ie9 has come along and although it downloads at the end it says "This download was interrupted"
this is what I'm using code wise
// set headers
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT\n");
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("Content-Type: application/force-download");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=\"$download[file]\";\n\n");
header( 'Content-Description: File Transfer' );
header("Content-Type: ".$mtype);
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".(string)$size.";\n");
//get a chunk of the file
$chunksize = 1*(1024*1024); // how many bytes per chunk
$buffer = '';
//downloads file
$handle = fopen($download_file, 'rb');
if ($handle === false) {
}
//write to the browser for download
while (!feof($handle)) {
$buffer = fread($handle, $chunksize);
echo $buffer;
ob_flush();
flush();
if ($retbytes) {
$cnt += strlen($buffer);
}
}
exit;
Any ideas?

Instead of the somewhat complicated file output you're doing, I'd just use readfile instead:
// set headers
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT\n");
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("Content-Type: application/force-download");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=\"$download[file]\";\n\n");
header( 'Content-Description: File Transfer' );
header("Content-Type: ".$mtype);
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".(string)$size.";\n");
readfile($download_file);
exit;
See if that works.

Related

Pseudo Streaming MP4 with php

i am trying to make the video seek using php file
this is my code
<?php
$path = 'http://exmaple.com/video.mp4';
$mm_type="video/mp4";
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");
header("Content-Type: " . $mm_type);
header("Content-Length: " .(string)(filesize($path)) );
header('Content-Disposition: attachment; filename="'.basename($path).'"');
header("Content-Transfer-Encoding: binary
");
readfile($path); // outputs the content of the file
exit();
?>
the video work but it is not possible to seek
Seeking requires that your server support handling of the Content-Range: header

How to download big files in PHP

I use this code to download/read files from a server.
header("Expires: 0");
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/file");
header('Content-length: '.filesize($file_to_download));
header('Content-disposition: attachment; filename='.basename($file_to_download));
readfile($file_to_download);
exit;
it's working fine to download files but when the file is big it's showing an error "File not found, problem file loading". Please tell me what I could change on this code for big file downloads.
Try like this:
$chunkSize = 1024 * 1024;
$fd = fopen($file_to_download, 'rb');
while (!feof($fd)) {
$buffer = fread($fd, $chunkSize);
echo $buffer;
ob_flush();
flush();
}
fclose($fd);

export to csv via php does not work in firefox

I'm trying to fetch and download data using php to csv file, for task i found a good answer, this is working for me on all browser except firefox.
$s = $master->getUser();
function array2csv(array &$array)
{
if (count($array) == 0) {
return null;
}
ob_start();
$df = fopen("php://output", 'w');
fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
return ob_get_clean();
}
function download_send_headers($filename) {
/*header("Content-Type: application/csv");
header("Content-Disposition: attachment; filename={$filename}");
// Disable caching
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1
header("Pragma: no-cache"); // HTTP 1.0
header("Expires: 0"); // Proxies*/
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
// force download
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
// disposition / encoding on response body
header("Content-Disposition: attachment;filename={$filename}");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment;filename={$filename}");
header("Content-Transfer-Encoding: binary");
}
download_send_headers(site_title .' '. date("d M Y") . ".csv");
echo array2csv($s);
die();
In Firefox file extension does not showing in csv, it is looking like application file.
Have you tried removing these in your code:
header("Content-Type: application/force-download");
header("Content-Type: application/download");
Just retain:
header("Content-Type: application/octet-stream");

export and download as csv in php not working in chrome and IE but working in firefox

I have a simple web page which pulls some data from DB and displays it in a html table and stores the data in some session variables.
I have a button "Export to csv" which calls a page which exports the results to a csv file.
The code for ExportToCsv file is:
<?php
session_start();
include "conn/sqlserverConn.php";
function download_send_headers($filename) {
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
// force download
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
// disposition / encoding on response body
header("Content-Disposition: attachment;filename={$filename}");
header("Content-Transfer-Encoding: binary");
}
$data = $_SESSION['data'];
$rows = $_SESSION['row'];
$header = $_SESSION['header'];
download_send_headers("data_export_" . date("Y-m-d") . ".csv");
$file = fopen("php://output", 'w');
fputcsv($file,$header);
for($i=0; $i<$rows; ++$i)
{
$valuesArray=array();
foreach($data[$i] as $name => $value)
{
$valuesArray[]=$value;
}
fputcsv($file,$valuesArray);
}
fclose($file);
die();
?>
My code is working flawlessly in firefox but it is not working in chrome or IE. On chrome and IE it is showing error 404 (Object not found!). Please tell me what is the problem ?
As outlined in the blog article at: http://www.exchangecore.com/blog/php-output-array-csv-headers/, I tested the following and it worked in IE8-11, and in chrome version 34. I presume it will work in other browsers fine as well.
Headers to use:
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: text/csv');
header('Content-Disposition: attachment;filename=' . $fileName);

How to update legacy PHP code that is corrupting docx and xlsx files?

I am working with some legacy PHP code and have run into Word Doc (docx) and Spreadsheet (xlsx) corruption.
Here is the current code in the download.php file:
$new_file_name = stripMySlashes($filename);
header("Content-disposition: attachment;filename=$new_file_name");
header("Content-type: application/octetstream");
header("Pragma: no-cache");
header("Expires: 0");
$client=getenv("HTTP_USER_AGENT");
$fp=fopen('uploaded_files/'.$folder.'/'.$filename,"r");
$str=fread($fp,filesize('uploaded_files/'.$folder.'/'.$filename));
echo $str;
fclose($fp);
How can I avoid checking for a bunch of filetypes in a case statement for example? I tried code like this with no luck
$file="test.docx";
header("Pragma: public");
header('Content-disposition: attachment; filename='.$file);
header("Content-type: ".mime_content_type($file));
header('Content-Transfer-Encoding: binary');
ob_clean();
flush();
readfile($file);
Any help is extremely appreciated. Thanks
Props to How to download word file using php on chrome and IE
I used this to fix the docx corruption issue...
$new_file_name = stripMySlashes($filename);
$fdl = #fopen('uploaded_files/'.$folder.'/'.$filename,'rb');
header("Status: 200");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header("Pragma: hack");
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/force-download");
header("Content-Type: application/download");
header("Content-Type: application/octetstream");
header("Content-Disposition: attachment; filename=\"".$new_file_name."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length:".filesize('uploaded_files/'.$folder.'/'.$filename));
if($fdl)
{
while(!feof($fdl)) {
print(fread($fdl, filesize('uploaded_files/'.$folder.'/'.$filename)));
flush();
if (connection_status()!=0)
{
#fclose($fdl);
die();
}
}
}

Categories