Рейтинг:1

Сжать файл с помощью ArchiveInterface без путей к файлам

флаг us

Я пытаюсь создать архив файлов журналов, которые можно загрузить в форме, создающей собственный модуль в Drupal 9. В форме пользователь может изменить формат архива, как показано на изображении: Скрин лог-формы

Здесь ниже моего кода:

загрузка частной функции ($ form, $ form_state) {
  $format = $form_state->getValue('format');
  $folder = $form_state->getValue('папки');

  $дата = новый DateTime();
  $date = $date->format("y_m_d_H_i_s");

  $logsDirectory = \Drupal::service('file_system')
    ->realpath($folder . "://logs/");
  //Получить все файлы в папке.
  $logs = glob($logsDirectory . "/*.log");

  $имя_архива = $дата. $формат;

  $archive_path = \Drupal::service('file_system')
    ->saveData('', 'temporary://' . $archiveName);
  $archive = \Drupal::service('plugin.manager.archiver')
    ->getInstance(['filepath' => $archive_path]);

  foreach ($ logs как $ log) {
    $архив->добавить($журнал);
  }

  $response = новый BinaryFileResponse($archive_path);
  $response->headers->set('Content-type', $this->getContentTypes($format));
  $response->headers->set('Content-Disposition', 'attachment;filename="' . $archive_path . '"');
  $form_state->setResponse($response);
}

Все идет нормально, удалось таким образом добиться кнопки, которая при нажатии скачивает архив со всеми лог-файлами внутри. Проблема в том, что внутри этого zip все файлы находятся внутри своего абсолютного пути, таким образом: Дерево файлов внутри zip

Это связано с тем, что в классе ArchiveInterface Добавлять метод принимает только один параметр, $file_path, и добавление второго параметра для указания имени файлов не поддерживается. Как я мог решить эту проблему, имея возможность добавлять в архив только файлы, а не все подпапки?

флаг cn
Я понял после публикации ответа, что пользователь выбирает формат, поэтому вам нужно больше, чем Zip. С Zip легко, с Tar не очень. Архиватор PHP не поддерживает то, что вы хотите, поэтому вам нужно его расширить (https://stackoverflow.com/questions/15831121/adding-files-to-a-tar-archive-in-php-with-other-filenames ). Дайте мне знать, если ответ вообще бесполезен, и я удалю, если да
Рейтинг:0
флаг cn

Zip-архиватор Drupal не поддерживает эту функциональность напрямую, но лежащий в основе PHP ZipАрхив он использует делает (см. ZipArchive::addFile()), и вы можете получить ссылку на этот объект из архиватора Drupal.

Например:

$zip_archive = $archive->getArchive();
foreach ($ logs как $ log) {
  $zip_archive->addFile($log, basename($log));
}

Имейте в виду, что это хорошо работает только для шарик который каждый раз возвращает уникальные имена файлов. Если структура изменится, и вы получите подпапки, содержащие файлы с конфликтующими именами, вам нужно будет обновить цикл, чтобы приспособиться, или есть риск, что некоторые файлы не будут включены.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.