Điểm:1

Nén tệp bằng ArchiveInterface không có đường dẫn tệp

lá cờ us

Tôi đang cố gắng tạo một kho lưu trữ tệp nhật ký có thể tải xuống ở dạng tạo mô-đun tùy chỉnh trong Drupal 9. Trong biểu mẫu, người dùng có thể thay đổi định dạng của kho lưu trữ, theo hình ảnh: Màn hình biểu mẫu nhật ký

Ở đây bên dưới mã của tôi:

tải xuống chức năng riêng ($form, $form_state) {
  $format = $form_state->getValue('format');
  $folder = $form_state->getValue('folders');

  $date = new DateTime();
  $date = $date->format("y_m_d_H_i_s");

  $logsDirectory = \Drupal::service('file_system')
    ->realpath($folder . "://logs/");
  // Lấy tất cả các tệp trong thư mục.
  $logs = toàn cầu($logsDirectory ."/*.log");

  $archiveName = $date . định dạng $;

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

  foreach ($log dưới dạng $log) {
    $archive->add($log);
  }

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

Mọi thứ đều ổn, tôi đã cố gắng đạt được một nút theo cách này, khi được nhấn, sẽ tải xuống kho lưu trữ với tất cả các tệp nhật ký bên trong. Vấn đề là bên trong zip này, tất cả các tệp đều nằm trong đường dẫn tuyệt đối của chúng, theo cách này: Cây tập tin bên trong zip

Điều này là do trong Lớp ArchiveInterface, cộng phương pháp chỉ chấp nhận một tham số, $file_pathvà không hỗ trợ thêm tham số thứ hai để chỉ định tên của tệp. Làm cách nào tôi có thể giải quyết vấn đề này, chỉ có thể thêm vào bên trong kho lưu trữ các tệp chứ không phải tất cả các thư mục con?

lá cờ cn
Tôi nhận ra sau khi đăng câu trả lời rằng người dùng chọn định dạng, vì vậy bạn cần nhiều hơn Zip. Cái Zip rất dễ, tiếc là cái Tar không nhiều lắm. Trình lưu trữ PHP không hỗ trợ những gì bạn muốn nên bạn cần mở rộng nó (https://stackoverflow.com/questions/15831121/adding-files-to-a-tar-archive-in-php-with-different-filenames ). Hãy cho tôi biết nếu câu trả lời không hữu ích chút nào và tôi sẽ xóa nếu có
Điểm:0
lá cờ cn

Trình lưu trữ Zip của Drupal không hỗ trợ trực tiếp chức năng đó, nhưng PHP bên dưới Lưu trữ Zip nó sử dụng không (xem ZipArchive::addFile()) và bạn có thể lấy tham chiếu đến đối tượng đó từ trình lưu trữ Drupal.

Ví dụ:

$zip_archive = $archive->getArchive();
foreach ($log dưới dạng $log) {
  $zip_archive->addFile($log, basename($log));
}

Hãy nhớ rằng điều này chỉ hoạt động tốt cho một quả địa cầu mang lại tên tệp duy nhất mỗi lần. Nếu cấu trúc thay đổi và bạn kết thúc với các thư mục con chứa các tệp có xung đột tên, bạn sẽ cần cập nhật vòng lặp để phù hợp hoặc có nguy cơ một số tệp không được đưa vào.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.