Compare commits

..

5 Commits

Author SHA1 Message Date
77951dd48b
wip 2024-12-21 19:13:50 +01:00
502c2c597b
fix pipelines 2024-12-21 19:13:30 +01:00
24bb8ce5a9
whoops 2024-12-21 19:13:30 +01:00
86a40d9d77
wip 2024-12-21 19:13:29 +01:00
a67b93ac99 Implement image previewing
I have tested this with png and jpeg/jpg which both work but most other image types should work as well.
![image](/attachments/25318577-d48c-4902-93b3-9adbb8b954e7)

Co-authored-by: Jan Klattenhoff <j.klattenhoff@neusta.de>
Reviewed-on: sites/file-explorer#12
Co-authored-by: jank1619 <jan@kjan.email>
Co-committed-by: jank1619 <jan@kjan.email>
2024-12-21 18:12:14 +00:00
5 changed files with 328 additions and 174 deletions

View File

@ -16,6 +16,7 @@
"symfony/flex": "^2",
"symfony/form": "^7.1",
"symfony/framework-bundle": "7.1.*",
"symfony/mime": "7.1.*",
"symfony/runtime": "7.1.*",
"symfony/security-bundle": "7.1.*",
"symfony/stimulus-bundle": "^2.22",
@ -24,7 +25,8 @@
"symfony/yaml": "7.1.*",
"symfonycasts/tailwind-bundle": "^0.6.1",
"twig/extra-bundle": "^2.12|^3.0",
"twig/twig": "^2.12|^3.0"
"twig/twig": "^2.12|^3.0",
"ext-fileinfo": "*"
},
"config": {
"allow-plugins": {

455
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "bfafba7d3f6a227b403d39b34a6bf3de",
"content-hash": "4ebb20d494235bfba6d97cd0991e3354",
"packages": [
{
"name": "composer/semver",
@ -473,35 +473,30 @@
},
{
"name": "league/oauth2-client",
"version": "2.7.0",
"version": "2.8.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/oauth2-client.git",
"reference": "160d6274b03562ebeb55ed18399281d8118b76c8"
"reference": "3d5cf8d0543731dfb725ab30e4d7289891991e13"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/160d6274b03562ebeb55ed18399281d8118b76c8",
"reference": "160d6274b03562ebeb55ed18399281d8118b76c8",
"url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/3d5cf8d0543731dfb725ab30e4d7289891991e13",
"reference": "3d5cf8d0543731dfb725ab30e4d7289891991e13",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^6.0 || ^7.0",
"paragonie/random_compat": "^1 || ^2 || ^9.99",
"php": "^5.6 || ^7.0 || ^8.0"
"ext-json": "*",
"guzzlehttp/guzzle": "^6.5.8 || ^7.4.5",
"php": "^7.1 || >=8.0.0 <8.5.0"
},
"require-dev": {
"mockery/mockery": "^1.3.5",
"php-parallel-lint/php-parallel-lint": "^1.3.1",
"phpunit/phpunit": "^5.7 || ^6.0 || ^9.5",
"squizlabs/php_codesniffer": "^2.3 || ^3.0"
"php-parallel-lint/php-parallel-lint": "^1.4",
"phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11",
"squizlabs/php_codesniffer": "^3.11"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-2.x": "2.0.x-dev"
}
},
"autoload": {
"psr-4": {
"League\\OAuth2\\Client\\": "src/"
@ -537,59 +532,9 @@
],
"support": {
"issues": "https://github.com/thephpleague/oauth2-client/issues",
"source": "https://github.com/thephpleague/oauth2-client/tree/2.7.0"
"source": "https://github.com/thephpleague/oauth2-client/tree/2.8.0"
},
"time": "2023-04-16T18:19:15+00:00"
},
{
"name": "paragonie/random_compat",
"version": "v9.99.100",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
"shasum": ""
},
"require": {
"php": ">= 7"
},
"require-dev": {
"phpunit/phpunit": "4.*|5.*",
"vimeo/psalm": "^1"
},
"suggest": {
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
},
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Paragon Initiative Enterprises",
"email": "security@paragonie.com",
"homepage": "https://paragonie.com"
}
],
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
"keywords": [
"csprng",
"polyfill",
"pseudorandom",
"random"
],
"support": {
"email": "info@paragonie.com",
"issues": "https://github.com/paragonie/random_compat/issues",
"source": "https://github.com/paragonie/random_compat"
},
"time": "2020-10-15T08:29:30+00:00"
"time": "2024-12-11T05:05:52+00:00"
},
{
"name": "psr/cache",
@ -1152,16 +1097,16 @@
},
{
"name": "symfony/cache",
"version": "v7.1.7",
"version": "v7.1.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
"reference": "23b61c9592ee72233c31625f0ae805dd1571e928"
"reference": "18e0ba45a50032aa53dfebf830ec2980bb131591"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache/zipball/23b61c9592ee72233c31625f0ae805dd1571e928",
"reference": "23b61c9592ee72233c31625f0ae805dd1571e928",
"url": "https://api.github.com/repos/symfony/cache/zipball/18e0ba45a50032aa53dfebf830ec2980bb131591",
"reference": "18e0ba45a50032aa53dfebf830ec2980bb131591",
"shasum": ""
},
"require": {
@ -1229,7 +1174,7 @@
"psr6"
],
"support": {
"source": "https://github.com/symfony/cache/tree/v7.1.7"
"source": "https://github.com/symfony/cache/tree/v7.1.9"
},
"funding": [
{
@ -1245,20 +1190,20 @@
"type": "tidelift"
}
],
"time": "2024-11-05T15:34:55+00:00"
"time": "2024-11-20T10:42:04+00:00"
},
{
"name": "symfony/cache-contracts",
"version": "v3.5.0",
"version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache-contracts.git",
"reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197"
"reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197",
"reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b",
"reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b",
"shasum": ""
},
"require": {
@ -1305,7 +1250,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/cache-contracts/tree/v3.5.0"
"source": "https://github.com/symfony/cache-contracts/tree/v3.5.1"
},
"funding": [
{
@ -1321,7 +1266,7 @@
"type": "tidelift"
}
],
"time": "2024-04-18T09:32:20+00:00"
"time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/clock",
@ -1567,16 +1512,16 @@
},
{
"name": "symfony/dependency-injection",
"version": "v7.1.8",
"version": "v7.1.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
"reference": "e4d13f0f394f4d02a041ff76acd31c5a20a5f70b"
"reference": "900d2eac6e33aef743bdc10dd8c75d012215fd08"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e4d13f0f394f4d02a041ff76acd31c5a20a5f70b",
"reference": "e4d13f0f394f4d02a041ff76acd31c5a20a5f70b",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/900d2eac6e33aef743bdc10dd8c75d012215fd08",
"reference": "900d2eac6e33aef743bdc10dd8c75d012215fd08",
"shasum": ""
},
"require": {
@ -1627,7 +1572,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/dependency-injection/tree/v7.1.8"
"source": "https://github.com/symfony/dependency-injection/tree/v7.1.9"
},
"funding": [
{
@ -1643,20 +1588,20 @@
"type": "tidelift"
}
],
"time": "2024-11-09T09:16:45+00:00"
"time": "2024-11-25T15:44:54+00:00"
},
{
"name": "symfony/deprecation-contracts",
"version": "v3.5.0",
"version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
"reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
"reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
"shasum": ""
},
"require": {
@ -1694,7 +1639,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
},
"funding": [
{
@ -1710,20 +1655,20 @@
"type": "tidelift"
}
],
"time": "2024-04-18T09:32:20+00:00"
"time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/dotenv",
"version": "v7.1.6",
"version": "v7.1.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/dotenv.git",
"reference": "56a10f3032a6c2f085b13bc429e9d78a2c895dc4"
"reference": "245d1afe223664d2276afb75177d8988c328fb78"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/dotenv/zipball/56a10f3032a6c2f085b13bc429e9d78a2c895dc4",
"reference": "56a10f3032a6c2f085b13bc429e9d78a2c895dc4",
"url": "https://api.github.com/repos/symfony/dotenv/zipball/245d1afe223664d2276afb75177d8988c328fb78",
"reference": "245d1afe223664d2276afb75177d8988c328fb78",
"shasum": ""
},
"require": {
@ -1768,7 +1713,7 @@
"environment"
],
"support": {
"source": "https://github.com/symfony/dotenv/tree/v7.1.6"
"source": "https://github.com/symfony/dotenv/tree/v7.1.9"
},
"funding": [
{
@ -1784,7 +1729,7 @@
"type": "tidelift"
}
],
"time": "2024-09-28T11:14:12+00:00"
"time": "2024-11-27T11:17:28+00:00"
},
{
"name": "symfony/error-handler",
@ -1943,16 +1888,16 @@
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v3.5.0",
"version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "8f93aec25d41b72493c6ddff14e916177c9efc50"
"reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50",
"reference": "8f93aec25d41b72493c6ddff14e916177c9efc50",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f",
"reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f",
"shasum": ""
},
"require": {
@ -1999,7 +1944,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0"
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1"
},
"funding": [
{
@ -2015,7 +1960,7 @@
"type": "tidelift"
}
],
"time": "2024-04-18T09:32:20+00:00"
"time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/filesystem",
@ -2556,16 +2501,16 @@
},
{
"name": "symfony/http-client-contracts",
"version": "v3.5.1",
"version": "v3.5.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client-contracts.git",
"reference": "c2f3ad828596624ca39ea40f83617ef51ca8bbf9"
"reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/c2f3ad828596624ca39ea40f83617ef51ca8bbf9",
"reference": "c2f3ad828596624ca39ea40f83617ef51ca8bbf9",
"url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645",
"reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645",
"shasum": ""
},
"require": {
@ -2573,12 +2518,12 @@
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"autoload": {
@ -2614,7 +2559,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/http-client-contracts/tree/v3.5.1"
"source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2"
},
"funding": [
{
@ -2630,20 +2575,20 @@
"type": "tidelift"
}
],
"time": "2024-11-25T12:02:18+00:00"
"time": "2024-12-07T08:49:48+00:00"
},
{
"name": "symfony/http-foundation",
"version": "v7.1.8",
"version": "v7.1.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "f4419ec69ccfc3f725a4de7c20e4e57626d10112"
"reference": "82765842fb599c7ed839b650214680c7ee5779be"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/f4419ec69ccfc3f725a4de7c20e4e57626d10112",
"reference": "f4419ec69ccfc3f725a4de7c20e4e57626d10112",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/82765842fb599c7ed839b650214680c7ee5779be",
"reference": "82765842fb599c7ed839b650214680c7ee5779be",
"shasum": ""
},
"require": {
@ -2691,7 +2636,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v7.1.8"
"source": "https://github.com/symfony/http-foundation/tree/v7.1.9"
},
"funding": [
{
@ -2707,20 +2652,20 @@
"type": "tidelift"
}
],
"time": "2024-11-09T09:16:45+00:00"
"time": "2024-11-13T18:58:36+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v7.1.8",
"version": "v7.1.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "33fef24e3dc79d6d30bf4936531f2f4bd2ca189e"
"reference": "649d0e23c571344ef1153d4ffb2564f534b85a45"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/33fef24e3dc79d6d30bf4936531f2f4bd2ca189e",
"reference": "33fef24e3dc79d6d30bf4936531f2f4bd2ca189e",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/649d0e23c571344ef1153d4ffb2564f534b85a45",
"reference": "649d0e23c571344ef1153d4ffb2564f534b85a45",
"shasum": ""
},
"require": {
@ -2805,7 +2750,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-kernel/tree/v7.1.8"
"source": "https://github.com/symfony/http-kernel/tree/v7.1.9"
},
"funding": [
{
@ -2821,7 +2766,91 @@
"type": "tidelift"
}
],
"time": "2024-11-13T14:25:32+00:00"
"time": "2024-11-27T12:55:11+00:00"
},
{
"name": "symfony/mime",
"version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
"reference": "caa1e521edb2650b8470918dfe51708c237f0598"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/caa1e521edb2650b8470918dfe51708c237f0598",
"reference": "caa1e521edb2650b8470918dfe51708c237f0598",
"shasum": ""
},
"require": {
"php": ">=8.2",
"symfony/polyfill-intl-idn": "^1.10",
"symfony/polyfill-mbstring": "^1.0"
},
"conflict": {
"egulias/email-validator": "~3.0.0",
"phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0",
"symfony/mailer": "<6.4",
"symfony/serializer": "<6.4.3|>7.0,<7.0.3"
},
"require-dev": {
"egulias/email-validator": "^2.1.10|^3.1|^4",
"league/html-to-markdown": "^5.0",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"symfony/dependency-injection": "^6.4|^7.0",
"symfony/process": "^6.4|^7.0",
"symfony/property-access": "^6.4|^7.0",
"symfony/property-info": "^6.4|^7.0",
"symfony/serializer": "^6.4.3|^7.0.3"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Mime\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Allows manipulating MIME messages",
"homepage": "https://symfony.com",
"keywords": [
"mime",
"mime-type"
],
"support": {
"source": "https://github.com/symfony/mime/tree/v7.1.6"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-10-25T15:11:02+00:00"
},
{
"name": "symfony/options-resolver",
@ -2985,8 +3014,8 @@
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -3063,8 +3092,8 @@
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -3124,6 +3153,89 @@
],
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": ""
},
"require": {
"php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Intl\\Idn\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Laurent Bassin",
"email": "laurent@bassin.info"
},
{
"name": "Trevor Rowbotham",
"email": "trevor.rowbotham@pm.me"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"idn",
"intl",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.31.0",
@ -3147,8 +3259,8 @@
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -3231,8 +3343,8 @@
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -3305,8 +3417,8 @@
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -3583,16 +3695,16 @@
},
{
"name": "symfony/routing",
"version": "v7.1.6",
"version": "v7.1.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
"reference": "66a2c469f6c22d08603235c46a20007c0701ea0a"
"reference": "a27bb8e0cc3ca4baf17159d053910c9736c3aa4c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/routing/zipball/66a2c469f6c22d08603235c46a20007c0701ea0a",
"reference": "66a2c469f6c22d08603235c46a20007c0701ea0a",
"url": "https://api.github.com/repos/symfony/routing/zipball/a27bb8e0cc3ca4baf17159d053910c9736c3aa4c",
"reference": "a27bb8e0cc3ca4baf17159d053910c9736c3aa4c",
"shasum": ""
},
"require": {
@ -3644,7 +3756,7 @@
"url"
],
"support": {
"source": "https://github.com/symfony/routing/tree/v7.1.6"
"source": "https://github.com/symfony/routing/tree/v7.1.9"
},
"funding": [
{
@ -3660,7 +3772,7 @@
"type": "tidelift"
}
],
"time": "2024-10-01T08:31:23+00:00"
"time": "2024-11-13T16:12:35+00:00"
},
{
"name": "symfony/runtime",
@ -4091,16 +4203,16 @@
},
{
"name": "symfony/service-contracts",
"version": "v3.5.0",
"version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f"
"reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
"reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
"reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
"shasum": ""
},
"require": {
@ -4154,7 +4266,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v3.5.0"
"source": "https://github.com/symfony/service-contracts/tree/v3.5.1"
},
"funding": [
{
@ -4170,20 +4282,20 @@
"type": "tidelift"
}
],
"time": "2024-04-18T09:32:20+00:00"
"time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/stimulus-bundle",
"version": "v2.22.0",
"version": "v2.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/stimulus-bundle.git",
"reference": "2e840a3b12f06b33441cc3eb8907f51b806a7e4b"
"reference": "e13034d428354023c82a1db108d40fdf6cec2d36"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/2e840a3b12f06b33441cc3eb8907f51b806a7e4b",
"reference": "2e840a3b12f06b33441cc3eb8907f51b806a7e4b",
"url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/e13034d428354023c82a1db108d40fdf6cec2d36",
"reference": "e13034d428354023c82a1db108d40fdf6cec2d36",
"shasum": ""
},
"require": {
@ -4223,7 +4335,7 @@
"symfony-ux"
],
"support": {
"source": "https://github.com/symfony/stimulus-bundle/tree/v2.22.0"
"source": "https://github.com/symfony/stimulus-bundle/tree/v2.22.1"
},
"funding": [
{
@ -4239,7 +4351,7 @@
"type": "tidelift"
}
],
"time": "2024-11-20T07:57:38+00:00"
"time": "2024-12-06T14:30:33+00:00"
},
{
"name": "symfony/string",
@ -4683,16 +4795,16 @@
},
{
"name": "symfony/ux-icons",
"version": "v2.22.0",
"version": "v2.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/ux-icons.git",
"reference": "c7e02c2d6b4484dd63386d026eb1953bcaf79047"
"reference": "3a6fd4293fc200530b09960c41941a71354bc5fc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/ux-icons/zipball/c7e02c2d6b4484dd63386d026eb1953bcaf79047",
"reference": "c7e02c2d6b4484dd63386d026eb1953bcaf79047",
"url": "https://api.github.com/repos/symfony/ux-icons/zipball/3a6fd4293fc200530b09960c41941a71354bc5fc",
"reference": "3a6fd4293fc200530b09960c41941a71354bc5fc",
"shasum": ""
},
"require": {
@ -4752,7 +4864,7 @@
"twig"
],
"support": {
"source": "https://github.com/symfony/ux-icons/tree/v2.22.0"
"source": "https://github.com/symfony/ux-icons/tree/v2.22.1"
},
"funding": [
{
@ -4768,7 +4880,7 @@
"type": "tidelift"
}
],
"time": "2024-11-29T15:09:19+00:00"
"time": "2024-12-04T11:34:13+00:00"
},
{
"name": "symfony/var-dumper",
@ -5057,7 +5169,7 @@
},
{
"name": "twig/extra-bundle",
"version": "v3.16.0",
"version": "v3.17.0",
"source": {
"type": "git",
"url": "https://github.com/twigphp/twig-extra-bundle.git",
@ -5115,7 +5227,7 @@
"twig"
],
"support": {
"source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.16.0"
"source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.17.0"
},
"funding": [
{
@ -5131,16 +5243,16 @@
},
{
"name": "twig/twig",
"version": "v3.16.0",
"version": "v3.17.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "475ad2dc97d65d8631393e721e7e44fb544f0561"
"reference": "677ef8da6497a03048192aeeb5aa3018e379ac71"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/475ad2dc97d65d8631393e721e7e44fb544f0561",
"reference": "475ad2dc97d65d8631393e721e7e44fb544f0561",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/677ef8da6497a03048192aeeb5aa3018e379ac71",
"reference": "677ef8da6497a03048192aeeb5aa3018e379ac71",
"shasum": ""
},
"require": {
@ -5195,7 +5307,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.16.0"
"source": "https://github.com/twigphp/Twig/tree/v3.17.1"
},
"funding": [
{
@ -5207,7 +5319,7 @@
"type": "tidelift"
}
],
"time": "2024-11-29T08:27:05+00:00"
"time": "2024-12-12T09:58:10+00:00"
}
],
"packages-dev": [
@ -5598,14 +5710,15 @@
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {},
"stability-flags": [],
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": ">=8.2",
"ext-ctype": "*",
"ext-iconv": "*"
"ext-iconv": "*",
"ext-fileinfo": "*"
},
"platform-dev": {},
"platform-dev": [],
"plugin-api-version": "2.6.0"
}

