Big Binary Files Upload (PostgreSQL)
Великі об'єкти PostgreSQL
PostgreSQL пропонує структуру, відому як великі об'єкти, доступну через таблицю pg_largeobject
, призначену для зберігання великих типів даних, таких як зображення або документи у форматі PDF. Цей підхід має перевагу перед функцією COPY TO
, оскільки він дозволяє експортувати дані назад на файлову систему, забезпечуючи точну репліку оригінального файлу.
Для збереження повного файлу в цій таблиці, необхідно створити об'єкт в таблиці pg_largeobject
(ідентифікований LOID), а потім вставити фрагменти даних, кожен розміром 2 КБ, в цей об'єкт. Важливо, щоб ці фрагменти були точно розміром 2 КБ (з можливим винятком останнього фрагмента), щоб забезпечити правильну роботу функції експорту.
Для розділення вашого бінарного даних на фрагменти по 2 КБ можна виконати наступні команди:
Для кодування кожного файлу в Base64 або Hex можна використовувати наступні команди:
Важливо: Під час автоматизації цього процесу, переконайтеся, що відправляєте порції чіткого тексту по 2 КБ. Файли, закодовані у шістнадцяткову систему, потребують 4 КБ даних на порцію через подвоєння розміру, тоді як файли, закодовані у Base64, слідують формулі ceil(n / 3) * 4
.
Вміст великих об'єктів можна переглянути для налагодження за допомогою:
Використання lo_creat
та Base64
Для зберігання бінарних даних спочатку створюється LOID:
У ситуаціях, які вимагають точного контролю, таких як експлуатація сліпого SQL-ін'єкції, lo_create
вважається бажаним для вказання фіксованого LOID.
Частини даних можна вставити наступним чином:
Щоб експортувати та, можливо, видалити великий об'єкт після використання:
Використання lo_import
та Hex
Функцію lo_import
можна використовувати для створення та вказання LOID для великого об'єкта:
Після створення об'єкта дані вставляються на сторінку, забезпечуючи, що кожний фрагмент не перевищує 2 КБ:
Для завершення процесу дані експортуються, а великий об'єкт видаляється:
Обмеження
Зазначено, що великі об'єкти можуть мати ACL (списки керування доступом), що потенційно обмежує доступ навіть до об'єктів, створених вашим користувачем. Однак старі об'єкти з дозволами ACL можуть бути все ще доступні для виведення вмісту.
Last updated