diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index b369bcf714..3690a31ae9 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -11,6 +11,8 @@ Yii Framework 2 Change Log - Bug #17829: `yii\helpers\ArrayHelper::filter` now correctly filters data when passing a filter with more than 2 levels (rhertogh) - Enh #7622: Allow `yii\data\ArrayDataProvider` to control the sort flags for `sortModels` through `yii\data\Sort::sortFlags` property (askobara) - Bug #17863: `\yii\helpers\BaseInflector::slug()` doesn't work with an empty string as a replacement argument (haruatari) +- Bug #17875: Revert `move_uploaded_file()` function instead of `copy()` and `unlink()` for saving uploaded files when POST request (sup-ham) + 2.0.32 January 21, 2020 ----------------------- diff --git a/framework/web/UploadedFile.php b/framework/web/UploadedFile.php index 03f0a668c7..7a97b30c7b 100644 --- a/framework/web/UploadedFile.php +++ b/framework/web/UploadedFile.php @@ -178,10 +178,14 @@ class UploadedFile extends BaseObject if ($this->hasError) { return false; } - if (false === $this->copyTempFile(Yii::getAlias($file))) { - return false; + + $targetFile = Yii::getAlias($file); + if (is_resource($this->_tempResource)) { + $result = $this->copyTempFile($targetFile); + return $deleteTempFile ? @fclose($this->_tempResource) : (bool) $result; } - return !$deleteTempFile || $this->deleteTempFile(); + + return $deleteTempFile ? move_uploaded_file($this->tempName, $targetFile) : copy($this->tempName, $targetFile); } /** @@ -193,9 +197,6 @@ class UploadedFile extends BaseObject */ protected function copyTempFile($targetFile) { - if (!is_resource($this->_tempResource)) { - return $this->isUploadedFile($this->tempName) && copy($this->tempName, $targetFile); - } $target = fopen($targetFile, 'wb'); if ($target === false) { return false; @@ -207,32 +208,6 @@ class UploadedFile extends BaseObject return $result; } - /** - * Delete temporary file - * - * @return bool if file was deleted - * @since 2.0.32 - */ - protected function deleteTempFile() - { - if (is_resource($this->_tempResource)) { - return @fclose($this->_tempResource); - } - return $this->isUploadedFile($this->tempName) && @unlink($this->tempName); - } - - /** - * Check if file is uploaded file - * - * @param string $file path to the file to check - * @return bool - * @since 2.0.32 - */ - protected function isUploadedFile($file) - { - return is_uploaded_file($file); - } - /** * @return string original file base name */ diff --git a/tests/framework/web/UploadedFileTest.php b/tests/framework/web/UploadedFileTest.php index 6fe85ca37e..4702c5adb6 100644 --- a/tests/framework/web/UploadedFileTest.php +++ b/tests/framework/web/UploadedFileTest.php @@ -89,12 +89,11 @@ class UploadedFileTest extends TestCase public function testSaveAs() { - $tmpImage = UploadedFileMock::getInstance(new ModelStub(), 'temp_image'); + $tmpImage = UploadedFile::getInstance(new ModelStub(), 'temp_image'); $targetFile = '@runtime/test_saved_uploaded_file_' . time(); $this->assertEquals(true, $tmpImage->saveAs($targetFile, $deleteTempFile = false)); - $this->assertEquals(true, $tmpImage->saveAs($targetFile, $deleteTempFile = true)); - $this->assertEquals(false, $tmpImage->saveAs($targetFile)); // temp file should not exist + $this->markTestIncomplete("`$deleteTempFile` flag simply uses php's move_uploaded_file() method, so this not work in test"); @unlink($targetFile); } @@ -110,7 +109,11 @@ class UploadedFileTest extends TestCase $_FILES['ModelStub'] = $_FILES['Item']; // $_FILES[Item] here from testParse() above $tmpFile = UploadedFile::getInstance($model, 'file'); - $this->assertEquals(true, $tmpFile->saveAs($targetFile)); + $this->assertEquals($tmpFile->saveAs($targetFile, $deleteTempFile = false), true); + $this->assertEquals($tmpFile->saveAs($targetFile), true); + + $this->assertEquals($tmpFile->saveAs($targetFile), false); // has deleted before + @unlink($targetFile); } } diff --git a/tests/framework/web/mocks/UploadedFileMock.php b/tests/framework/web/mocks/UploadedFileMock.php deleted file mode 100644 index 9bebceee9d..0000000000 --- a/tests/framework/web/mocks/UploadedFileMock.php +++ /dev/null @@ -1,19 +0,0 @@ -