如何在 Controller 中将 CSV 文件内容显示为数组?
How to Display CSV file content in Controller as an Array?
我正在尝试使用 Zend Framework 2 将 CSV 数据显示为数组或其他内容作为输出
我已经创建了“hello world”模块并且控制器调用工作正常。
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 来完成它。
您不应该将 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 );
您正在尝试打开 $this->file = new SplFileObject('csv/Foo.csv');
,因为您使用的是相对路径,执行时不会解析为您的控制器所在的文件夹(它可能会解析为 [yourprojectroot]/csv/Foo.csv
) .
如果您真的想要将此 csv 存储在 controller/csv
中,您应该使用类似的东西:
$this->file = new SplFileObject(dirname(__FILE__) . '/csv/Foo.csv');
但是,出于多种原因,将 csv 保存在那里是错误的。首先,您需要向您的网络服务器授予写权限才能在该目录中写入,并且您会从根本上搞乱您的 data/code 结构(数据和代码不应该放在一起,但很容易分离筒仓)。
更好的是,在您的项目目录中创建一个文件夹 "data" 和另一个文件夹 "csv",授予您的网络服务器在其中写入的权限 (chmod
|| chown
, other methods),然后执行以下操作:
$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;
}
我正在尝试使用 Zend Framework 2 将 CSV 数据显示为数组或其他内容作为输出
我已经创建了“hello world”模块并且控制器调用工作正常。
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 来完成它。
您不应该将 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 );
您正在尝试打开 $this->file = new SplFileObject('csv/Foo.csv');
,因为您使用的是相对路径,执行时不会解析为您的控制器所在的文件夹(它可能会解析为 [yourprojectroot]/csv/Foo.csv
) .
如果您真的想要将此 csv 存储在 controller/csv
中,您应该使用类似的东西:
$this->file = new SplFileObject(dirname(__FILE__) . '/csv/Foo.csv');
但是,出于多种原因,将 csv 保存在那里是错误的。首先,您需要向您的网络服务器授予写权限才能在该目录中写入,并且您会从根本上搞乱您的 data/code 结构(数据和代码不应该放在一起,但很容易分离筒仓)。
更好的是,在您的项目目录中创建一个文件夹 "data" 和另一个文件夹 "csv",授予您的网络服务器在其中写入的权限 (chmod
|| chown
, other methods),然后执行以下操作:
$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;
}