Определить тип файла строки - PullRequest
3 голосов
/ 04 ноября 2011

PHP поставляется с различными методами определения типа файла, но возможно ли определить тип данных, когда рассматриваемый файл существует только в виде двоичного строкового представления, а не в качестве фактического файла на диске?

Причиной этого является то, что я выполняю некоторые работы по обслуживанию CMS, когда предыдущий разработчик, будучи немного глупым, решил сохранить данные изображений в системе в виде BLOB-объектов базы данных. Мой текущий проект - выгрузка больших двоичных объектов в файлы и сохранение пути к файлам в базе данных вместо больших двоичных объектов.

Как я уже сказал, мой предшественник был немного обманут, и он не только сохранял все эти данные в виде больших двоичных объектов, но и нигде не сохранял тип данных.

Утилита миграции, которую я написал для этого проекта, сохраняет файл на диск без расширения, пытается определить тип файла с помощью exif_imagetype () и, если ему удается определить тип файла, переименовывает файл с правильным расширение.

Однако классы, использующие данные изображений, также нуждаются в обновлении, чтобы они могли продолжать работать с путями и файлами на диске вместо BLOB.

Методы, которые создают и обновляют изображения, ожидают двоичные строки (для BLOB в базе данных), и в идеальном мире я бы лучше переписал эти методы, чтобы использовать is_uploaded_file, move_uploaded_file и т. Д. Однако в классе нет доказательств нигде прямое манипулирование массивом $ _FILES, чтобы файловые данные, очевидно, поступали извне класса, но учитывая, насколько сложен код (и нет комментариев, чтобы помочь), я не могу его найти.

В качестве временного решения, пока я, наконец, не отследю фактический код управления загрузкой файлов, я планирую манипулировать данными файла в виде строк в классе, как это делается в настоящее время, но сохраняя строки в файлы, а не в базу данных. Это должно минимизировать влияние на другие части кодовой базы, которые полагаются на этот класс.

Я мог бы просто сделать то, что делает скрипт миграции, и переименовать файл после сохранения, а затем идентифицировать его, но это может оказаться проблематичным в случае, когда там уже есть файл. Я предпочел бы знать, что тип данных, прежде чем я записываю данные на диск.

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

finfo_buffer() - это то, что вы хотите.Вы можете передать ей свою строку, и она скажет вам, какой тип файла основан на вашем файле mime.magic.

Дополнительная информация здесь: http://us3.php.net/manual/en/function.finfo-buffer.php

1 голос
/ 04 ноября 2011

Вы можете использовать finfo_buffer . Он работает со строками, а не с файлами на диске.

0 голосов
/ 04 ноября 2011

Если вы работаете только с изображениями, тип файла можно найти в первых нескольких байтах строки - файлы PNG начинаются с 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A, GIF - с GIF, а JPEG содержит FFD8 взаголовок.Я написал скрипт для разбора заголовков этих 3-х типов, но так как у меня его здесь нет, я обновлю свой ответ, как только получу его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...