diff -u b/core/modules/file/file.module b/core/modules/file/file.module --- b/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -170,9 +170,6 @@ try { $uri = $file_system->copy($source->getFileUri(), $destination, $replace); - $file = $source->createDuplicate(); - $file->setFileUri($uri); - $file->setFilename($file_system->basename($uri)); // If we are replacing an existing file, load it. if ($replace == FileSystemInterface::EXISTS_REPLACE && $existing_files = entity_load_multiple_by_properties('file', ['uri' => $uri])) { $file = reset($existing_files); @@ -186,7 +183,7 @@ $file->setFilename($file_system->basename($destination)); } else { - $file->setFilename(drupal_basename($uri)); + $file->setFilename(\Drupal::service('file_system')->basename($uri)); } } diff -u b/core/modules/file/tests/src/Kernel/SaveDataTest.php b/core/modules/file/tests/src/Kernel/SaveDataTest.php --- b/core/modules/file/tests/src/Kernel/SaveDataTest.php +++ b/core/modules/file/tests/src/Kernel/SaveDataTest.php @@ -2,6 +2,7 @@ namespace Drupal\Tests\file\Kernel; +use Drupal\Core\File\FileSystemInterface; use Drupal\file\Entity\File; /** @@ -88,4 +89,29 @@ /** + * Test file_save_data() when replacing an non-existing file. + */ + public function testNonExistingReplace() { + $contents = $this->randomMachineName(8); + + \Drupal::state()->set('file_test.hook_entity_create', FALSE); + $result = file_save_data($contents, NULL, FileSystemInterface::EXISTS_REPLACE); + $this->assertTrue($result, 'File saved successfully.'); + + $entity_create_hook_fired = \Drupal::state()->get('file_test.hook_entity_create'); + $this->assertTrue($entity_create_hook_fired, 'Entity create hook was invoked for a file replace operation.'); + + $this->assertSame('public', file_uri_scheme($result->getFileUri()), "File was placed in Drupal's files directory."); + $this->assertSame($contents, file_get_contents($result->getFileUri()), 'Contents of the file are correct.'); + $this->assertSame($result->getMimeType(), 'application/octet-stream', 'A MIME type was set.'); + $this->assertTrue($result->isPermanent(), "The file's status was set to permanent."); + + // Check that the correct hooks were called. + $this->assertFileHooksCalled(['insert']); + + // Verify that what was returned is what's in the database. + $this->assertFileUnchanged($result, File::load($result->id())); + } + + /** * Test file_save_data() when replacing an existing file. */