PHP загружает файл Excel становится поврежденным - PullRequest
3 голосов
/ 31 января 2012

У меня есть файл Excel, который я хочу, чтобы пользователь мог загрузить с моего сервера.Я рассмотрел много вопросов здесь, но я не могу найти способ правильно загрузить файл без повреждения.Я предполагаю, что это заголовки, но у меня еще не было их рабочей комбинации.Это то, что у меня есть сейчас, и в поврежденном файле, который я получаю, я вижу имена столбцов электронной таблицы, которую я хочу, но все это испорчено.

$filename = '/var/www/web1/web/public/temporary/Spreadsheet.xls';        
header("Content-type: application/octet-stream");
header("Content-type: application/vnd-ms-excel");
header("Content-Disposition: attachment; filename=ExcelFile.xls;");
header("Pragma: no-cache");
header("Expires: 0");
readfile($filename);

edit: Solution Я забыл добавить, что я использовал Zend, и он искажал файлы при попытке использовать нативные методы php.Мой законченный код должен был поместить ссылку на другое действие в моем контроллере и загрузить файлы оттуда

public function downloadAction(){
        $file = '/var/www/web1/web/public/temporary/Spreadsheet.xls';
        header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="Spreadsheet.xls"');
    readfile($file);

    // disable the view ... and perhaps the layout
    $this->view->layout()->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);


    }

Ответы [ 3 ]

5 голосов
/ 31 января 2012

попробуйте сделать это таким образом

 ob_get_clean();
 echo file_get_contents($filename);
 ob_end_flush();
1 голос
/ 04 апреля 2015
$file_name = "file.xlsx";

// first, get MIME information from the file
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mime =  finfo_file($finfo, $file_name);
finfo_close($finfo);

// send header information to browser
header('Content-Type: '.$mime);
header('Content-Disposition: attachment;  filename="download_file_name.xlsx"');
header('Content-Length: ' . filesize($file_name));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

//stream file
ob_get_clean();
echo file_get_contents($file_name);
ob_end_flush();
1 голос
/ 31 января 2012

Для одного укажите Content-Type только один раз.Вы можете использовать специфичный для Excel заголовок , но общий application/octet-stream может быть более безопасной ставкой, просто чтобы заставить его работать (реальная разница будет в том, что браузер показывает пользователю в отношении "что бы вы хотели"чтобы открыть этот файл с помощью ", но основные браузеры также могут полагаться на расширение)

Кроме того, убедитесь, что вы указали Content-Length и сбросили размер (в байтах) файла, который вы выводите.Браузер должен знать, насколько большой файл и сколько контента он ожидает получить (чтобы он не останавливался посередине или сбой не прерывал загрузку файла).

Итак, весьфайл должен состоять из:

<?php
  $filename = '/var/www/web1/web/public/temporary/Spreadsheet.xls';

  header("Content-Disposition: attachment; filename=ExcelFile.xls;");
  header('Content-Type: application/octet-stream');
  header('Content-Length: ' . filesize($filename));
  header("Pragma: no-cache");
  header("Expires: 0");

  @readfile($filename);
...