2012-01-31 62 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