2012-01-31 117 views
1

我有一个excel文件,我希望用户能够从我的服务器上下载。我已经看了很多这里的问题,但我找不到正确下载文件W/O腐败的方式。我假设它是标题,但我还没有他们的工作组合。这就是我现在所拥有的,并且在我收到的损坏文件中,我可以看到我想要的电子表格的列名,但它的全部都搞砸了。PHP下载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); 


    } 
+0

所以,整个文件应包括?输出2个内容头文件并非直接文件下载 – 2012-01-31 17:26:02

+1

毫无意义 - 文件不能一次成为两件事。这就像说“我是长颈鹿和鲸鱼!”。 – 2012-01-31 17:26:08

+1

很长时间以来,对这类问题的最常见答案归结为以下两种情况之一:a)在脚本中的''标记之前/之后或在您的脚本中有一个BOM表之前/之后有前/后空白/ HTML文件或b)在'readfile()'之后忘记调用'exit' /'die',并在文件数据的末尾输出更多内容。 – DaveRandom 2012-01-31 17:27:24

回答

5

下载尝试做这种方式

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

是的PHP脚本是在开始时添加一些空格,并且图像文件在下载时被破坏,ob_get_clean()修复了它。谢谢! – 2014-09-29 07:45:33

+0

我收到类似ob_end_flush()的错误消息:未能删除并刷新缓冲区。没有缓冲区来删除或冲洗file_path.Please建议我该怎么办@Melvin Protacio – lalithkumar 2017-04-19 13:16:21

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); 
+0

我使用了两个ocetet-stream和两个返回相同的东西。我失踪并退出声明,但该文件仍然损坏。 – tiggles 2012-01-31 19:20:04

+0

@user:要确认,文件(使用FTP客户端下载时)工作正常吗?只有当你试图通过PHP下载它时,它才会破坏? – 2012-01-31 19:27:11

+0

是的,我通过FTP下载它来检查,它工作正常。如果这是一个问题,我也使用zend。 – tiggles 2012-01-31 19:39:17

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(); 
+0

如何获得finfo_open函数?我必须下载任何文件?如果是,请分享链接? @Bhavesh Gangani – lalithkumar 2017-04-19 13:13:22

+0

@lalithkumar'finfo_'函数建立在'PHP> = 5.3.0' – 2017-04-19 16:33:12

+1

哦,我的版本问题。谢谢你@Bhavesh Gangani – lalithkumar 2017-04-20 03:46:47