Puncte:1

Comprimați fișierul cu ArchiveInterface fără căi pentru fișiere

drapel us

Încerc să creez o arhivă de fișiere jurnal care să poată fi descărcate într-un formular care face un modul personalizat în Drupal 9. În formular, utilizatorul poate schimba formatul arhivei, conform imaginii: Ecranul formularului de jurnal

Iată mai jos codul meu:

descărcare funcție privată ($form, $form_state) {
  $format = $form_state->getValue('format');
  $folder = $form_state->getValue('folders');

  $date = nou DataTime();
  $data = $data->format("y_m_d_H_i_s");

  $logsDirectory = \Drupal::service('sistem_fișier')
    ->realpath($folder . "://logs/");
  //Preluați toate fișierele din folder.
  $logs = glob($logsDirectory . "/*.log");

  $archiveName = $data . $format;

  $cale_arhivă = \Drupal::service('sistem_fișier')
    ->saveData('', 'temporary://' . $archiveName);
  $arhivă = \Drupal::service('plugin.manager.archiver')
    ->getInstance(['filepath' => $archive_path]);

  foreach ($log ca $log) {
    $arhiva->adăugare($log);
  }

  $răspuns = nou BinaryFileResponse($archive_path);
  $response->headers->set('Content-type', $this->getContentTypes($format));
  $response->headers->set('Content-Disposition', 'attachment;filename="' . $archive_path . '"');
  $form_state->setResponse($response);
}

Totul merge bine, am reușit să realizez un buton în acest fel care, apăsat, descarcă arhiva cu toate fișierele jurnal din interior. Problema este că în interiorul acestui zip toate fișierele se află în calea lor absolută, în acest fel: Arborele fișierelor din interiorul zipului

Acest lucru se datorează faptului că în clasa ArchiveInterface adăuga metoda acceptă doar un parametru, $cale_fișierși nu este acceptată adăugarea unui al doilea parametru pentru a specifica numele fișierelor. Cum as putea sa rezolv aceasta problema, reusind sa adaug in arhiva doar fisierele si nu toate subfolderele?

drapel cn
Mi-am dat seama după ce am postat un răspuns că utilizatorul alege formatul, așa că aveți nevoie de mai mult decât Zip. Cel Zip este usor, din pacate cel Tar nu atat. Arhivatorul PHP nu acceptă ceea ce doriți, așa că trebuie să îl extindeți (https://stackoverflow.com/questions/15831121/adding-files-to-a-tar-archive-in-php-with-different-filenames ). Anunță-mă dacă răspunsul nu este util deloc și voi șterge dacă da
Puncte:0
drapel cn

Arhivatorul Zip al Drupal nu acceptă această funcționalitate în mod direct, ci PHP-ul de bază ZipArchive folosește does (vezi ZipArchive::addFile()), și puteți obține o referință la acel obiect din arhivatorul Drupal.

De exemplu:

$arhiva_zip = $arhiva->getArchive();
foreach ($log ca $log) {
  $zip_archive->addFile($log, basename($log));
}

Rețineți că acest lucru funcționează bine doar pentru a glob care aduce înapoi nume unice de fișiere de fiecare dată. Dacă structura se modifică și ajungeți la subfoldere care conțin fișiere cu ciocniri de nume, va trebui să actualizați bucla pentru a se adapta sau riscați să nu fie incluse unele fișiere.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.