function Download::transform

Same name and namespace in other branches
  1. 9 core/modules/migrate/src/Plugin/migrate/process/Download.php \Drupal\migrate\Plugin\migrate\process\Download::transform()
  2. 8.9.x core/modules/migrate/src/Plugin/migrate/process/Download.php \Drupal\migrate\Plugin\migrate\process\Download::transform()
  3. 11.x core/modules/migrate/src/Plugin/migrate/process/Download.php \Drupal\migrate\Plugin\migrate\process\Download::transform()

Overrides ProcessPluginBase::transform

File

core/modules/migrate/src/Plugin/migrate/process/Download.php, line 118

Class

Download
Downloads a file from a HTTP(S) remote location into the local file system.

Namespace

Drupal\migrate\Plugin\migrate\process

Code

public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
    // If we're stubbing a file entity, return a uri of NULL so it will get
    // stubbed by the general process.
    if ($row->isStub()) {
        return NULL;
    }
    [
        $source,
        $destination,
    ] = $value;
    // Modify the destination filename if necessary.
    $final_destination = $this->fileSystem
        ->getDestinationFilename($destination, $this->configuration['file_exists']);
    // Reuse if file exists.
    if (!$final_destination) {
        return $destination;
    }
    // Try opening the file first, to avoid calling prepareDirectory()
    // unnecessarily. We're suppressing fopen() errors because we want to try
    // to prepare the directory before we give up and fail.
    $destination_stream = @fopen($final_destination, 'w');
    if (!$destination_stream) {
        // If fopen didn't work, make sure there's a writable directory in place.
        $dir = $this->fileSystem
            ->dirname($final_destination);
        if (!$this->fileSystem
            ->prepareDirectory($dir, FileSystemInterface::CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS)) {
            throw new MigrateException("Could not create or write to directory '{$dir}'");
        }
        // Let's try that fopen again.
        $destination_stream = @fopen($final_destination, 'w');
        if (!$destination_stream) {
            throw new MigrateException("Could not write to file '{$final_destination}'");
        }
    }
    // Stream the request body directly to the final destination stream.
    $this->configuration['guzzle_options']['sink'] = $destination_stream;
    try {
        // Make the request. Guzzle throws an exception for anything but 200.
        $this->httpClient
            ->get($source, $this->configuration['guzzle_options']);
    } catch (\Exception $e) {
        throw new MigrateException("{$e->getMessage()} ({$source})");
    }
    if (is_resource($destination_stream)) {
        fclose($destination_stream);
    }
    return $final_destination;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.