来自数据库/MySQL 的 Shopware 6 媒体文件路径

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)

ts-*_*hip 9

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”