add mime-types, support for vector images, fixes #113 #108

This commit is contained in:
Milos Stojanovic
2020-07-18 10:43:17 +02:00
parent fdb596a2fc
commit 5624aa9493
3 changed files with 37 additions and 8 deletions

View File

@@ -20,6 +20,7 @@ use Filegator\Services\Session\SessionStorageInterface as Session;
use Filegator\Services\Storage\Filesystem;
use Filegator\Services\Tmpfs\TmpfsInterface;
use Symfony\Component\HttpFoundation\HeaderUtils;
use Symfony\Component\Mime\MimeTypes;
class DownloadController
{
@@ -65,14 +66,17 @@ class DownloadController
// @codeCoverageIgnoreEnd
});
$contentDisposition = HeaderUtils::makeDisposition(HeaderUtils::DISPOSITION_ATTACHMENT, $file['filename'], 'file');
$contentType = 'application/octet-stream';
$mimes = (new MimeTypes())->getMimeTypes(pathinfo($file['filename'], PATHINFO_EXTENSION));
$contentType = !empty($mimes) ? $mimes[0] : 'application/octet-stream';
if (pathinfo($file['filename'], PATHINFO_EXTENSION) == 'pdf') {
$contentDisposition = HeaderUtils::makeDisposition(HeaderUtils::DISPOSITION_INLINE, $file['filename'], 'file');
$contentType = 'application/pdf';
$disposition = HeaderUtils::DISPOSITION_ATTACHMENT;
if ($contentType == 'application/pdf') {
$disposition = HeaderUtils::DISPOSITION_INLINE;
}
$contentDisposition = HeaderUtils::makeDisposition($disposition, $file['filename'], 'file');
$streamedResponse->headers->set(
'Content-Disposition',
$contentDisposition

View File

@@ -135,7 +135,7 @@ const funcs = {
return this.hasExtension(name, store.state.config.editable ? store.state.config.editable : ['.txt'])
},
isImage(name) {
return this.hasExtension(name, ['.jpg', '.jpeg', '.gif', '.png', '.bmp', '.tiff', '.tif'])
return this.hasExtension(name, ['.jpg', '.jpeg', '.gif', '.png', '.bmp', '.svg', '.tiff', '.tif'])
},
hasExtension(name, exts) {
return (new RegExp('(' + exts.join('|').replace(/\./g, '\\.') + ')$', 'i')).test(name)

View File

@@ -155,15 +155,40 @@ class FilesTest extends TestCase
mkdir(TEST_REPOSITORY.'/john');
touch(TEST_REPOSITORY.'/john/john.txt', $this->timestamp);
touch(TEST_REPOSITORY.'/john/image.jpg', $this->timestamp);
touch(TEST_REPOSITORY.'/john/vector.svg', $this->timestamp);
touch(TEST_REPOSITORY.'/john/inlinedoc.pdf', $this->timestamp);
$path_encoded = base64_encode('john.txt');
$this->sendRequest('GET', '/download&path='.$path_encoded);
$headers = $this->streamedResponse->headers;
$this->assertEquals($headers->get('content-disposition'), "attachment; filename=file; filename*=utf-8''john.txt");
$this->assertEquals($headers->get('content-type'), 'application/octet-stream');
$this->assertEquals($headers->get('content-type'), 'text/plain');
$this->assertEquals($headers->get('content-transfer-encoding'), 'binary');
$this->assertOk();
$path_encoded = base64_encode('image.jpg');
$this->sendRequest('GET', '/download&path='.$path_encoded);
$headers = $this->streamedResponse->headers;
$this->assertEquals($headers->get('content-disposition'), "attachment; filename=file; filename*=utf-8''image.jpg");
$this->assertEquals($headers->get('content-type'), 'image/jpeg');
$this->assertEquals($headers->get('content-transfer-encoding'), 'binary');
$this->assertOk();
$path_encoded = base64_encode('vector.svg');
$this->sendRequest('GET', '/download&path='.$path_encoded);
$headers = $this->streamedResponse->headers;
$this->assertEquals($headers->get('content-disposition'), "attachment; filename=file; filename*=utf-8''vector.svg");
$this->assertEquals($headers->get('content-type'), 'image/svg+xml');
$this->assertEquals($headers->get('content-transfer-encoding'), 'binary');
$this->assertOk();
$path_encoded = base64_encode('inlinedoc.pdf');
$this->sendRequest('GET', '/download&path='.$path_encoded);
$headers = $this->streamedResponse->headers;
$this->assertEquals($headers->get('content-disposition'), "inline; filename=file; filename*=utf-8''inlinedoc.pdf");
$this->assertEquals($headers->get('content-type'), 'application/pdf');
$this->assertEquals($headers->get('content-transfer-encoding'), 'binary');
$this->assertOk();
}