Всем привет!

Если вы читаете этот пост, скорее всего, у вас возникли проблемы при попытке загрузить файлы (PDF) в виде строк base64, чтобы впоследствии сохранить их «физически» на жестком диске. Не беспокойтесь, это может быть проще, чем вы думаете, и я расскажу о вас в этой статье. 😉

На днях я потратил несколько часов, пытаясь понять, как это сделать правильно. Ни Google, ни Stackoverflow мне тогда не помогли, так как я какое-то время искал, но безуспешно нашел какое-либо рабочее решение! Итак, я надеюсь, что это может вам помочь.

Во-первых, немного контекста.

Моя команда и я создаем CRM одностраничного приложения (SPA), в котором есть функция, при которой сотрудники должны загружать файл PDF с помощью вызова ajax к RESTful API. Согласно требованиям, после получения файл PDF должен «физически» храниться на сервере вместе с другими документами (не в базе данных).

Был применен подход: преобразовать файл PDF в строку base64 и отправить ее вместе с дополнительными данными через метод POST. Таким образом, API будет отвечать за получение этой строки и реконструкцию файла для сохранения на диске.

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

Вот как мы это изначально закодировали:

(Преобразование файла PDF в строку base64 с помощью Javascript. Этот метод является частью более крупного компонента Vue.js.)

(Нерабочее решение для преобразования base64 в PDF с помощью PHP.)

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

Проблема заключалась в том, что при преобразовании файла PDF в строку base64 он получает дополнительный фрагмент данных в качестве префикса (data: application / pdf; base64,), который при преобразовании обратно в PDF просто повреждает файл.

Итак, как вы, возможно, уже догадались, решение заключалось в простом удалении заголовка base64 из строки перед ее преобразованием обратно в PDF следующим образом:

(Рабочее решение для преобразования строки base64 в файл PDF с помощью PHP.)

Как вы можете видеть из сути выше, чтобы заставить его работать, нам просто нужно было включить следующий условный блок в функцию, которую мы написали ранее:

// Detects if there is base64 encoding header in the string.
// If so, it needs to be removed prior to saving the content to a phisical file.
if (strpos($base64string, ',') !== false) {
    @list($encode, $base64string) = explode(',', $base64string);
}

И если префикс base64 найден, все, что нужно сделать, это удалить его из строки, прежде чем записывать ее обратно на жесткий диск в виде файла PDF! 🤘

Вот и все. Я надеюсь, что это поможет вам не бороться с такой простой проблемой, как я в течение нескольких часов, пока не понял это! 😉

Удачного кодирования! 🤘

p.s: Не стесняйтесь и хлопайте, если хотите (можно до 50)! 👏🏻😬 Хлопая в ладоши понравившимся историям, вы помогаете распространяться другим людям, а также предоставляете автору обратную связь, чтобы понять, была ли статья полезной или нет!