ts-*_*hip 4 shopware shopware6
在 Shopware 6 数据库的“media”表中,没有文件位置列。只有 file_name、file_extension 和 file_size。但没有file_path。
Shopware 必须以某种方式将信息从数据库转换为文件位置,以生成类似“public/media/8f/25/74/1653530151/242178_0569-1.jpg”的文件路径。
Shopware如何生成文件路径?有没有办法通过MySQL查询生成文件路径?
MySQL [dev]> select * from media where file_name='242178_0569-1'\G
*************************** 1. row ***************************
id: 0191b9f8e7634a15a4e494d1206f797f
user_id: NULL
media_folder_id: d798f70b69f047c68810c45744b43d6f
mime_type: image/jpeg
file_extension: jpg
file_size: 2161002
meta_data: {"hash": "7b082f5a1a79e2dd0f39a2c8c1062a1c", "type": 2, "width": 1300, "height": 1300}
file_name: 242178_0569-1
media_type: ...
thumbnails_ro: ...
private: 0
uploaded_at: 2022-05-26 01:55:51.920
created_at: 2022-05-26 01:55:51.401
updated_at: 2022-05-26 01:55:54.428
Run Code Online (Sandbox Code Playgroud)
TL;DR 版本:
SELECT
concat(
'public/media/',
REGEXP_REPLACE(left(md5(lower(hex(id))), 6), '(..)', '$1/'),
IFNULL(concat(FLOOR(UNIX_TIMESTAMP(uploaded_at)), '/'), ''),
file_name, '.', file_extension
) as path
FROM media
WHERE file_name='242178_0569-1';
Run Code Online (Sandbox Code Playgroud)
将为您提供文件路径“public/media/8f/25/74/1653522951/242178_0569-1.jpg”
完整答案:
Shopware 在Shopware/Core/Content/Media/File/FileLoader.php中的源代码中生成媒体文件路径。如果您深入挖掘并假设您使用的是默认实现,您会发现Shopware/Core/Content/Media/Pathname/UrlGenerator.php:
public function getRelativeMediaUrl(MediaEntity $media): string
{
$this->validateMedia($media);
return $this->toPathString([
'media',
$this->pathnameStrategy->generatePathHash($media),
$this->pathnameStrategy->generatePathCacheBuster($media),
$this->pathnameStrategy->generatePhysicalFilename($media),
]);
}
Run Code Online (Sandbox Code Playgroud)
第 1 部分:生成PathHash
generatePathHash 方法使用媒体 ID,生成 md5 哈希值,使用前 6 个字符,并在位置 2 和 4 上添加斜杠。
从您的示例中,id '0191b9f8e7634a15a4e494d1206f797f' 将生成 '8f/25/74'
第 2 部分:generatePathCacheBuster
此方法仅使用 uploaded_at,但打印为时间戳。如果为空,则不会添加任何路径。
第 3 部分:生成物理文件名
这基本上只是文件名和文件扩展名。
最终SQL:
SELECT lower(hex(id)),
file_name,
concat(
'public/media/',
REGEXP_REPLACE(left(md5(lower(hex(id))), 6), '(..)', '$1/'),
IFNULL(concat(FLOOR(UNIX_TIMESTAMP(uploaded_at)), '/'), ''),
file_name, '.', file_extension
) as path
FROM media
WHERE file_name='242178_0569-1';
Run Code Online (Sandbox Code Playgroud)
将为您提供请求的文件路径“public/media/8f/25/74/1653522951/242178_0569-1.jpg”
| 归档时间: |
|
| 查看次数: |
2081 次 |
| 最近记录: |