tacoberu / nette-media
为您的Nette应用程序生成的即时网页图片。非常受dotBlue(http://dotblue.net)的启发(和复制)。
v3.0.1
2024-05-08 20:19 UTC
Requires
- php: >=7.4
- latte/latte: >=2.5.0
- nette/application: >=2.5.0
- nette/di: >=2.5.0
- nette/http: >=2.5.0
- nette/utils: >=2.6.0
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpstan/phpstan-nette: ^1.2
- phpunit/phpunit: ^11.1
- tracy/tracy: ^2.10
This package is not auto-updated.
Last update: 2024-09-25 22:10:13 UTC
README
管理和提供Nette中的文件和图片。即时生成的图片缩略图。非常受dotBlue(http://dotblue.net)的启发(和复制)。
通常我们希望上传一些存储在一个或多个存储库中的文件或图片(这不是本项目的部分)。我们通常希望以优雅、可配置的方式访问文件。我们希望在图片上创建一些操作、预览、水印。我们通常希望仅在需要时生成预览,并在可能的情况下只生成一次。我们希望直接访问生成的预览,使用mod_rewrite(或类似技术)使其尽可能快。这也很方便,允许您强制下载图片。
安装
推荐的安装方式是通过Composer
composer require tacoberu/nette-media
在模板中使用
原始图片
<img n:media="users/david.jpg">
<a href={media users/david.jpg}>
它将生成
/media/users/david.jpg
图片预览。我们从预定义的变体中选择(防止DoS攻击)。预览在请求时自动生成并保存以供下次使用。
<a href={media users/david.jpg, small}>
<img n:media="users/david.jpg, small">
它将生成
/media/users/david.jpg?small
强制下载图片
<a href={download users/david.jpg}>
它将生成
/media/users/david.jpg?download
和非图片文件
<a href={media users/david.pdf}>
<link rel="stylesheet" media="screen,projection,tv" href="{media screen.css}" />
配置
extensions:
media: Taco\NetteMedia\Extension
media:
# Where source images are taken.
providers:
- Taco\NetteMedia\FileBasedProvider(%appDir%/../../var/uploads)
# We need to deduce from the url that it is an image, and in which variant we get it
route: Taco\NetteMedia\Router('media')
# Transform over images. Typically previews.
transformations:
preview:
- Taco\NetteMedia\ResizeTransformation(75, 250, 250, 'fit')
medium:
- Taco\NetteMedia\ResizeTransformation(75, 264, 264, 'fit')
small:
- Taco\NetteMedia\ResizeTransformation(75, 100, 100, 'fit')
big:
- Taco\NetteMedia\ResizeTransformation(100, 800, 600, 'fit')
# - YourApp\NetteMedia\WatterMark
# Where the previews are stored. It is possible to set it to public and configure .htaccess
cache: Taco\NetteMedia\FileBasedThumbnailCache(%wwwDir%/cache)
示例 .htaccess
系统为我们即时生成预览很方便。但是,即使这些预览也必须通过Nette访问,这将更好。让我们添加(手动)这样的 .htaccess 规则。
# cached image previews
RewriteCond %{REQUEST_URI} ^/media/(.+)$
RewriteCond %{QUERY_STRING} ^(preview|medium|small|big)$
RewriteRule ^media/(.*)$ /cache/%{QUERY_STRING}/$1 [L]
# cached image original
RewriteCond %{REQUEST_URI} ^/media/(.+)$
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^media/(.*)$ /cache/__orig__/$1 [L]
# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
现在应该可以这样工作
- 我们将显示url /media/users/david.jpg?preview
- 我们发现该图片的预览不存在,因此提取原始图片并对其执行预览转换。
- 结果保存到 %wwwDir%/cache/preview
- 下次访问时,图片已经位于 /cache/preview/users/david.jpg,并立即显示,在php使用之前。