Я хочу принудительно загрузить после отправки (файл.docx, сгенерированный с помощью PhpWord), и перенаправить на другую страницу в одно и то же время.
вот код, создающий файл DOCX:
$objWriter->save($filename);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($filename));
header('Location: http://localhost/contracto_0.4/index.php/contrac)
readfile($filename);
unlink($filename); // deletes the temporary file
После этого я пытаюсь загрузить представление, и у меня есть это сообщение от PHP:
Cannot modify header information - headers already sent by (output started at C:\wamp\www\contracto_0.5\system\core\Exceptions.php:185)
Вероятно, из-за этих двух строк кода у вас есть, любезно измените эти две строки
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$filename);
К
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
ИЛИ
header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
header('Content-Disposition: attachment; filename="' . $filename . '"');
Возможно, мне не нужно объяснять вам линию за строкой, потому что ее очень легко понять. Пожалуйста, обратитесь к моему старому коду ниже в качестве руководства.. и на самом деле он все еще работает на моем сайте. Не стесняйтесь тестировать и изменять его.
$error = '<p style="color:#990000">Sorry, the file you are requesting is unavailable.</p>';
if(isset($_GET['file']) && basename($_GET['file']) == $_GET['file'])
{
$filename = $_GET['file'];
}
else
{
$filename = null;
}
if($filename != null)
{
$path = '../files/' . $filename;
if (file_exists($path) && is_readable($path))
{
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Length: ' . filesize($path));
header('Content-Transfer-Encoding: binary');
$file = @fopen($path, 'rb');
if($file)
{
fpassthru($file);
exit;
}
else
{
echo $error;
}
}
else
{
echo $error;
}
}
else
{
echo $error;
}
Вы можете использовать download_helper:
if ( ! function_exists('force_download'))
{
function force_download($filename = '', $data = '')
{
if ($filename == '' OR $data == '')
{
return FALSE;
}
// Try to determine if the filename includes a file extension.
// We need it in order to set the MIME type
if (FALSE === strpos($filename, '.'))
{
return FALSE;
}
// Grab the file extension
$x = explode('.', $filename);
$extension = end($x);
// Load the mime types
@include(APPPATH.'config/mimes'.EXT);
// Set a default mime if we can't find it
if ( ! isset($mimes[$extension]))
{
$mime = 'application/octet-stream';
}
else
{
$mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension];
}
// Generate the server headers
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
{
header('Content-Type: "'.$mime.'"');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-Transfer-Encoding: binary");
header('Pragma: public');
header("Content-Length: ".strlen($data));
}
else
{
header('Content-Type: "'.$mime.'"');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header("Content-Transfer-Encoding: binary");
header('Expires: 0');
header('Pragma: no-cache');
header("Content-Length: ".strlen($data));
}
exit($data);
}
}
и в вашем контроллере:
function donwload(){
$this->load->helper('download');
$data = file_get_contents('path/file.docx');
force_download('file.docx', $data);
}
выше код доступен на ellislab.com
попробуйте использовать
redirect($filename);
если не работает
в файле codeignaiter index.php добавьте следующую локализацию в корневую папку add я solve Невозможно изменить информацию заголовка - заголовки уже отправлены по ошибке и перенаправлены
ob_start();