[英]Zend Framework 2 - How to Display CSV file content in Controller as an Array
我正在嘗試使用Zend Framework 2將csv數據顯示為數組或某些內容作為輸出
我已經創建了“ hello world”模塊,並且控制器調用工作正常。
CSV檔案位置為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):無法打開流:沒有這樣的文件或目錄
我的csv文件位於同一文件夾controller/csv/Foo.csv
那么如何讀取csv文件內容並顯示為輸出數組或任何其他格式? 我只想使用Zend Framework 2來做。
您正在嘗試打開$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服務器授予寫權限,以便能夠在該目錄中進行寫操作,並且從根本上搞砸了您的數據/代碼結構(數據和代碼不應放置在一起,而應位於易於分離的筒倉中)。
更好的是,在項目目錄中創建一個文件夾“ data”和另一個文件夾“ csv”,向您的網絡服務器授予在此處寫入的權限( chmod
|| chown
,其他方法 ),然后執行以下操作:
$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;
}
您不應將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 );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.