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