2016-12-30 47 views
0

我試圖使用Zend Framework 2Zend框架2 - 如何顯示CSV文件內容控制器的陣列

我創建的「Hello World」模塊顯示CSV數據數組或東西作爲輸出和控制器調用工作正常。

CSV File location is data/csv/Foo.csv

下面是我的位指示:

public function indexAction() 
{ 
    $filename = 'data/csv/Foo.csv'; 
    $useFirstRecordAsHeader = true; 
    $delimiter = ','; 
    $enclosure = '"'; 
    $escape = '\\'; 
    $this->file = new SplFileObject($filename); 
    $this->file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE); 

    $this->file->setCsvControl($delimiter, $enclosure, $escape); 

    $this->useFirstRecordAsHeader = $useFirstRecordAsHeader; 

    return $this; 

} 

但現在我得到的錯誤:

SplFileObject::__construct(csv/Foo.csv): failed to open stream: No such file or directory

我的csv文件是在同一文件夾controller/csv/Foo.csv

那麼如何讀取csv文件內容並顯示爲輸出數組或其他格式?我只想使用Zend Framework 2來完成它。

+0

請嘗試將csv/Foo.csv保留在公用文件夾內,然後重試。 – user3438016

回答

3

你試圖打開$this->file = new SplFileObject('csv/Foo.csv');,因爲你是使用相對路徑,執行時間不會解析到控制器所在的文件夾(它可能會解析爲[yourprojectroot]/csv/Foo.csv)。

如果你真的這個CSV存儲controller/csv,你應該使用類似:

$this->file = new SplFileObject(dirname(__FILE__) . '/csv/Foo.csv'); 

但是,保存該CSV有壞的原因有幾個。首先,您需要向Web服務器授予寫入權限,以便能夠在該目錄中編寫代碼,並且您將根本上搞亂了您的數據/代碼結構(數據和代碼不應該一起駐留,而是容易分開) )。

更好,創建一個文件夾「數據」,並在你的項目目錄的另一個文件夾「CSV」,給寫有(chmod || chown, other methods),並做一些你的Web服務器權限:

$file = 'data'. DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'Foo.csv' ; 
$this->file = new SplFileObject($file); 

除此之外,我不確定你回來的實際情況是否合理。嘗試類似:

public function indexAction() 
{ 
    $filename = 'data' . DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'Foo.csv';; 
    $this->file = new SplFileObject($filename); 
    $this->file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE); 

    $this->file->setCsvControl(',', '""', '\\'); 
    $this->useFirstRecordAsHeader = true; 

    $response = $this->getResponse(); 
    $headers = $response->getHeaders(); 
    $headers->addHeaderLine('Content-Type', 'text/csv'); 

    $contents = $this->file->fread($this->file->getSize()); 

    $response->setContent($contents); 
    return $response; 
} 
+0

感謝您的回答,我已經在數據目錄中輸入了csv文件,現在我猜測它是開放的,但是我得到的是空白輸出。沒有獲取數據。我更新了更新代碼的問題,請幫助我? –

+0

我需要打印才能獲取csv文件數據? –

+0

這將以原樣輸出CSV ......「以數組形式輸出」有點奇怪。你想完成什麼? – yivi

2

您不應該將您的csv目錄放在Controller目錄中,因爲它不是控制器。它違背了MVC體系結構。最好的做法是將數據放在根目錄下的data目錄中,與您的module目錄處於同一級別。

因此,假如你擁有它這個data目錄上,你可以簡單的寫:

$this->file = new SplFileObject('data/csv/Foo.csv'); 

或更高(便攜):

$filename = 'data'. DIRECTORY_SEPARATOR . 'csv' . DIRECTORY_SEPARATOR . 'Foo.csv' ; 
$this->file = new SplFileObject($filename);