Issue #2244555 by benjy, ultimike, mikeryan: Use copy() directly instead of file_unmanaged_copy().
parent
2461b7bcf3
commit
3149c4b514
|
@ -12,6 +12,7 @@ use Drupal\Core\Entity\EntityStorageInterface;
|
||||||
use Drupal\migrate\Entity\MigrationInterface;
|
use Drupal\migrate\Entity\MigrationInterface;
|
||||||
use Drupal\migrate\Plugin\MigratePluginManager;
|
use Drupal\migrate\Plugin\MigratePluginManager;
|
||||||
use Drupal\migrate\Row;
|
use Drupal\migrate\Row;
|
||||||
|
use Drupal\migrate\MigrateException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Every migration that uses this destination must have an optional
|
* Every migration that uses this destination must have an optional
|
||||||
|
@ -32,6 +33,7 @@ class EntityFile extends EntityContentBase {
|
||||||
'source_path_property' => 'filepath',
|
'source_path_property' => 'filepath',
|
||||||
'destination_path_property' => 'uri',
|
'destination_path_property' => 'uri',
|
||||||
'move' => FALSE,
|
'move' => FALSE,
|
||||||
|
'urlencode' => FALSE,
|
||||||
);
|
);
|
||||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_manager);
|
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_manager);
|
||||||
}
|
}
|
||||||
|
@ -50,14 +52,54 @@ class EntityFile extends EntityContentBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$dirname = drupal_dirname($destination);
|
$dirname = drupal_dirname($destination);
|
||||||
file_prepare_directory($dirname, FILE_CREATE_DIRECTORY);
|
if (!file_prepare_directory($dirname, FILE_CREATE_DIRECTORY)) {
|
||||||
|
throw new MigrateException(t('Could not create directory %dirname',
|
||||||
|
array('%dirname' => $dirname)));
|
||||||
|
}
|
||||||
if ($this->configuration['move']) {
|
if ($this->configuration['move']) {
|
||||||
file_unmanaged_move($source, $destination, $replace);
|
$copied = file_unmanaged_move($source, $destination, $replace);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
file_unmanaged_copy($source, $destination, $replace);
|
// Determine whether we can perform this operation based on overwrite rules.
|
||||||
|
$original_destination = $destination;
|
||||||
|
$destination = file_destination($destination, $replace);
|
||||||
|
if ($destination === FALSE) {
|
||||||
|
throw new MigrateException(t('File %file could not be copied because a file by that name already exists in the destination directory (%destination)', array('%file' => $source, '%destination' => $original_destination)));
|
||||||
|
}
|
||||||
|
$source = $this->urlencode($source);
|
||||||
|
$copied = copy($source, $destination);
|
||||||
}
|
}
|
||||||
return parent::import($row, $old_destination_id_values);
|
if ($copied) {
|
||||||
|
return parent::import($row, $old_destination_id_values);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new MigrateException(t('File %source could not be copied to %destination.', array('%source' => $source, '%destination' => $destination)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Urlencode all the components of a remote filename.
|
||||||
|
*
|
||||||
|
* @param string $filename
|
||||||
|
* The filename of the file to be urlencoded.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* The urlencoded filename.
|
||||||
|
*/
|
||||||
|
protected function urlencode($filename) {
|
||||||
|
// Only apply to a full URL
|
||||||
|
if ($this->configuration['urlencode'] && strpos($filename, '://')) {
|
||||||
|
$components = explode('/', $filename);
|
||||||
|
foreach ($components as $key => $component) {
|
||||||
|
$components[$key] = rawurlencode($component);
|
||||||
|
}
|
||||||
|
$filename = implode('/', $components);
|
||||||
|
// Actually, we don't want certain characters encoded
|
||||||
|
$filename = str_replace('%3A', ':', $filename);
|
||||||
|
$filename = str_replace('%3F', '?', $filename);
|
||||||
|
$filename = str_replace('%26', '&', $filename);
|
||||||
|
}
|
||||||
|
return $filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue