From f914b168d54f6e30335f678807fca5a2c9f0882a Mon Sep 17 00:00:00 2001 From: codisart Date: Fri, 4 Dec 2015 17:05:16 +0100 Subject: [PATCH 1/3] [BUG] This commit allows the upload of same filenames in input type file For example, Ios Safari gives the name image.jpg for pcitures from the gallery In the present situation, the first files would be overriden by the last file with the same name. And the getValue of these inputs will return the same fileName with no really mean to identify it. With the use of the unique name from PHP $_FILES in the name column of the $_files array of the Http adapter, the files will be unique and easily identifiable. --- library/Zend/File/Transfer/Adapter/Http.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/library/Zend/File/Transfer/Adapter/Http.php b/library/Zend/File/Transfer/Adapter/Http.php index 2265e4ff1a..c92df1b658 100644 --- a/library/Zend/File/Transfer/Adapter/Http.php +++ b/library/Zend/File/Transfer/Adapter/Http.php @@ -446,6 +446,7 @@ protected function _prepareFiles() $this->_files[$form]['name'] = $form; foreach($this->_files[$form]['multifiles'] as $key => $value) { + $this->_files[$value]['name'] = basename($this->_files[$value]['tmp_name']) . '_' . $this->_files[$value]['name']; $this->_files[$value]['options'] = $this->_options; $this->_files[$value]['validated'] = false; $this->_files[$value]['received'] = false; @@ -464,6 +465,7 @@ protected function _prepareFiles() } } else { $this->_files[$form] = $content; + $this->_files[$form]['name'] = basename($this->_files[$form]['tmp_name']) . '_' . $this->_files[$form]['name']; $this->_files[$form]['options'] = $this->_options; $this->_files[$form]['validated'] = false; $this->_files[$form]['received'] = false; From 2bb299a9af7b4caef2c28bc48833e296f5e00e25 Mon Sep 17 00:00:00 2001 From: codisart Date: Thu, 10 Dec 2015 10:29:12 +0100 Subject: [PATCH 2/3] [BUG] Fix the unit tests and add a new one for the same filename case. --- tests/Zend/File/Transfer/Adapter/HttpTest.php | 66 +++++++++++++++---- .../File/Transfer/Adapter/_files/file2.txt | 1 - .../Adapter/_files/{file1.txt => php0zgByO} | 0 .../File/Transfer/Adapter/_files/phpDlIxkx | 1 + .../File/Transfer/Adapter/_files/phpOOwDDc | 1 + .../File/Transfer/Adapter/_files/phpZqRDQF | 1 + .../File/Transfer/Adapter/_files/phpqBXGTg | 1 + .../File/Transfer/Adapter/_files/test.txt | 2 +- 8 files changed, 58 insertions(+), 15 deletions(-) delete mode 100644 tests/Zend/File/Transfer/Adapter/_files/file2.txt rename tests/Zend/File/Transfer/Adapter/_files/{file1.txt => php0zgByO} (100%) create mode 100644 tests/Zend/File/Transfer/Adapter/_files/phpDlIxkx create mode 100644 tests/Zend/File/Transfer/Adapter/_files/phpOOwDDc create mode 100644 tests/Zend/File/Transfer/Adapter/_files/phpZqRDQF create mode 100644 tests/Zend/File/Transfer/Adapter/_files/phpqBXGTg diff --git a/tests/Zend/File/Transfer/Adapter/HttpTest.php b/tests/Zend/File/Transfer/Adapter/HttpTest.php index bb457b4397..00ec10ac2d 100644 --- a/tests/Zend/File/Transfer/Adapter/HttpTest.php +++ b/tests/Zend/File/Transfer/Adapter/HttpTest.php @@ -66,11 +66,13 @@ public function setUp() { $_FILES = array( 'txt' => array( - 'name' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'test.txt', + 'name' => 'test.txt', 'type' => 'plain/text', 'size' => 8, - 'tmp_name' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'test.txt', - 'error' => 0)); + 'tmp_name' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'php0zgByO', + 'error' => 0 + ) + ); $this->adapter = new Zend_File_Transfer_Adapter_HttpTest_MockAdapter(); } @@ -87,7 +89,7 @@ public function tearDown() public function testEmptyAdapter() { $files = $this->adapter->getFileName(); - $this->assertContains('test.txt', $files); + $this->assertContains('php0zgByO_test.txt', $files); } public function testAutoSetUploadValidator() @@ -194,19 +196,57 @@ public function testReceiveWithRenameFilterButWithoutDirectory() $this->assertTrue($this->adapter->receive()); } + public function testMultiFiles() { $_FILES = array( 'txt' => array( - 'name' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'test.txt', + 'name' => 'test.txt', + 'type' => 'plain/text', + 'size' => 8, + 'tmp_name' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'php0zgByO', + 'error' => 0 + ), + 'exe' => array( + 'name' => array( + 0 => 'file1.exe', + 1 => 'file2.exe'), + 'type' => array( + 0 => 'plain/text', + 1 => 'plain/text'), + 'size' => array( + 0 => 8, + 1 => 8), + 'tmp_name' => array( + 0 => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'phpqBXGTg', + 1 => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'phpZqRDQF'), + 'error' => array( + 0 => 0, + 1 => 0))); + $adapter = new Zend_File_Transfer_Adapter_HttpTest_MockAdapter(); + $adapter->setOptions(array('ignoreNoFile' => true)); + $this->assertTrue($adapter->receive('exe')); + $this->assertEquals( + array('exe_0_' => 'phpqBXGTg_file1.exe', + 'exe_1_' => 'phpZqRDQF_file2.exe'), + $adapter->getFileName('exe', false)); + } + + + public function testMultiFilesSameName() + { + $_FILES = array( + 'txt' => array( + 'name' => 'test.txt', 'type' => 'plain/text', 'size' => 8, - 'tmp_name' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'test.txt', - 'error' => 0), + 'tmp_name' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'php0zgByO', + 'error' => 0 + ), 'exe' => array( 'name' => array( - 0 => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'file1.txt', - 1 => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'file2.txt'), + 0 => 'file.exe', + 1 => 'file.exe'), 'type' => array( 0 => 'plain/text', 1 => 'plain/text'), @@ -214,8 +254,8 @@ public function testMultiFiles() 0 => 8, 1 => 8), 'tmp_name' => array( - 0 => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'file1.txt', - 1 => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'file2.txt'), + 0 => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'phpOOwDDc', + 1 => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'phpDlIxkx'), 'error' => array( 0 => 0, 1 => 0))); @@ -223,8 +263,8 @@ public function testMultiFiles() $adapter->setOptions(array('ignoreNoFile' => true)); $this->assertTrue($adapter->receive('exe')); $this->assertEquals( - array('exe_0_' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'file1.txt', - 'exe_1_' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'file2.txt'), + array('exe_0_' => 'phpOOwDDc_file.exe', + 'exe_1_' => 'phpDlIxkx_file.exe'), $adapter->getFileName('exe', false)); } diff --git a/tests/Zend/File/Transfer/Adapter/_files/file2.txt b/tests/Zend/File/Transfer/Adapter/_files/file2.txt deleted file mode 100644 index e7cbb71a0d..0000000000 --- a/tests/Zend/File/Transfer/Adapter/_files/file2.txt +++ /dev/null @@ -1 +0,0 @@ -testfile \ No newline at end of file diff --git a/tests/Zend/File/Transfer/Adapter/_files/file1.txt b/tests/Zend/File/Transfer/Adapter/_files/php0zgByO similarity index 100% rename from tests/Zend/File/Transfer/Adapter/_files/file1.txt rename to tests/Zend/File/Transfer/Adapter/_files/php0zgByO diff --git a/tests/Zend/File/Transfer/Adapter/_files/phpDlIxkx b/tests/Zend/File/Transfer/Adapter/_files/phpDlIxkx new file mode 100644 index 0000000000..26918572ec --- /dev/null +++ b/tests/Zend/File/Transfer/Adapter/_files/phpDlIxkx @@ -0,0 +1 @@ +testfile diff --git a/tests/Zend/File/Transfer/Adapter/_files/phpOOwDDc b/tests/Zend/File/Transfer/Adapter/_files/phpOOwDDc new file mode 100644 index 0000000000..26918572ec --- /dev/null +++ b/tests/Zend/File/Transfer/Adapter/_files/phpOOwDDc @@ -0,0 +1 @@ +testfile diff --git a/tests/Zend/File/Transfer/Adapter/_files/phpZqRDQF b/tests/Zend/File/Transfer/Adapter/_files/phpZqRDQF new file mode 100644 index 0000000000..26918572ec --- /dev/null +++ b/tests/Zend/File/Transfer/Adapter/_files/phpZqRDQF @@ -0,0 +1 @@ +testfile diff --git a/tests/Zend/File/Transfer/Adapter/_files/phpqBXGTg b/tests/Zend/File/Transfer/Adapter/_files/phpqBXGTg new file mode 100644 index 0000000000..26918572ec --- /dev/null +++ b/tests/Zend/File/Transfer/Adapter/_files/phpqBXGTg @@ -0,0 +1 @@ +testfile diff --git a/tests/Zend/File/Transfer/Adapter/_files/test.txt b/tests/Zend/File/Transfer/Adapter/_files/test.txt index e7cbb71a0d..26918572ec 100644 --- a/tests/Zend/File/Transfer/Adapter/_files/test.txt +++ b/tests/Zend/File/Transfer/Adapter/_files/test.txt @@ -1 +1 @@ -testfile \ No newline at end of file +testfile From bfb3df7c79982b62295bdcb0eeb3519079ea147c Mon Sep 17 00:00:00 2001 From: codisart Date: Tue, 22 Dec 2015 15:51:07 +0100 Subject: [PATCH 3/3] [BUG] Fix for the case when the input file is empty --- library/Zend/File/Transfer/Adapter/Http.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/library/Zend/File/Transfer/Adapter/Http.php b/library/Zend/File/Transfer/Adapter/Http.php index c92df1b658..69cfdd357c 100644 --- a/library/Zend/File/Transfer/Adapter/Http.php +++ b/library/Zend/File/Transfer/Adapter/Http.php @@ -446,7 +446,9 @@ protected function _prepareFiles() $this->_files[$form]['name'] = $form; foreach($this->_files[$form]['multifiles'] as $key => $value) { - $this->_files[$value]['name'] = basename($this->_files[$value]['tmp_name']) . '_' . $this->_files[$value]['name']; + if ($this->_files[$value]['tmp_name'] !== '') { + $this->_files[$value]['name'] = basename($this->_files[$value]['tmp_name']) . '_' . $this->_files[$value]['name']; + } $this->_files[$value]['options'] = $this->_options; $this->_files[$value]['validated'] = false; $this->_files[$value]['received'] = false; @@ -465,7 +467,9 @@ protected function _prepareFiles() } } else { $this->_files[$form] = $content; - $this->_files[$form]['name'] = basename($this->_files[$form]['tmp_name']) . '_' . $this->_files[$form]['name']; + if ($this->_files[$form]['tmp_name'] !== '') { + $this->_files[$form]['name'] = basename($this->_files[$form]['tmp_name']) . '_' . $this->_files[$form]['name']; + } $this->_files[$form]['options'] = $this->_options; $this->_files[$form]['validated'] = false; $this->_files[$form]['received'] = false;