如何使用 symfony 4 下载 csv 文件?

How to download a csv file with symfony 4?

我正在尝试使用 symfony 4 下载 csv 文件。 我阅读了文档。 我知道我必须规范化我的对象并在 csv 中编码。

我的控制器:

/**
* @Route("/export.csv", name="exportcsv", options={"expose"=true}, methods={"GET","POST"})
*
**/
public function exportcsv(){
   $sessionuser = $this->session->get('user');
   $user = $this->finduser($sessionuser);
   $datas = $this->getDoctrine()->getRepository(Object::class)-> findBy(['Event'=> $user->getEvent()]);
   $encoders = [new CsvEncoder()];
   $normalizers = array(new ObjectNormalizer());
   $serializer = new Serializer($normalizers, $encoders);
   $csvContent = $serializer->serialize($datas, 'csv'); 
   return new Response($csvContent);
}

当我尝试走这条路时,我可以在我的浏览器中看到我的所有数据都以适合 csv 的良好格式显示。 例如,我有:

名称列 1、名称列 2、名称列 3

数据 1 列 1、数据 1 列 2、数据 1 列 3

Data2Column1、Data2Column2、Data2Column3

我读到它是创建 csv 文件的好格式。

我想知道我要生成csv文件。

如果有人有解决方案,那就太棒了。我用了一个星期,完全迷路了。

谢谢。

编辑:顺便说一句,我尝试了这个解决方案 How to force download a .csv file in Symfony 2, using Response object? 它下载了一个文件,但它是空的。

我会选择这样的东西:

但要使其正常工作,您需要将内容放入一个临时的 csv 文件中。

希望这对您有所帮助,注意安全!

我找到了解决方案。

事实上,我有两个问题: 首先是我应该以正确的格式设置 headers 。 第二个是 Visual studio 代码,他们没有阅读代码的 2 个注释部分之间的代码。

有关信息,这是我的新代码。如果它可以帮助任何人 ;)

 /**
 * @Route("/export.csv", name="exportcsv", options={"expose"=true}, methods={"GET","POST"})
 *
 **/
public function exportcsv(){
  $sessionuser = $this->session->get('user');
  $user = $this->finduser($sessionuser);
  //search all the datas of type Object
  $datas = $this->getDoctrine()->getRepository(Object::class)-> findBy(['Event'=> $user->getEvent()]);
  // normalization and encoding of $datas
  $encoders = [new CsvEncoder()];
  $normalizers = array(new ObjectNormalizer());
  $serializer = new Serializer($normalizers, $encoders);
  $csvContent = $serializer->serialize($datas, 'csv');

  $response = new Response($csvContent);
  $response->headers->set('Content-Encoding', 'UTF-8');
  $response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
  $response->headers->set('Content-Disposition', 'attachment; filename=sample.csv');
  return $response;
}

感谢大家的帮助。