При импорте изображений возникает задача транслитерации. Картинки, например, могут содержать буквы национальной кодировки (кириллицы) и/или иметь несовместимые с файловой системой сервера символы.
Drupal (начиная с 8.2) объявляет специальный интерфейс, который формализует эту задачу:
сore/lib/Drupal/Component/Transliteration/TransliterationInterface.php.
Но нужных нам реализаций в ядре нет, их можно найти в сторонних модулях.
Установим модуль transliterate_filenames.
Он предоставляет имплементацию интерфейса в виде сервиса, а также добавляет свою функцию — sanitizeFilename(). Если требуется выполнить транслитерацию имени файла, то реализуется это так:
1 2 3 4 5 6 7 8 9 10 11 12 |
// исходные данные - файловый путь // и директорий для сохранения файла $filepath = '...'; $directory = 'public://my-dir'; // транслитерация имени файла $translit = \Drupal::service('transliterate_filenames.sanitize_name'); $newName = $translit->sanitizeFilename( pathinfo($filepath, PATHINFO_FILENAME) ) . '.' . pathinfo($filepath, PATHINFO_EXTENSION); |
Теперь можно создавать файл:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$fs = \Drupal::service('file_system'); $fs->prepareDirectory( $directory, FileSystemInterface:: CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS); $fs->copy($filepath, $directory . '/' . $newName, FileSystemInterface::EXISTS_REPLACE); $file = \Drupal\file\Entity\File::create([ 'filename' => basename($newName), 'uri' => $directory . '/' . $newName, 'status' => 1, 'uid' => \Drupal::currentUser()->id(), ]); $file->save(); |
И, наконец, создадим медиа объект на основе сохраненного файла.
В разных версиях друпала может отличаться имя медиа-поля, куда сохраняется file ID. В 10ке — это field_media_image, в более ранних версиях может быть просто field_image.
1 2 3 4 5 6 7 8 9 10 11 12 |
$media = \Drupal\media\Entity\Media::create([ 'bundle' => 'image', 'uid' => \Drupal::currentUser()->id(), 'langcode' => \Drupal::languageManager()->getDefaultLanguage()->getId(), 'status' => 1, 'field_media_image' => [ 'target_id' => $file->id(), 'alt' => $name, 'title' => $name, ], ]); $media->save(); |