2016-06-14 40 views
0

我目前正在使用Zend Framework的PHP項目。我在控制器中創建一個沒有任何問題的CSV文件,但是希望用戶能夠通過單擊視圖中的按鈕來下載文件。從PHP項目的tmp文件夾下載CSV

在我.phtml我:

<a class="btn" href="<?php echo $this->download;?>" download>Export to CSV</a> 

$this->download在控制器被設置:

$view["download"] = $this->_createCSV($bqc_jobs, $startDate, $endDate, $processor_id, $defaultTime); 

_createCSV函數創建CSV並將其存儲在該網站所使用的臨時目錄。然後它返回文件路徑。

private function _createCSV($jobs, $start, $end, $user=null, $minutes){ 
    $format = "Ymd_His"; 
    if(!$start && !$user){ 
     $start = date($format, strtoTime("-" . $minutes . " minutes")); 
    } 

    if(!$end){ 
     $end = \DateTime::createFromFormat($format, date($format))->format($format); 
    } 
    $directory = Config::$tempDir; 
    $fileName = $directory . "/" . ($user ? $user . "_" : "") . ($start ? $start . "_" : "") . $end . "_report.csv"; 

    $file = fopen($fileName, 'w'); 
    foreach ($jobs as $job){ 
     fputcsv($file, $job); 
    } 

    fclose($file); 

    return $fileName; 
} 

單擊按鈕時,瀏覽器會嘗試下載文件,但由於找不到文件而導致錯誤。這是有道理的,因爲瀏覽器不應該訪問臨時文件夾,但我不完全確定如何解決這個問題。

+2

在Laravel我最近通過Streaming一個文件達到了同樣的效果 - 我做了一個快速的谷歌,遇到了這可能有助於(不熟悉zend)http://www.sasaprolic.com/2013/02/sending-stream- response-with-zend.html – Djave

+0

@Djave看起來很有前途,謝謝 –

回答

1

如果您無法看到該文件夾​​,由於UNIX文件權限,那麼你唯一的選擇將是:

  1. 變化tmp的文件夾中的文件權限,以便您的Web服務器可以讀/寫使用chmod/chown(我假設它是一個linux系統?)
  2. 使用具有足夠權限的其他文件夾
  3. 不要將文件存儲在磁盤上 - 將其存儲在數據庫中(而不是最佳)。

一旦你確定你的文件權限是爲了和該文件可以被Apache,it appears that you should be able閱讀使用PHP的readfile功能實際傳輸文件返回給瀏覽器:

<?php 
$file = '/tmp/monkey.gif'; 

if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    readfile($file); 
    exit; 
} 
?> 
+1

我不認爲這是文件權限問題,而是'tmp'目錄不是隨時在網站上託管。 –

+0

那麼您正在尋找的是一種打開臨時文件並提供它的方式,但它實際上並不屬於Web服務器配置文件中網站範圍的一部分?你使用什麼網絡服務器? –

+0

是的,非常。我有權訪問服務器端的文件,但我希望它可以在客戶端上下載,所以我需要弄清楚如何將它傳遞給客戶端。我正在使用Apache –