南634 / mass-media-bundle
用于 Symfony 的文件路径管理包
Requires
- php: >=5.5.9
- symfony/framework-bundle: ~2.3|~3.0
- symfony/twig-bundle: ~2.3|~3.0
Requires (Dev)
- phpunit/phpunit: ~4.8|~5.0
- symfony/phpunit-bridge: ~2.7|~3.0
This package is not auto-updated.
Last update: 2024-09-28 19:52:53 UTC
README
一个用于从上传文件创建哈希文件名并分散到目录中的 Symfony 包。
您可以设置要用于创建文件名的哈希算法,您希望文件存储的文件夹深度,以及每个文件夹名称要使用的字符数。它使用哈希文件名的开头字符来创建文件夹名称。
例如,如果您使用 sha1 作为哈希算法,您可能会得到这样的文件名
3882be53dbfc4a0a4305fba989d224b863fe8cfd.jpg
如果您设置文件夹字符长度:2,文件夹深度:2,则该文件将存储在此处
/38/82/3882be53dbfc4a0a4305fba989d224b863fe8cfd.jpg
设置文件夹字符长度:3,文件夹深度:1,则文件将存储在此处
/388/3882be53dbfc4a0a4305fba989d224b863fe8cfd.jpg
此功能可能对那些不希望在单个目录中存储太多文件的人来说很有用。
安装
步骤 1:下载包
打开命令行,进入您的项目目录并执行以下命令
$ composer require south634/mass-media-bundle "dev-master"
此命令需要您全局安装了 Composer,如 Composer 文档的 安装章节 中所述。
步骤 2:启用包
然后,通过将其添加到项目 app/AppKernel.php 文件中注册的包列表中启用该包。
<?php // app/AppKernel.php // ... class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // ... new South634\MassMediaBundle\South634MassMediaBundle(), ); // ... } // ... }
步骤 3:添加设置
最后,在项目的 app/config/config.yml 文件中根据需要配置所需的设置。
下面是示例
# app/config/config.yml
south634_mass_media:
settings:
hash_algo: sha1
upload_dir: media
folder_depth: 2
folder_chars: 2
必需设置
hash_algo
您想用于创建文件名的哈希算法。必须是 PHP hash_algos() 函数 返回的数组中存在的算法。
upload_dir
您想存储上传的文件夹名称。此文件夹将创建在您的 Symfony 应用程序的 Web 可访问目录中。
folder_depth
您想存储文件文件夹的深度。最小值为 0。
folder_chars
您想用于每个文件夹名称的字符数。最小值为 0。
注意:folder_depth * folder_chars 应该永远不会大于您预期的文件名长度。例如,使用 hash_algo: sha1 时,您期望文件名哈希长度为 40 个字符。在这种情况下,您不应设置 folder_depth: 20 和 folder_chars: 3,因为 20 * 3 > 40。您的文件名将没有足够的字符来创建文件夹。
可选设置
web_dir_name
您的 Symfony 应用程序中可访问的 Web 目录名称。默认为 'web'。
root_dir
您的 Symfony 应用程序根目录的绝对路径。默认为 '%kernel.root_dir%'。
用法
MassMediaManager
在控制器中获取 MassMediaManager 服务,如下所示
$mmm = $this->get('south634_mass_media.manager');
从上传文件创建文件名(防止重复文件名)
$fileName = $mmm->getFileName($file);
这将从 UploadedFile 对象 创建哈希文件名。
MassMediaManager 使用 PHP 的 hash_file() 函数在这里创建文件名。这意味着即使您上传了两个具有不同文件名的相同文件,您也应该为这两个文件收到相同的哈希文件名。
例如,假设你有一张猫的照片,名为 'cute-cat.jpg'。你将这张照片复制到其他地方,并将其重命名为 'kittypic.jpg'。现在,你上传这两张照片。由于图像仍然是相同的,hash_file() 生成的哈希值也将相同。
如果你希望减少服务器上存储的重复文件,这可能很有用。但在删除文件之前,务必检查文件是否被其他实体拥有。
从UploadedFile创建文件名(允许重复文件)
如果你想允许上传重复文件,getFileName() 方法接受一个可选的 $unique 参数,可用于此目的。例如,你可以通过将用户的 id 添加到文件来为每个用户创建唯一的哈希文件名,如下所示
$fileName = $mmm->getFileName($file, $user->getId());
使用上面的例子,假设有两个相同的猫照片文件,用户 1 上传 'cute-cat.jpg',而用户 2 上传 'kittypic.jpg'。尽管文件是相同的,但它们的唯一用户 id 被添加到哈希中,这导致了不同的文件名,每个用户都有一个独特的文件名,可以单独存储。
从URL创建文件名
$fileName = $mmm->getFileNameFromUrl($url);
如果你想从 URL 而不是UploadedFile 对象创建文件名,请使用 getFileNameFromUrl() 方法。此方法也接受可选的第二个 $unique 参数
$fileName = $mmm->getFileNameFromUrl($url, $unique);
上传文件
$mmm->uploadFile($file);
使用 uploadFile() 上传一个UploadedFile 文件对象。它将为配置.yml 设置中设置的 upload_dir 中的此文件路径创建所有必要的文件夹。还可以接受第二个可选的唯一参数
$mmm->uploadFile($file, $unique);
从URL上传文件
$mmm->uploadFileFromUrl($url);
与 uploadFile() 相同,但用于 URL 而不是UploadedFile 对象。您需要启用 allow_url_fopen 才能使用此功能。还可以接受第二个可选的唯一参数
$mmm->uploadFileFromUrl($url, $unique);
删除文件
$mmm->removeFile($fileName);
删除一个文件及其为该文件创建的所有空子目录。只需传递文件名即可。
或者,如果你想要删除一个文件,但保留为其创建的所有空子目录,请将此方法的第二个参数设置为 false,如下所示
$mmm->removeFile($fileName, false);
获取Web路径
$mmm->getWebPath($fileName);
返回文件的Web路径。
Twig
要在 Twig 模板中获取文件的 Web 路径,可以使用 mass_media_web_path 过滤器,如下所示
<img src="{{ asset(product.photo|mass_media_web_path) }}">