繁体   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