1
0
mirror of https://github.com/Ne-Lexa/php-zip.git synced 2025-07-17 22:21:13 +02:00

issue #8 - Support inline Content-Disposition and empty output filename.

This commit is contained in:
Ne-Lexa
2017-11-14 14:03:44 +03:00
parent 02afaae56c
commit e62e51efb5
4 changed files with 69 additions and 75 deletions

View File

@@ -1,10 +1,23 @@
<?xml version="1.0" encoding="utf-8" ?>
<phpunit bootstrap="./vendor/autoload.php" colors="true">
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd"
backupGlobals="false"
colors="true"
bootstrap="vendor/autoload.php">
<php>
<ini name="error_reporting" value="-1"/>
</php>
<testsuites>
<testsuite name="PhpZip test suite">
<directory>./tests</directory>
<directory>tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>src</directory>
</whitelist>
</filter>
</phpunit>

View File

@@ -1226,61 +1226,64 @@ class ZipFile implements ZipFileInterface
* Output .ZIP archive as attachment.
* Die after output.
*
* @param string $outputFilename
* @param string|null $mimeType
* @param string $outputFilename Output filename
* @param string|null $mimeType Mime-Type
* @param bool $attachment Http Header 'Content-Disposition' if true then attachment otherwise inline
* @throws InvalidArgumentException
*/
public function outputAsAttachment($outputFilename, $mimeType = null)
public function outputAsAttachment($outputFilename, $mimeType = null, $attachment = true)
{
$outputFilename = (string)$outputFilename;
if (strlen($outputFilename) === 0) {
throw new InvalidArgumentException("Output filename is empty.");
}
if (empty($mimeType) || !is_string($mimeType)) {
if (empty($mimeType) || !is_string($mimeType) && !empty($outputFilename)) {
$ext = strtolower(pathinfo($outputFilename, PATHINFO_EXTENSION));
if (!empty($ext) && isset(self::$defaultMimeTypes[$ext])) {
$mimeType = self::$defaultMimeTypes[$ext];
} else {
}
}
if (empty($mimeType)) {
$mimeType = self::$defaultMimeTypes['zip'];
}
}
$outputFilename = basename($outputFilename);
$content = $this->outputAsString();
$this->close();
$headerContentDisposition = 'Content-Disposition: ' . ($attachment ? 'attachment' : 'inline');
if (!empty($outputFilename)) {
$headerContentDisposition .= '; filename="' . basename($outputFilename) . '"';
}
header($headerContentDisposition);
header("Content-Type: " . $mimeType);
header('Content-Disposition: attachment; filename="' . $outputFilename . '"');
header("Content-Length: " . strlen($content));
exit($content);
}
/**
* Output .ZIP archive as PSR-Message Response.
* Output .ZIP archive as PSR-7 Response.
*
* @param ResponseInterface $response
* @param string $outputFilename
* @param string|null $mimeType
* @param ResponseInterface $response Instance PSR-7 Response
* @param string $outputFilename Output filename
* @param string|null $mimeType Mime-Type
* @param bool $attachment Http Header 'Content-Disposition' if true then attachment otherwise inline
* @return ResponseInterface
* @throws InvalidArgumentException
*/
public function outputAsResponse(ResponseInterface $response, $outputFilename, $mimeType = null)
public function outputAsResponse(ResponseInterface $response, $outputFilename, $mimeType = null, $attachment = true)
{
$outputFilename = (string)$outputFilename;
if (strlen($outputFilename) === 0) {
throw new InvalidArgumentException("Output filename is empty.");
}
if (empty($mimeType) || !is_string($mimeType)) {
if (empty($mimeType) || !is_string($mimeType) && !empty($outputFilename)) {
$ext = strtolower(pathinfo($outputFilename, PATHINFO_EXTENSION));
if (!empty($ext) && isset(self::$defaultMimeTypes[$ext])) {
$mimeType = self::$defaultMimeTypes[$ext];
} else {
}
}
if (empty($mimeType)) {
$mimeType = self::$defaultMimeTypes['zip'];
}
}
$outputFilename = basename($outputFilename);
if (!($handle = fopen('php://memory', 'w+b'))) {
throw new InvalidArgumentException("Memory can not open from write.");
@@ -1288,9 +1291,14 @@ class ZipFile implements ZipFileInterface
$this->writeZipToStream($handle);
rewind($handle);
$contentDispositionValue = ($attachment ? 'attachment' : 'inline');
if (!empty($outputFilename)) {
$contentDispositionValue .= '; filename="' . basename($outputFilename) . '"';
}
$stream = new ResponseStream($handle);
$response->withHeader('Content-Type', $mimeType);
$response->withHeader('Content-Disposition', 'attachment; filename="' . $outputFilename . '"');
$response->withHeader('Content-Disposition', $contentDispositionValue);
$response->withHeader('Content-Length', $stream->getSize());
$response->withBody($stream);
return $response;
@@ -1348,11 +1356,15 @@ class ZipFile implements ZipFileInterface
$content = $this->outputAsString();
$this->close();
if ('plainfile' === $meta['wrapper_type']) {
if (file_put_contents($meta['uri'], $content) === false) {
throw new ZipException("Can not overwrite the zip file in the {$meta['uri']} file.");
/**
* @var resource $uri
*/
$uri = $meta['uri'];
if (file_put_contents($uri, $content) === false) {
throw new ZipException("Can not overwrite the zip file in the {$uri} file.");
}
if (!($handle = @fopen($meta['uri'], 'rb'))) {
throw new ZipException("File {$meta['uri']} can't open.");
if (!($handle = @fopen($uri, 'rb'))) {
throw new ZipException("File {$uri} can't open.");
}
return $this->openFromStream($handle);
}

View File

@@ -592,22 +592,23 @@ interface ZipFileInterface extends \Countable, \ArrayAccess, \Iterator
* Output .ZIP archive as attachment.
* Die after output.
*
* @param string $outputFilename
* @param string|null $mimeType
* @throws InvalidArgumentException
* @param string $outputFilename Output filename
* @param string|null $mimeType Mime-Type
* @param bool $attachment Http Header 'Content-Disposition' if true then attachment otherwise inline
*/
public function outputAsAttachment($outputFilename, $mimeType = null);
public function outputAsAttachment($outputFilename, $mimeType = null, $attachment = true);
/**
* Output .ZIP archive as PSR-Message Response.
* Output .ZIP archive as PSR-7 Response.
*
* @param ResponseInterface $response
* @param string $outputFilename
* @param string|null $mimeType
* @param ResponseInterface $response Instance PSR-7 Response
* @param string $outputFilename Output filename
* @param string|null $mimeType Mime-Type
* @param bool $attachment Http Header 'Content-Disposition' if true then attachment otherwise inline
* @return ResponseInterface
* @throws InvalidArgumentException
*/
public function outputAsResponse(ResponseInterface $response, $outputFilename, $mimeType = null);
public function outputAsResponse(ResponseInterface $response, $outputFilename, $mimeType = null, $attachment = true);
/**
* Returns the zip archive as a string.

View File

@@ -1662,26 +1662,6 @@ class ZipFileTest extends ZipTestCase
$zipFile->addEmptyDir("");
}
/**
* @expectedException \PhpZip\Exception\InvalidArgumentException
* @expectedExceptionMessage Output filename is empty.
*/
public function testOutputAsAttachmentNullName()
{
$zipFile = new ZipFile();
$zipFile->outputAsAttachment(null);
}
/**
* @expectedException \PhpZip\Exception\InvalidArgumentException
* @expectedExceptionMessage Output filename is empty.
*/
public function testOutputAsAttachmentEmptyName()
{
$zipFile = new ZipFile();
$zipFile->outputAsAttachment('');
}
/**
* @expectedException \PhpZip\Exception\ZipNotFoundEntry
* @expectedExceptionMessage Zip entry bad entry name not found
@@ -1916,18 +1896,6 @@ class ZipFileTest extends ZipTestCase
$this->assertInstanceOf(ResponseInterface::class, $response);
}
/**
* @expectedException \PhpZip\Exception\InvalidArgumentException
* @expectedExceptionMessage Output filename is empty.
*/
public function testInvalidPsrResponse()
{
$zipFile = new ZipFile();
$zipFile['file'] = 'content';
$response = $this->getMock(ResponseInterface::class);
$zipFile->outputAsResponse($response, '');
}
public function testCompressionLevel()
{
$zipFile = new ZipFile();