簡體   English   中英

Zend Framework 2-如何在Controller中以數組形式顯示CSV文件內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM