Как корректно вывести файлы из БД в файловую систему?

Вывод файлов из БД в файловую систему

Уважаемые господа, добрый день!

Возникла проблема с выводом файлов из БД PostgreSQL в файловую систему на боевом сервере. Есть код, который отрабатывает локально на моем компе, на котором установлен MAMP. Смысл этого кода - выбрать данные из БД поместить данные в директорию файловой системы, затем отправить эти файлы на удаленный сервер (отправляю библиотекой php cURL). На боевом серваке с другой ОС данные манипуляции не работают, работа кода останавливается на выборке файлов из БД и размещении их в файловой системе.

ОС локальной системы: MacOS 10.14.1 Версия MAMP: 4.5 Веб-сервер: Apache/2.2.34 (Unix) Версия PHP: 7.2.1

ОС боевой системы: Debian GNU/Linux 9.4 (stretch) Веб-сервер: Apache/2.4.25 (Debian) Версия PHP: 7.0.30-0+deb9u1

При выводе файлов на боевом серваке из БД возникают следующие ошибки:

Некорректно отправляется содержимое файла - файл в файловую систему приходит битый, размер файла либо нулевой, либо 1КБ.
Название файла передается неполностью, на каком-то символе режется. (ПР: «prezentatsiya_1128329_435», «prezentatsiya_1128329_л). От типа символа - число или буква не зависит. Название файлов приходит из БД уже переведенное в транслит. (Делал перевод из русской литерации в латиницу средствами PHP, но это не помогало, поэтому сделали транслитерацию в БД)

Я предположил, что какая-то проблема с локалью на Debian 9 и осуществил следующие шаги:
1. export LANGUAGE=ru_RU.UTF-8
2. export LANG=ru_RU.UTF-8
3. export LC_ALL=ru_RU.UTF-8
4. locale-gen ru_RU.UTF-8
5. apt-get install --reinstall locales
6. dpkg-reconfigure locales

Они работают на время терминальной сессии, на MacOS стоял английский язык ОС , на время терминальной сессии язык переключался на русский, но при переподключении к серверу через терминал настройки локали сбрасывались; команда dpkg-reconfigure locales не влияла на отображение интерфейса командной строки. Смена языка на MacOS на русский помогла в отображении русского языка в терминале, но не более того.

После применения данных настроек команда locale показывает следующие результаты:

LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=


Я предполагаю, что, всё-таки дело в настройках локали, поэтому не прилагаю рабочий код, если будет необходимо, добавлю.

Искал информацию по настройке локали на Debian взял инструкцию в данном источнике, пункт Standard, выполнял следующие шаги:

1. Редактировал файл /etc/default/locale, добавив строку LANG=ru_RU.UTF-8
2. Перезагружал сервер.
3. Не помогло
4. Смотрел файл /etc/locale.gen
5. После применения команды dpkg-reconfigure locales раскомментированы следующие строки "en_US.UTF-8 UTF-8", "ru_RU.UTF-8 UTF-8"
6. Не помогло

Правил файл php.ini - увеличил размер отправляемых файлов:

upload_max_filesize = 30M

Отправка файлов разрешена, значение директивы:

file_uploads = On

Значение настройки post_max_size:

post_max_size = 8M

Подскажите, с чем может быть связана данная проблема? Где собака зарыта? Не хватает опыта, чтобы самостоятельно определить в каком направлении двигаться для решения данной задачи.
  • Вопрос задан
  • 225 просмотров
Пригласить эксперта
Ответы на вопрос 2
2ord
@2ord
Некорректно отправляется содержимое файла - файл в файловую систему приходит битый, размер файла либо нулевой, либо 1КБ.
Стоит проверить что файлы действительно хранятся в СУБД целыми, проверив их размер через клиент PostgreSQL.
BYTEA хранит октеты данных, включая \0, который в случае строк интерпретируется как окончание строки. То есть данные должны храниться в Питоне в структуре, соответствующей байтовому массиву.

Название файла передается неполностью
Затем убедиться, что PHP программа использует переменную, соответствующую по размеру для хранения имени файла.
Ответ написан
sollerij
@sollerij Автор вопроса
Сейчас навешиваю try/catch на все части кода. Возможно это как-то поможет в обнаружении ошибок.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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