- Добавлен метод getRelatedDocs() для получения документов из связанных сущностей (контакты, контрагенты) - Добавлен метод downloadS3File() для скачивания файлов из S3 во временную папку - Добавлен метод cleanupTempFiles() для очистки временных файлов - Исправлен getPaths() для корректной обработки S3 файлов (всегда запрашивает s3_bucket/s3_key из БД) - Исправлен getArchive() для проектов: собирает документы из основной записи и связанных сущностей - Исправлен путь к vendor/autoload.php (поиск по нескольким путям) - Исправлено имя временного файла (короткое имя вместо полного пути для избежания 'File name too long') Результат: архив успешно создается с документами из проекта и связанных сущностей (25 документов для проекта 396447)
6.8 KiB
6.8 KiB
Лог сессии: Исправление архивации проектов с S3 файлами
Дата: 2025-11-21
Проблема
Архивация проектов не работала после миграции на S3:
- Возвращался ответ
{"success":true,"result":"Nothing to archive"} - Затем появились ошибки
"_ is missing!"для всех документов - После исправления появились ошибки
"S3 file download failed"для всех файлов
Причины проблем
1. Неправильная обработка S3 файлов
- Метод
getPaths()пытался обработать S3 файлы как локальные Vtiger_Record_Modelне всегда содержит поляs3_bucket,s3_key,filelocationtype- Нужно было явно запрашивать эти данные из БД
2. Отсутствие поддержки связанных документов
- Архив включал только документы самого проекта
- Не включались документы из связанных сущностей (контакты, контрагенты)
- Аналогично функционалу отправки исковых писем через pochta-sud.ru
3. Ошибки при скачивании из S3
- Неправильный путь к
vendor/autoload.php(относительный путь не работал) - Слишком длинное имя временного файла (
File name too long) - Использовался
basename($fileName)где$fileNameсодержал URL-encoded полный путь
Решение
1. Добавлен метод getRelatedDocs($projectId)
- Получает документы из связанных сущностей проекта:
- Контакт (
linktoaccountscontacts) - Контрагенты (
cf_1994,cf_2274,cf_2276)
- Контакт (
- Возвращает массив документов с полями:
notesid,title,filename,filelocationtype,s3_bucket,s3_key
2. Добавлен метод downloadS3File($s3Bucket, $s3Key, $fileName)
- Скачивает файлы из S3 во временную папку
- Использует AWS SDK для работы с S3
- Сохраняет пути временных файлов для последующей очистки
- Обрабатывает ошибки с подробным логированием
3. Добавлен метод cleanupTempFiles()
- Очищает все временные файлы после создания архива
- Вызывается в
finallyблоке для гарантированной очистки
4. Исправлен метод getPaths($docs)
- Поддержка как
Vtiger_Record_Modelобъектов, так и массивов изgetRelatedDocs - ВСЕГДА запрашивает
s3_bucket,s3_key,filelocationtypeиз БД для Record Models - Правильно определяет S3 файлы (
filelocationtype == 'E' && !empty($s3Bucket) && !empty($s3Key)) - Для S3 файлов вызывает
downloadS3File() - Для локальных файлов использует
getFileDetails()
5. Исправлен метод getArchive($id)
- Для проектов собирает документы из основной записи и связанных сущностей
- Предотвращает дубликаты документов
- Вызывает
getPaths()с объединенным списком документов - Добавлено подробное логирование для отладки
- Обработка ошибок с возвратом детальной информации
6. Исправления в downloadS3File()
- Поиск
vendor/autoload.phpпо нескольким путям (относительный и абсолютный) - Использование короткого имени временного файла (только расширение, без полного пути)
- Подробное логирование в
/tmp/s3_download_debug.log
Измененные файлы
modules/Vtiger/services/Base.php
- Добавлен метод
getRelatedDocs($projectId)- получение документов из связанных сущностей - Добавлен метод
downloadS3File($s3Bucket, $s3Key, $fileName)- скачивание из S3 - Добавлен метод
cleanupTempFiles()- очистка временных файлов - Добавлено свойство
private static $tempFiles = []- хранение путей временных файлов - Исправлен метод
getPaths($docs)- поддержка S3 и связанных документов - Исправлен метод
getArchive($id)- сбор документов из связанных сущностей для проектов
Тестирование
Тестовый скрипт test_s3_download.php
- Создан для прямого тестирования
downloadS3File() - Успешно скачал файл из S3 (9.5 МБ)
- Подтвердил работоспособность исправлений
Результат
- ✅ Архив успешно создается с 25 документами для проекта 396447
- ✅ Включаются документы из проекта и связанных сущностей
- ✅ S3 файлы корректно скачиваются и добавляются в архив
- ✅ Временные файлы автоматически очищаются
Технические детали
S3 конфигурация
- Используется конфиг из
crm_extensions/file_storage/config.php - Endpoint:
https://s3.twcstorage.ru - Bucket и Key берутся из полей
vtiger_notes.s3_bucketиvtiger_notes.s3_key
Временные файлы
- Сохраняются в
sys_get_temp_dir()(обычно/tmp) - Имена:
s3_{uniqid}.{extension} - Автоматически удаляются после создания архива
Логирование
- Основные логи:
error_log()(системный лог PHP) - Отладочные логи:
/tmp/s3_download_debug.log(временный, удален после исправления) - Ошибки:
/tmp/s3_download_errors.log(временный, удален после исправления)
Коммит
Изменения закоммичены в git с описанием исправлений.