1
0
mirror of https://github.com/Ne-Lexa/php-zip.git synced 2025-01-17 07:18:14 +01:00

Merge tag '3.1.15' into develop

fix #42 ZipFile::outputAsAttachment() gives empty zip
This commit is contained in:
Ne-Lexa 2019-12-11 15:27:49 +03:00
commit 28e220718c
4 changed files with 131 additions and 75 deletions

View File

@ -199,10 +199,10 @@ abstract class ZipAbstractEntry implements ZipEntry
/**
* @param int $platform
*
* @return ZipEntry
*
* @throws ZipException
*
* @return ZipEntry
*
* @deprecated Use {@see ZipEntry::setCreatedOS()}
* @noinspection PhpUsageOfSilenceOperatorInspection
*/

View File

@ -83,7 +83,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException if can't open file
*
* @return ZipFileInterface
* @return ZipFile
*/
public function openFile($filename)
{
@ -106,7 +106,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException if can't open temp stream
*
* @return ZipFileInterface
* @return ZipFile
*/
public function openFromString($data)
{
@ -131,7 +131,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function openFromStream($handle)
{
@ -189,7 +189,7 @@ class ZipFile implements ZipFileInterface
*
* @param string|null $comment
*
* @return ZipFileInterface
* @return ZipFile
*/
public function setArchiveComment($comment = null)
{
@ -237,7 +237,7 @@ class ZipFile implements ZipFileInterface
* @throws ZipException
* @throws ZipEntryNotFoundException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function setEntryComment($entryName, $comment = null)
{
@ -316,7 +316,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function extractTo($destination, $entries = null)
{
@ -396,7 +396,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @see ZipFile::METHOD_STORED
* @see ZipFile::METHOD_DEFLATED
@ -447,12 +447,12 @@ class ZipFile implements ZipFileInterface
* @param string $filename destination file
* @param string|null $localName zip Entry name
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or
* ZipFile::METHOD_BZIP2. If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @see ZipFile::METHOD_STORED
* @see ZipFile::METHOD_DEFLATED
@ -513,12 +513,12 @@ class ZipFile implements ZipFileInterface
* @param resource $stream stream resource
* @param string $localName zip Entry name
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or ZipFile::METHOD_BZIP2.
* If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @see ZipFile::METHOD_STORED
* @see ZipFile::METHOD_DEFLATED
@ -579,7 +579,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function addEmptyDir($dirName)
{
@ -614,12 +614,12 @@ class ZipFile implements ZipFileInterface
* @param string $inputDir Input directory
* @param string $localPath add files to this directory, or the root
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or ZipFile::METHOD_BZIP2.
* If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function addDir($inputDir, $localPath = '/', $compressionMethod = null)
{
@ -648,12 +648,12 @@ class ZipFile implements ZipFileInterface
* @param string $inputDir Input directory
* @param string $localPath add files to this directory, or the root
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or ZipFile::METHOD_BZIP2.
* If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @see ZipFile::METHOD_STORED
* @see ZipFile::METHOD_DEFLATED
@ -686,12 +686,12 @@ class ZipFile implements ZipFileInterface
* @param \Iterator $iterator directory iterator
* @param string $localPath add files to this directory, or the root
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or
* ZipFile::METHOD_BZIP2. If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @see ZipFile::METHOD_STORED
* @see ZipFile::METHOD_DEFLATED
@ -752,12 +752,12 @@ class ZipFile implements ZipFileInterface
* @param string $globPattern glob pattern
* @param string|null $localPath add files to this directory, or the root
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or
* ZipFile::METHOD_BZIP2. If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
* @sse https://en.wikipedia.org/wiki/Glob_(programming) Glob pattern syntax
*/
public function addFilesFromGlob($inputDir, $globPattern, $localPath = '/', $compressionMethod = null)
@ -773,12 +773,12 @@ class ZipFile implements ZipFileInterface
* @param string|null $localPath add files to this directory, or the root
* @param bool $recursive recursive search
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or
* ZipFile::METHOD_BZIP2. If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
* @sse https://en.wikipedia.org/wiki/Glob_(programming) Glob pattern syntax
*/
private function addGlob(
@ -827,12 +827,12 @@ class ZipFile implements ZipFileInterface
* @param string $globPattern glob pattern
* @param string|null $localPath add files to this directory, or the root
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or
* ZipFile::METHOD_BZIP2. If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
* @sse https://en.wikipedia.org/wiki/Glob_(programming) Glob pattern syntax
*/
public function addFilesFromGlobRecursive($inputDir, $globPattern, $localPath = '/', $compressionMethod = null)
@ -847,12 +847,12 @@ class ZipFile implements ZipFileInterface
* @param string $regexPattern regex pattern
* @param string|null $localPath add files to this directory, or the root
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or
* ZipFile::METHOD_BZIP2. If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @internal param bool $recursive Recursive search
*/
@ -869,12 +869,12 @@ class ZipFile implements ZipFileInterface
* @param string|null $localPath add files to this directory, or the root
* @param bool $recursive recursive search
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or
* ZipFile::METHOD_BZIP2. If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
private function addRegex(
$inputDir,
@ -950,12 +950,12 @@ class ZipFile implements ZipFileInterface
* @param string $regexPattern regex pattern
* @param string|null $localPath add files to this directory, or the root
* @param int|null $compressionMethod Compression method.
* Use ZipFile::METHOD_STORED, ZipFile::METHOD_DEFLATED or
* ZipFile::METHOD_BZIP2. If null, then auto choosing method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @internal param bool $recursive Recursive search
*/
@ -986,7 +986,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function rename($oldName, $newName)
{
@ -1010,7 +1010,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipEntryNotFoundException if entry not found
*
* @return ZipFileInterface
* @return ZipFile
*/
public function deleteFromName($entryName)
{
@ -1028,7 +1028,7 @@ class ZipFile implements ZipFileInterface
*
* @param string $globPattern Glob pattern
*
* @return ZipFileInterface
* @return ZipFile
* @sse https://en.wikipedia.org/wiki/Glob_(programming) Glob pattern syntax
*/
public function deleteFromGlob($globPattern)
@ -1047,7 +1047,7 @@ class ZipFile implements ZipFileInterface
*
* @param string $regexPattern Regex pattern
*
* @return ZipFileInterface
* @return ZipFile
*/
public function deleteFromRegex($regexPattern)
{
@ -1062,7 +1062,7 @@ class ZipFile implements ZipFileInterface
/**
* Delete all entries.
*
* @return ZipFileInterface
* @return ZipFile
*/
public function deleteAll()
{
@ -1076,7 +1076,7 @@ class ZipFile implements ZipFileInterface
*
* @param int $compressionLevel
*
* @return ZipFileInterface
* @return ZipFile
*
* @see ZipFile::LEVEL_DEFAULT_COMPRESSION
* @see ZipFile::LEVEL_SUPER_FAST
@ -1108,7 +1108,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @see ZipFile::LEVEL_DEFAULT_COMPRESSION
* @see ZipFile::LEVEL_SUPER_FAST
@ -1139,11 +1139,13 @@ class ZipFile implements ZipFileInterface
/**
* @param string $entryName
* @param int $compressionMethod
* @param int $compressionMethod Compression method.
* Use {@see ZipFile::METHOD_STORED}, {@see ZipFile::METHOD_DEFLATED} or
* {@see ZipFile::METHOD_BZIP2}. If null, then auto choosing method.
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @see ZipFile::METHOD_STORED
* @see ZipFile::METHOD_DEFLATED
@ -1171,7 +1173,7 @@ class ZipFile implements ZipFileInterface
*
* @param int|null $align
*
* @return ZipFileInterface
* @return ZipFile
*
* @see https://developer.android.com/studio/command-line/zipalign.html
*/
@ -1189,7 +1191,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @deprecated using ZipFile::setReadPassword()
*/
@ -1205,7 +1207,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function setReadPassword($password)
{
@ -1222,7 +1224,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function setReadPasswordEntry($entryName, $password)
{
@ -1239,7 +1241,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*
* @deprecated using ZipFile::setPassword()
*/
@ -1256,7 +1258,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function setPassword($password, $encryptionMethod = self::ENCRYPTION_METHOD_WINZIP_AES_256)
{
@ -1281,7 +1283,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function setPasswordEntry($entryName, $password, $encryptionMethod = null)
{
@ -1296,7 +1298,7 @@ class ZipFile implements ZipFileInterface
/**
* Remove password for all entries for update.
*
* @return ZipFileInterface
* @return ZipFile
*
* @deprecated using ZipFile::disableEncryption()
*/
@ -1308,7 +1310,7 @@ class ZipFile implements ZipFileInterface
/**
* Disable encryption for all entries that are already in the archive.
*
* @return ZipFileInterface
* @return ZipFile
*/
public function disableEncryption()
{
@ -1322,7 +1324,7 @@ class ZipFile implements ZipFileInterface
*
* @param string $entryName
*
* @return ZipFileInterface
* @return ZipFile
*/
public function disableEncryptionEntry($entryName)
{
@ -1334,7 +1336,7 @@ class ZipFile implements ZipFileInterface
/**
* Undo all changes done in the archive.
*
* @return ZipFileInterface
* @return ZipFile
*/
public function unchangeAll()
{
@ -1346,7 +1348,7 @@ class ZipFile implements ZipFileInterface
/**
* Undo change archive comment.
*
* @return ZipFileInterface
* @return ZipFile
*/
public function unchangeArchiveComment()
{
@ -1360,7 +1362,7 @@ class ZipFile implements ZipFileInterface
*
* @param string|ZipEntry $entry Entry name or ZipEntry
*
* @return ZipFileInterface
* @return ZipFile
*/
public function unchangeEntry($entry)
{
@ -1376,7 +1378,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function saveAsFile($filename)
{
@ -1407,7 +1409,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function saveAsStream($handle)
{
@ -1430,8 +1432,6 @@ class ZipFile implements ZipFileInterface
* @param bool $attachment Http Header 'Content-Disposition' if true then attachment otherwise inline
*
* @throws ZipException
*
* @return string
*/
public function outputAsAttachment($outputFilename, $mimeType = null, $attachment = true)
{
@ -1462,7 +1462,7 @@ class ZipFile implements ZipFileInterface
rewind($handle);
try {
return stream_get_contents($handle, -1, 0);
echo stream_get_contents($handle, -1, 0);
} finally {
fclose($handle);
}
@ -1587,7 +1587,7 @@ class ZipFile implements ZipFileInterface
*
* @throws ZipException
*
* @return ZipFileInterface
* @return ZipFile
*/
public function rewrite()
{

View File

@ -61,12 +61,12 @@ class ZipFileAddDirTest extends ZipTestCase
}
/**
* @param ZipFileInterface $zipFile
* @param array $actualResultFiles
* @param string $localPath
* @param ZipFile $zipFile
* @param array $actualResultFiles
* @param string $localPath
*/
protected static function assertFilesResult(
ZipFileInterface $zipFile,
ZipFile $zipFile,
array $actualResultFiles = [],
$localPath = '/'
) {

View File

@ -2212,4 +2212,60 @@ class ZipFileTest extends ZipTestCase
static::assertFalse($zipFile->getEntryInfo('file 2')->isEncrypted());
$zipFile->close();
}
/**
* @runInSeparateProcess
*
* @dataProvider provideOutputAsAttachment
*
* @param string $zipFilename
* @param string|null $mimeType
* @param string $expectedMimeType
* @param bool $attachment
* @param string $expectedAttachment
*
* @throws ZipException
*/
public function testOutputAsAttachment($zipFilename, $mimeType, $expectedMimeType, $attachment, $expectedAttachment)
{
$zipFile = new ZipFile();
$file1Contents = 'content 1';
$zipFile['file 1'] = $file1Contents;
ob_start();
$zipFile->outputAsAttachment($zipFilename, $mimeType, $attachment);
$zipContents = ob_get_clean();
$zipFile->close();
$length = \strlen($zipContents);
static::assertTrue($length > 0);
$zipFile->openFromString($zipContents);
static::assertSame($zipFile['file 1'], $file1Contents);
$zipFile->close();
if (\function_exists('xdebug_get_headers')) {
$expectedHeaders = [
'Content-Disposition: ' . $expectedAttachment . '; filename="' . $zipFilename . '"',
'Content-Type: ' . $expectedMimeType,
'Content-Length: ' . $length,
];
/** @noinspection ForgottenDebugOutputInspection */
/** @noinspection PhpComposerExtensionStubsInspection */
static::assertSame($expectedHeaders, xdebug_get_headers());
}
}
/**
* @return array
*/
public function provideOutputAsAttachment()
{
return [
['file.zip', null, 'application/zip', true, 'attachment'],
['file.zip', 'application/x-zip', 'application/x-zip', false, 'inline'],
['file.apk', null, 'application/vnd.android.package-archive', true, 'attachment'],
];
}
}