Score:1

บีบอัดไฟล์ด้วย ArchiveInterface โดยไม่มีเส้นทางไฟล์

ธง us

ฉันกำลังพยายามสร้างที่เก็บถาวรของไฟล์บันทึกเพื่อให้สามารถดาวน์โหลดได้ในรูปแบบที่สร้างโมดูลที่กำหนดเองใน Drupal 9 ในแบบฟอร์ม ผู้ใช้สามารถเปลี่ยนรูปแบบของไฟล์เก็บถาวร ตามภาพ: หน้าจอของแบบฟอร์มบันทึก

ด้านล่างรหัสของฉัน:

ดาวน์โหลดฟังก์ชั่นส่วนตัว ($form, $form_state) {
  $format = $form_state->getValue('รูปแบบ');
  $folder = $form_state->getValue('โฟลเดอร์');

  $date = วันที่และเวลาใหม่ ();
  $date = $date->format("y_m_d_H_i_s");

  $logsDirectory = \Drupal::service('file_system')
    ->realpath($folder . "://logs/");
  //ดึงไฟล์ทั้งหมดในโฟลเดอร์
  $logs = glob($logsDirectory . "/*.log");

  $archiveName = $วันที่ รูปแบบ $;

  $archive_path = \Drupal::service('file_system')
    ->saveData('', 'ชั่วคราว://' . $archiveName);
  $archive = \Drupal::service('plugin.manager.archiver')
    ->getInstance(['filepath' => $archive_path]);

  foreach ($ บันทึกเป็น $log) {
    $archive->add($log);
  }

  $response = ใหม่ BinaryFileResponse($archive_path);
  $response->headers->set('ประเภทเนื้อหา', $this->getContentTypes($format));
  $response->headers->set('Content-Disposition', 'attachment;filename="' . $archive_path . '"');
  $form_state->setResponse($ตอบกลับ);
}

ทุกอย่างเป็นไปได้ด้วยดีฉันจัดการเพื่อให้ได้ปุ่มด้วยวิธีนี้ซึ่งเมื่อกดแล้วจะดาวน์โหลดไฟล์เก็บถาวรที่มีไฟล์บันทึกทั้งหมดอยู่ข้างใน ปัญหาคือภายในไฟล์ zip นี้ไฟล์ทั้งหมดอยู่ในเส้นทางที่แน่นอนด้วยวิธีนี้: ต้นไม้ของไฟล์ภายใน zip

นี่เป็นเพราะใน ArchiveInterface Class เพิ่ม วิธีการยอมรับเพียงหนึ่งพารามิเตอร์ $file_pathและไม่สนับสนุนการเพิ่มพารามิเตอร์ตัวที่สองเพื่อระบุชื่อไฟล์ ฉันจะแก้ปัญหานี้ได้อย่างไร โดยการเพิ่มภายในไฟล์เก็บถาวรเฉพาะไฟล์และไม่ใช่โฟลเดอร์ย่อยทั้งหมด

cn flag
ฉันรู้หลังจากโพสต์คำตอบว่าผู้ใช้เลือกรูปแบบ ดังนั้นคุณต้องการมากกว่า Zip Zip one นั้นง่าย แต่น่าเสียดายที่ Tar นั้นไม่มาก ตัวเก็บถาวร PHP ไม่รองรับสิ่งที่คุณต้องการ ดังนั้นคุณต้องขยาย ). แจ้งให้เราทราบหากคำตอบไม่มีประโยชน์เลย และฉันจะลบหากเป็นเช่นนั้น
Score:0
ธง cn

Zip archiver ของ Drupal ไม่รองรับฟังก์ชันนั้นโดยตรง แต่รองรับ PHP พื้นฐาน ZipArchive มันใช้ไม่ (ดู ZipArchive::addFile()) และคุณสามารถรับการอ้างอิงถึงวัตถุนั้นได้จาก Drupal archiver

ตัวอย่างเช่น:

$zip_archive = $เก็บถาวร->getArchive();
foreach ($ บันทึกเป็น $log) {
  $zip_archive->addFile($log, basename($log));
}

โปรดทราบว่าวิธีนี้ใช้ได้ดีกับ a ลูกโลก ที่นำชื่อไฟล์ที่ไม่ซ้ำกันกลับมาทุกครั้ง หากโครงสร้างเปลี่ยนไปและคุณลงเอยด้วยโฟลเดอร์ย่อยที่มีไฟล์ที่มีชื่อขัดแย้งกัน คุณจะต้องอัปเดตลูปเพื่อรองรับ หรือเสี่ยงที่ไฟล์บางไฟล์จะไม่ถูกรวม

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา