Drupal 8: Import image files using Migrate Source CSV module

One of the cool things Drupal offers is migration. You've probably had a situation where you had some data to migrate from a csv file to your Drupal site. With migrate module you can transfer all kinds of entities such as nodes, taxonomy, files and users from CSV, XML, and JSON files.

In Drupal 8 Migrate module comes with installation in core. In this tutorial I'll walk you through how to import some data from CSV to your website. We'll be importing nodes of content type "Article", which contain some image files.

Step I - Prepare required modules

First of all, we'll need to enable Migrate module (if it's still not) and install Migrate Source CSV module, which enables us to import data from CSV files. You can find it here.

Step II - Create a .csv file

We'll take these fields from the Article content type:

  • Title
  • Body
  • Image

Our article.csv file, will look like this:

ID,title,body,field_image
1,"Title 1","Some test text 1","picture1.jpg"
2,"Title 2","Some test text 2","picture2.jpg"
3,"Title 3","Some test text 3","picture3.jpg"
4,"Title 4","Some test text 4","picture4.jpg"

Step III - Create migration configuration .yml files

In order to understand better the following paragraph, I recommend you visit this page, and read that article first.

As we are also importing image files, we'll have to create two separate .ymlfiles, one for image files, and another for importing nodes.

article_image.yml

id: article_image
migration_tags:
  - CSV
migration_group: null
label: Image importer
source:
  constants:
    source_base_path: /var/www/your_project/sites/default/files/import/article #absolute path where your images are currently located
    uri_file: 'public://article/image' #location where your images will be stored
  plugin: csv
  track_changes: true
  path: '/var/www/your_project/sites/default/files/articles.csv' #absolute location where your csv files are located
  header_row_count: 1
  keys:
    - field_image

process:
  source_full_path:
    -
      plugin: concat
      delimiter: /
      source:
        - constants/source_base_path
        - field_image
    -
      plugin: urlencode
  uri_file:
    -
      plugin: concat
      delimiter: /
      source:
        - constants/uri_file
        - field_image
    -
      plugin: urlencode
  filename: field_image
  uri:
    plugin: file_copy
    source:
      - '@source_full_path'
      - '@uri_file'
destination:
  plugin: 'entity:file'
migration_dependencies:
  required: {  }
  optional: {  }

'public://' refers to the file's location in your project, and that it should be in the public files directory (this is your default files directory ).

Next, we need to create another .yml configuration file which will import all nodes with previously defined images.

articles.yml

id: articles_import
label: 'Articles import'
source:
  plugin: csv #here we define that we are using csv migrate plugin
  path: /var/www/your_project/sites/default/files/articles.csv #absolute location where your csv file is located
  delimiter: ','
  enclosure: '"'
  header_row_count: 1
  keys:
    - ID

process:
  type:
    plugin: default_value
    default_value: article #content type name we will create
  title: title #node fields
  body: body
  'field_image/target_id':
      plugin: migration
      migration: article_image #previously defined migration for uploading image files
      source: field_image
  uid:
    plugin: default_value
    default_value: 1 #uid of the user which will be defined as the author of the imported notes, can be excluded
 destination:
  plugin: 'entity:node' #here we define what entity type we are creating
migration_dependencies:
  optional:
    - article_image #this is optional, you do not need to insert this, but the name must be the same as the migration id for images

Step IV - Import config files for article images

Now we can import these configuration migrate files to our Drupal web site.

Go to: admin/config/development/configuration/single/import

Here you can now import those .yml files. Choose Migration as "Configuration type", and paste your configuration.

Remember: You need to import article_image.yml first in order to successfully import images with your articles.

Step V - Run migration for article image

Now we need to run migration files in order to create those migrations.

Open terminal, in your project's root folder.

You can run drush-ms (ms- refers to migrate-status) if you want to check if your article_image has been imported.

With drush-mi article_image you will create that migration. If everything is okay, you'll see a message like this:

Processed 4 items (4 created, 0 updated, 0 failed, 0 ignored) - done with 'article_image'

Step VI - Import config files for article nodes

Repeat step IV, but this time paste the configuration file articles.yml

Step VII - Run migration for article nodes

Again, you need to repeat a previous step, step V this time.

Run drush-ms to see if your articles_import migration is correctly imported.

Then go on and run this migration drush-mi articles_import.

If everything goes well, you should get this message:

Processed 4 items (4 created, 0 updated, 0 failed, 0 ignored) - done with 'articles_import'

Additional information

There are plenty of other migration commands, which you can find here.

Update migration with this command:

drush mi articles_import --update -y

You can find what other drush commands are enabled for migrations using the command drush help.

Lazar Padjan

back to top