View File

@ -0,0 +1,28 @@
<?php declare(strict_types=1);
namespace App\Controller;
use App\Service\FileSystemService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Routing\Attribute\Route;
class ServeFileController extends AbstractController
{
public function __construct(private FileSystemService $fileSystemService)
{
}
#[Route("/serve/{filePath}", name: "serve_file")]
public function __invoke(string $filePath): BinaryFileResponse
{
$file = $this->fileSystemService->getFile($filePath);
$path = $file->getPath() . '/' . $file->getName();
$response = new BinaryFileResponse($path);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $file->getName());
return $response;
}
}

View File

@ -14,6 +14,7 @@ readonly class DirContent
private string $type,
private string $path,
private string $content,
private string $mimeType,
) {
}
@ -24,7 +25,8 @@ readonly class DirContent
$fileInfo->getSize() ?? 0,
$fileInfo->getType() ?? 'N/A',
$fileInfo->getPath(),
$content
$content,
mime_content_type($fileInfo->getPath() . '/' . $fileInfo->getFilename()),
);
}
@ -57,6 +59,11 @@ readonly class DirContent
return $this->content;
}
public function getMimeType(): string
{
return $this->mimeType;
}
private function getHumanReadableSize(): string
{
$bytes = $this->size;

View File

@ -15,7 +15,11 @@
</a>
<div class="mt-6 text-gray-700 overflow-auto max-h-96">
<p class="whitespace-pre-wrap leading-relaxed break-all text-balance">{{ file.content|raw }}</p>
{% if file.mimeType starts with 'image' %}
<img src="{{ path('serve_file', {filePath: file.name}) }}" alt="">
{% else %}
<p class="whitespace-pre-wrap leading-relaxed break-all text-balance">{{ file.content|raw }}</p>
{% endif %}
</div>
</div>
{% endblock %}