PHP下载excel文件变得腐败

时间:2012-01-31 17:24:05

标签: php excel download corrupt

我有一个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);

编辑:解决方案我忘了添加我正在使用Zend,并且在尝试使用本机php方法时它正在破坏文件。我的finsihed代码是在我的控制器中放置一个指向另一个动作的链接,并从那里下载文件

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 个答案:

答案 0 :(得分:5)

尝试这样做

 ob_get_clean();
 echo file_get_contents($filename);
 ob_end_flush();

答案 1 :(得分:1)

首先,只指定Content-Type一次。您可以使用excel-specific header,但通用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);

答案 2 :(得分:1)

$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();