From 552ca1d90b966ad9ef26b32ec1a62834e6df77b8 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Tue, 14 Nov 2023 10:56:30 +0100 Subject: [PATCH] Make exporters provide a MIME type (#319) This allows us to set a correct `Content-Type` header in the `BinaryFileResponse`. If we don't do this, the user is required to have automatic MIME type detection available, such as provided by `symfony/mime`. Co-authored-by: Jelle Raaijmakers --- src/Exporter/Csv/CsvExporter.php | 5 +++++ src/Exporter/DataTableExporterInterface.php | 5 +++++ src/Exporter/DataTableExporterManager.php | 1 + src/Exporter/Excel/ExcelExporter.php | 5 +++++ tests/Fixtures/AppBundle/DataTable/Exporter/TxtExporter.php | 5 +++++ 5 files changed, 21 insertions(+) diff --git a/src/Exporter/Csv/CsvExporter.php b/src/Exporter/Csv/CsvExporter.php index 4315c25f..828e89a7 100644 --- a/src/Exporter/Csv/CsvExporter.php +++ b/src/Exporter/Csv/CsvExporter.php @@ -40,6 +40,11 @@ public function export(array $columnNames, \Iterator $data): \SplFileInfo return new \SplFileInfo($filePath); } + public function getMimeType(): string + { + return 'text/csv'; + } + public function getName(): string { return 'csv'; diff --git a/src/Exporter/DataTableExporterInterface.php b/src/Exporter/DataTableExporterInterface.php index 287afc01..34823a83 100644 --- a/src/Exporter/DataTableExporterInterface.php +++ b/src/Exporter/DataTableExporterInterface.php @@ -26,6 +26,11 @@ interface DataTableExporterInterface */ public function export(array $columnNames, \Iterator $data): \SplFileInfo; + /** + * The MIME type of the exported file. + */ + public function getMimeType(): string; + /** * A unique name to identify the exporter. */ diff --git a/src/Exporter/DataTableExporterManager.php b/src/Exporter/DataTableExporterManager.php index a896193d..0836632f 100644 --- a/src/Exporter/DataTableExporterManager.php +++ b/src/Exporter/DataTableExporterManager.php @@ -69,6 +69,7 @@ public function getResponse(): Response $response = new BinaryFileResponse($file); $response->deleteFileAfterSend(true); + $response->headers->set('Content-Type', $exporter->getMimeType()); $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $response->getFile()->getFilename()); $this->dataTable->getEventDispatcher()->dispatch(new DataTableExporterResponseEvent($response), DataTableExporterEvents::PRE_RESPONSE); diff --git a/src/Exporter/Excel/ExcelExporter.php b/src/Exporter/Excel/ExcelExporter.php index 2b83d9ed..0e0c8737 100644 --- a/src/Exporter/Excel/ExcelExporter.php +++ b/src/Exporter/Excel/ExcelExporter.php @@ -67,6 +67,11 @@ private function autoSizeColumnWidth(Worksheet $sheet): void } } + public function getMimeType(): string + { + return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; + } + public function getName(): string { return 'excel'; diff --git a/tests/Fixtures/AppBundle/DataTable/Exporter/TxtExporter.php b/tests/Fixtures/AppBundle/DataTable/Exporter/TxtExporter.php index 077d5796..93b42136 100644 --- a/tests/Fixtures/AppBundle/DataTable/Exporter/TxtExporter.php +++ b/tests/Fixtures/AppBundle/DataTable/Exporter/TxtExporter.php @@ -35,6 +35,11 @@ public function export(array $columnNames, \Iterator $data): \SplFileInfo return new \SplFileInfo($filename); } + public function getMimeType(): string + { + return 'text/plain'; + } + public function getName(): string { return 'txt';