diff --git a/core/modules/file/file.module b/core/modules/file/file.module index 1b55fe0..0f7665a 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -151,25 +151,21 @@ function file_copy(FileInterface $source, $destination = NULL, $replace = FILE_E } if ($uri = file_unmanaged_copy($source->getFileUri(), $destination, $replace)) { - $file = $source->createDuplicate(); - $file->setFileUri($uri); - $file->setFilename(drupal_basename($uri)); - // If we are replacing an existing file re-use its database record. - // @todo Do not create a new entity in order to update it. See - // https://www.drupal.org/node/2241865. - if ($replace == FILE_EXISTS_REPLACE) { - $existing_files = entity_load_multiple_by_properties('file', ['uri' => $uri]); - if (count($existing_files)) { - $existing = reset($existing_files); - $file->fid = $existing->id(); - $file->setOriginalId($existing->id()); - $file->setFilename($existing->getFilename()); - } + // If we are replacing an existing file, load it. + if ($replace == FILE_EXISTS_REPLACE && $existing_files = entity_load_multiple_by_properties('file', ['uri' => $uri])) { + $file = reset($existing_files); } - // If we are renaming around an existing file (rather than a directory), - // use its basename for the filename. - elseif ($replace == FILE_EXISTS_RENAME && is_file($destination)) { - $file->setFilename(drupal_basename($destination)); + else { + $file = $source->createDuplicate(); + $file->setFileUri($uri); + // If we are renaming around an existing file (rather than a directory), + // use its basename for the filename. + if ($replace == FILE_EXISTS_RENAME && is_file($destination)) { + $file->setFilename(drupal_basename($destination)); + } + else { + $file->setFilename(drupal_basename($uri)); + } } $file->save(); @@ -509,28 +505,23 @@ function file_save_data($data, $destination = NULL, $replace = FILE_EXISTS_RENAM } if ($uri = file_unmanaged_save_data($data, $destination, $replace)) { - // Create a file entity. - $file = File::create([ - 'uri' => $uri, - 'uid' => $user->id(), - 'status' => FILE_STATUS_PERMANENT, - ]); - // If we are replacing an existing file re-use its database record. - // @todo Do not create a new entity in order to update it. See - // https://www.drupal.org/node/2241865. - if ($replace == FILE_EXISTS_REPLACE) { - $existing_files = entity_load_multiple_by_properties('file', ['uri' => $uri]); - if (count($existing_files)) { - $existing = reset($existing_files); - $file->fid = $existing->id(); - $file->setOriginalId($existing->id()); - $file->setFilename($existing->getFilename()); - } + // If we are replacing an existing file, load it. + if ($replace == FILE_EXISTS_REPLACE && $existing_files = entity_load_multiple_by_properties('file', ['uri' => $uri])) { + $file = reset($existing_files); + $file->setPermanent(); } - // If we are renaming around an existing file (rather than a directory), - // use its basename for the filename. - elseif ($replace == FILE_EXISTS_RENAME && is_file($destination)) { - $file->setFilename(drupal_basename($destination)); + else { + // Create a file entity. + $file = File::create([ + 'uri' => $uri, + 'uid' => $user->id(), + 'status' => FILE_STATUS_PERMANENT, + ]); + // If we are renaming around an existing file (rather than a directory), + // use its basename for the filename. + if ($replace == FILE_EXISTS_RENAME && is_file($destination)) { + $file->setFilename(drupal_basename($destination)); + } } $file->save(); diff --git a/core/modules/file/tests/file_test/file_test.module b/core/modules/file/tests/file_test/file_test.module index 0baa0cb..7bc1dff 100644 --- a/core/modules/file/tests/file_test/file_test.module +++ b/core/modules/file/tests/file_test/file_test.module @@ -349,3 +349,10 @@ function file_test_entity_type_alter(&$entity_types) { ->setAccessClass('Drupal\file_test\FileTestAccessControlHandler'); } } + +/** + * Implements hook_ENTITY_TYPE_create() for file entities. + */ +function file_test_file_create() { + \Drupal::state()->set('file_test.hook_entity_create', TRUE); +} diff --git a/core/modules/file/tests/src/Kernel/SaveDataTest.php b/core/modules/file/tests/src/Kernel/SaveDataTest.php index 747c7b1..323f0d8 100644 --- a/core/modules/file/tests/src/Kernel/SaveDataTest.php +++ b/core/modules/file/tests/src/Kernel/SaveDataTest.php @@ -93,9 +93,13 @@ public function testExistingReplace() { $existing = $this->createFile(); $contents = $this->randomMachineName(8); + \Drupal::state()->set('file_test.hook_entity_create', FALSE); $result = file_save_data($contents, $existing->getFileUri(), FILE_EXISTS_REPLACE); $this->assertTrue($result, 'File saved successfully.'); + $entity_create_hook_fired = \Drupal::state()->get('file_test.hook_entity_create'); + $this->assertFalse($entity_create_hook_fired, 'Entity create hook was not invoked for a file replace operation.'); + $this->assertEqual('public', file_uri_scheme($result->getFileUri()), "File was placed in Drupal's files directory."); $this->assertEqual($result->getFilename(), $existing->getFilename(), 'Filename was set to the basename of the existing file, rather than preserving the original name.'); $this->assertEqual($contents, file_get_contents($result->getFileUri()), 'Contents of the file are correct.');