From ec9275d8d3347c67a68d61c832554e92440d22f9 Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Thu, 11 Jan 2024 16:15:08 +0900 Subject: [PATCH] Add mime type get to the Check\File class --- 4dev/tests/Check/CoreLibsCheckFileTest.php | 62 ++++++++++++++++++++-- www/admin/class_test.file.php | 1 + www/lib/CoreLibs/Check/File.php | 17 ++++++ 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/4dev/tests/Check/CoreLibsCheckFileTest.php b/4dev/tests/Check/CoreLibsCheckFileTest.php index c94ad943..56141aa2 100644 --- a/4dev/tests/Check/CoreLibsCheckFileTest.php +++ b/4dev/tests/Check/CoreLibsCheckFileTest.php @@ -28,10 +28,10 @@ final class CoreLibsCheckFileTest extends TestCase public function filesList(): array { return [ - ['filename.txt', 'txt', 5], - ['filename.csv', 'csv', 15], - ['filename.tsv', 'tsv', 0], - ['file_does_not_exits', '', -1], + ['filename.txt', 'txt', 5, 'text/plain'], + ['filename.csv', 'csv', 15, 'text/csv'], + ['filename.tsv', 'tsv', 0, 'text/plain'], + ['file_does_not_exits', '', -1, ''], ]; } @@ -63,6 +63,15 @@ final class CoreLibsCheckFileTest extends TestCase return $list; } + public function mimeTypeProvider(): array + { + $list = []; + foreach ($this->filesList() as $row) { + $list[$row[0] . ' must be mime type ' . $row[3]] = [$row[0], $row[3]]; + } + return $list; + } + /** * Tests if file extension matches * @@ -115,6 +124,51 @@ final class CoreLibsCheckFileTest extends TestCase unlink($this->base_folder . $input); } } + + /** + * Undocumented function + * + * @covers ::getMimeType + * @dataProvider mimeTypeProvider + * @testdox getMimeType $input must be mime type $expected [$_dataName] + * + * @param string $input + * @param string $expected + * @return void + */ + public function testGetMimeType(string $input, string $expected): void + { + if (!empty($expected)) { + $file = $this->base_folder . $input; + $fp = fopen($file, 'w'); + switch ($expected) { + case 'text/csv': + for ($i = 1; $i <= 10; $i++) { + fwrite($fp, '"This is row","' . $expected . '",' . $i . PHP_EOL); + } + break; + case 'text/tsv': + for ($i = 1; $i <= 10; $i++) { + fwrite($fp, "\"This is row\"\t\"" . $expected . "\"\t\"" . $i . PHP_EOL); + } + break; + case 'text/plain': + fwrite($fp, 'This is mime type: ' . $expected . PHP_EOL); + break; + } + fclose($fp); + } else { + $this->expectException(\UnexpectedValueException::class); + } + $this->assertEquals( + $expected, + \CoreLibs\Check\File::getMimeType($this->base_folder . $input) + ); + // unlink file + if (is_file($this->base_folder . $input)) { + unlink($this->base_folder . $input); + } + } } // __END__ diff --git a/www/admin/class_test.file.php b/www/admin/class_test.file.php index f2c26c17..0844c4bf 100644 --- a/www/admin/class_test.file.php +++ b/www/admin/class_test.file.php @@ -37,6 +37,7 @@ $file = '/some/path/to/some/file.txt'; print "GETFILENAMEENDING: $file: " . File::getFilenameEnding($file) . "
"; $file = getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php'; print "GETLINESFROMFILE: $file: " . File::getLinesFromFile($file) . "
"; +print "MIMEINFO: $file: " . File::getMimeType($file) . "
"; print ""; diff --git a/www/lib/CoreLibs/Check/File.php b/www/lib/CoreLibs/Check/File.php index 36b4bfc8..c8bdc531 100644 --- a/www/lib/CoreLibs/Check/File.php +++ b/www/lib/CoreLibs/Check/File.php @@ -51,6 +51,23 @@ class File // return lines in file return $lines; } + + /** + * get the mime type of a file via finfo + * if file not found, throws exception + * else returns '' for any other finfo read problem + * + * @param string $read_file File to read, relative or absolute path + * @return string + */ + public static function getMimeType(string $read_file): string + { + $finfo = new \finfo(FILEINFO_MIME_TYPE); + if (!is_file($read_file)) { + throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file); + } + return $finfo->file($read_file) ?: ''; + } } // __END__