@weart

Как правильно определить mime_type файла в папке после распаковки zip?

Привет всем. Столкнулся с такой проблемой - не корректно определяется mime_type файлов, когда я читаю их из папки, куда распаковал zip.

Код для распаковки:

$zip = new ZipArchive;
if (false === $zip->open($path)) {
	return [];
}

wp_mkdir_p($tempDir);

$zip->extractTo($tempDir);
$zip->close();

$files = [];
$directoryIterator = new RecursiveDirectoryIterator($tempDir);
$iterator = new RecursiveIteratorIterator($directoryIterator);

foreach ($iterator as $file) {
	if ($file->isFile()) {
		$filePath = $file->getPathname();

		$files[] = [
			'file_path' => $filePath,
			'file_name' => $file->getFilename(),
			'mime_type' => mime_content_type($filePath),
			'size' => filesize($filePath),
		];
	}
}

error_log(print_r($files, true));


Массив одного из вложенных файлов на выходе:

(
	[file_path] => /Users/username/Sites/project-name/wp-content/uploads/files/2023/578333/file-name.cdw
	[file_name] => file-name.cdw
	[mime_type] => application/zip
	[size] => 132463
)


При этом, например, png определяется корректно. А cdw как application/zip вместо application/octet-stream. Правда, я в этом не до конца уверен, что application/octet-stream - правильно, но при загрузке этого же file-name.cdw через input type=file определяется как application/octet-stream.

Буду благодарен совету, в какую сторону копнуть.
  • Вопрос задан
  • 71 просмотр
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
mime_content_type определяет тип файла по сигнатуре, описанной в файле magic.mime.
Если файл начинается с символов PK, то он будет определён как application/zip.
P.S. Если точнее, то сигнатура "PK\x03\x04".
Ответ написан
Adamos
@Adamos
application/octet-stream - правильно

Это всего лишь означает "неизвестно что, какой-то файл". Для загрузки этого более чем достаточно, все заинтересованные механизмы просто видят, что это поток данных, с которым ничего делать не надо.
application/zip

Это означает "что-то, упакованное ZIP" (собственно, вам уже даже указали, как это определяется - по первым байтам "PK", характерным для этого формата). Под такое определение сейчас подходит куча форматов - например, большая часть офисных. Но с ними MIME-анализ идет глубже и определяет, что это ODT, например. А что такое CDW - ваш Линукс просто не в курсе, и ничего более вменяемого, чем "это что-то упакованное ZIP" он, естественно, сказать не может.

В целом, вы занимаетесь ерундой, не имеющей никакого практического смысла. Продолжайте набираться знаний - и подобные вопросы просто отпадут сами собой.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zkrvndm
@zkrvndm
Архитектор решений
Попробуй определить тип используя вот эту библиотеку:
https://github.com/RikudouSage/MimeTypeDetector
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы