diff --git a/src/Model/Data/ZipFileData.php b/src/Model/Data/ZipFileData.php index 9a80890..43590c5 100644 --- a/src/Model/Data/ZipFileData.php +++ b/src/Model/Data/ZipFileData.php @@ -4,6 +4,7 @@ namespace PhpZip\Model\Data; use PhpZip\Exception\ZipException; use PhpZip\Model\ZipData; +use PhpZip\Model\ZipEntry; /** * Class ZipFileData. @@ -16,11 +17,12 @@ class ZipFileData implements ZipData /** * ZipStringData constructor. * + * @param ZipEntry $zipEntry * @param \SplFileInfo $fileInfo * * @throws ZipException */ - public function __construct(\SplFileInfo $fileInfo) + public function __construct(ZipEntry $zipEntry, \SplFileInfo $fileInfo) { if (!$fileInfo->isFile()) { throw new ZipException('$fileInfo is not a file.'); @@ -31,6 +33,7 @@ class ZipFileData implements ZipData } $this->file = $fileInfo; + $zipEntry->setUncompressedSize($fileInfo->getSize()); } /** diff --git a/src/ZipFile.php b/src/ZipFile.php index 7c3d012..32560c6 100644 --- a/src/ZipFile.php +++ b/src/ZipFile.php @@ -711,10 +711,9 @@ class ZipFile implements ZipFileInterface ZipCompressionMethod::DEFLATED; } - $zipEntry->setUncompressedSize($file->getSize()); $zipEntry->setCompressionMethod($compressionMethod); - $zipData = new ZipFileData($file); + $zipData = new ZipFileData($zipEntry, $file); } elseif ($file->isDir()) { $zipEntry->setCompressionMethod(ZipCompressionMethod::STORED); $zipEntry->setUncompressedSize(0); diff --git a/tests/ZipEntryTest.php b/tests/ZipEntryTest.php index 28ed7c4..7bb46b1 100644 --- a/tests/ZipEntryTest.php +++ b/tests/ZipEntryTest.php @@ -1571,9 +1571,10 @@ class ZipEntryTest extends TestCase public function testClone() { $newUnixExtra = new NewUnixExtraField(); - $zipData = new ZipFileData(new \SplFileInfo(__FILE__)); $zipEntry = new ZipEntry('entry'); + $zipData = new ZipFileData($zipEntry, new \SplFileInfo(__FILE__)); + $zipEntry->addExtraField($newUnixExtra); $zipEntry->setData($zipData); diff --git a/tests/ZipFileTest.php b/tests/ZipFileTest.php index 0f36686..4230f7b 100644 --- a/tests/ZipFileTest.php +++ b/tests/ZipFileTest.php @@ -10,6 +10,7 @@ use PhpZip\Exception\InvalidArgumentException; use PhpZip\Exception\ZipEntryNotFoundException; use PhpZip\Exception\ZipException; use PhpZip\Exception\ZipUnsupportMethodException; +use PhpZip\Model\Data\ZipFileData; use PhpZip\Model\ZipEntry; use PhpZip\Model\ZipInfo; use PhpZip\Util\FilesUtil; @@ -2459,6 +2460,10 @@ class ZipFileTest extends ZipTestCase $zipFile->close(); } + /** + * @throws ZipEntryNotFoundException + * @throws ZipException + */ public function testNoData() { $this->setExpectedException(ZipException::class, 'No data for zip entry file'); @@ -2476,4 +2481,34 @@ class ZipFileTest extends ZipTestCase $zipFile->close(); } } + + /** + * @throws ZipEntryNotFoundException + * @throws ZipException + */ + public function testReplaceEntryContentsByFile() + { + $entryName = basename(__FILE__); + + $zipFile = new ZipFile(); + $zipFile[$entryName] = 'contents'; + $zipFile->saveAsFile($this->outputFilename); + $zipFile->close(); + + $zipFile->openFile($this->outputFilename); + $entry = $zipFile->getEntry($entryName); + $data = new ZipFileData($entry, new \SplFileInfo(__FILE__)); + $entry->setData($data); + $zipFile->saveAsFile($this->outputFilename); + $zipFile->close(); + + self::assertCorrectZipArchive($this->outputFilename); + + $zipFile->openFile($this->outputFilename); + static::assertSame( + $zipFile->getEntryContents($entryName), + file_get_contents(__FILE__) + ); + $zipFile->close(); + } }