When migrating content from a non-Drupal site such as MODx or from an export utility such as Tumblr Utils, you will need a mechanism to import a directory of files into Drupal as managed files.
This module provides a source plugin that allows you to recurse through an entire directory in a migration:
source:
plugin: directory
path: /path/to/files/to/migrate
If your directory contains mixed content, you can use pattern
to specify a file name pattern, including the extension:
source:
plugin: directory
path: /path/to/files/to/migrate
pattern: '/.*\.(png|jpg|bmp|gif)/i'
The source plugin provides several fields:
path
The path to the file, without the filename.
relative_path
The path to the file, relative to the path
argument given in the source
definition. This is used for replicating the same directory structure when migrating the file.
absolute_path
The absolute path to the file, resolving any symlinks.
filename
The file name.
basename
Same as filename
, but also resolves some special cases.
extension
The file extension, if any.
Install like any other Drupal module. Either:
Download the archive from Drupal.org, and unpack in your modules/
directory.
Or, use composer to install:
composer require drupal/migrate_directory
Create a new file migration using the migration template in the file module from core.
This example will migrate the files, flattening out the directory structure from the source:
id: my_image_migration
label: 'My Image Migration'
source:
plugin: directory
path: /path/to/files/to/migrate
constants:
dest_prefix: 'public://migrate/files/'
process:
_source_file_path:
-
plugin: urlencode
source: path
_dest_file_path:
-
plugin: concat
source:
- constants/dest_prefix
- basename
-
plugin: urlencode
uri:
plugin: file_copy
source:
- '@_source_file_path'
- '@_dest_file_path'
status:
-
plugin: default_value
default_value: 1
_timestamp:
-
plugin: callback
callable: time
created: '@_timestamp'
changed: '@_timestamp'
uid:
-
plugin: default_value
default_value: 0
destination:
plugin: 'entity:file'
migration_dependencies: { }
Alternatively, you could choose to preserve it by using the relative_path
source property, instead of basename
:
id: my_image_migration
label: 'My Image Migration'
source:
plugin: directory
path: /path/to/files/to/migrate
constants:
dest_prefix: 'public://migrate/images/'
process:
_source_file_path:
-
plugin: urlencode
source: path
_dest_file_path:
-
plugin: concat
source:
- constants/dest_prefix
- relative_path
-
plugin: urlencode
uri:
plugin: file_copy
source:
- '@_source_file_path'
- '@_dest_file_path'
status:
-
plugin: default_value
default_value: 1
_timestamp:
-
plugin: callback
callable: time
created: '@_timestamp'
changed: '@_timestamp'
uid:
-
plugin: default_value
default_value: 0
destination:
plugin: 'entity:file'
migration_dependencies: { }