From 2372f0eb23f06b2bbb13738dbe3834c6ce34d68e Mon Sep 17 00:00:00 2001 From: Nicolas Da Mutten Date: Tue, 25 Sep 2018 16:55:14 +0200 Subject: [PATCH] Adds missing Content-Type header to CSV-export (#3787) Credit to @cleverer --- modules/backend/models/ExportModel.php | 7 +-- tests/unit/backend/models/ExportModelTest.php | 45 ++++++++++++++++++- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/modules/backend/models/ExportModel.php b/modules/backend/models/ExportModel.php index 96a6a1749..e899d944f 100644 --- a/modules/backend/models/ExportModel.php +++ b/modules/backend/models/ExportModel.php @@ -62,12 +62,7 @@ abstract class ExportModel extends Model throw new ApplicationException(Lang::get('backend::lang.import_export.file_not_found_error')); } - $headers = Response::download($csvPath, $outputName)->headers->all(); - $result = Response::make(File::get($csvPath), 200, $headers); - - @unlink($csvPath); - - return $result; + return Response::download($csvPath, $outputName)->deleteFileAfterSend(true); } /** diff --git a/tests/unit/backend/models/ExportModelTest.php b/tests/unit/backend/models/ExportModelTest.php index 7ad3f4e12..38d73cfb7 100644 --- a/tests/unit/backend/models/ExportModelTest.php +++ b/tests/unit/backend/models/ExportModelTest.php @@ -8,7 +8,18 @@ class ExampleExportModel extends ExportModel { public function exportData($columns, $sessionKey = null) { - return []; + return [ + [ + 'foo' => 'bar', + 'bar' => 'foo', + 'foobar' => 'Hello World!', + ], + [ + 'foo' => 'bar2', + 'bar' => 'foo2', + 'foobar' => 'Hello World2!', + ], + ]; } } @@ -48,4 +59,36 @@ class ExportModelTest extends TestCase $this->assertEquals('art direction-roman empire-sci\-fi', $result); } + public function testDownload() + { + $model = new ExampleExportModel; + + $csvName = $model->export(['foo' => 'title', 'bar' => 'title2'], []); + + $response = $model->download($csvName); + + $request = new Illuminate\Http\Request(); + + $response->prepare($request); + + $this->assertTrue($response->headers->has('Content-Type'), "Response is missing the Content-Type header!"); + $this->assertTrue($response->headers->contains('Content-Type', 'text/plain'), "Content-Type is not \"text/plain\"!"); + + ob_start(); + $response->send(); + $output = ob_get_clean(); + + $utf8BOM = chr(239).chr(187).chr(191); + + $this->assertEquals($utf8BOM."title,title2\nbar,foo\nbar2,foo2\n", $output, "CSV is not right!"); + + $filePath = temp_path($csvName); + + $fileGotDeleted = !is_file($filePath); + + $this->assertTrue($fileGotDeleted, "Export-CSV doesn't get deleted."); + if (!$fileGotDeleted) { + unlink($filePath); + } + } }