PHP поставляется с различными методами определения типа файла, но возможно ли определить тип данных, когда рассматриваемый файл существует только в виде двоичного строкового представления, а не в качестве фактического файла на диске?
Причиной этого является то, что я выполняю некоторые работы по обслуживанию CMS, когда предыдущий разработчик, будучи немного глупым, решил сохранить данные изображений в системе в виде BLOB-объектов базы данных. Мой текущий проект - выгрузка больших двоичных объектов в файлы и сохранение пути к файлам в базе данных вместо больших двоичных объектов.
Как я уже сказал, мой предшественник был немного обманут, и он не только сохранял все эти данные в виде больших двоичных объектов, но и нигде не сохранял тип данных.
Утилита миграции, которую я написал для этого проекта, сохраняет файл на диск без расширения, пытается определить тип файла с помощью exif_imagetype () и, если ему удается определить тип файла, переименовывает файл с правильным расширение.
Однако классы, использующие данные изображений, также нуждаются в обновлении, чтобы они могли продолжать работать с путями и файлами на диске вместо BLOB.
Методы, которые создают и обновляют изображения, ожидают двоичные строки (для BLOB в базе данных), и в идеальном мире я бы лучше переписал эти методы, чтобы использовать is_uploaded_file, move_uploaded_file и т. Д. Однако в классе нет доказательств нигде прямое манипулирование массивом $ _FILES, чтобы файловые данные, очевидно, поступали извне класса, но учитывая, насколько сложен код (и нет комментариев, чтобы помочь), я не могу его найти.
В качестве временного решения, пока я, наконец, не отследю фактический код управления загрузкой файлов, я планирую манипулировать данными файла в виде строк в классе, как это делается в настоящее время, но сохраняя строки в файлы, а не в базу данных. Это должно минимизировать влияние на другие части кодовой базы, которые полагаются на этот класс.
Я мог бы просто сделать то, что делает скрипт миграции, и переименовать файл после сохранения, а затем идентифицировать его, но это может оказаться проблематичным в случае, когда там уже есть файл. Я предпочел бы знать, что тип данных, прежде чем я записываю данные на диск.