【问题标题】:Shopware 6 media file path from database/MySQLShopware 6 来自数据库/MySQL 的媒体文件路径
【发布时间】:2022-08-10 14:38:57
【问题描述】:

在表 \"media\" 的 Shopware 6 数据库中,没有文件位置列。只有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

    标签: shopware shopware6


    【解决方案1】:

    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),
        ]);
    }
    

    第 1 部分:生成路径哈希

    generatePathHash 方法使用媒体 ID,生成 md5 哈希,使用前 6 个字符,并在位置 2 和 4 添加斜杠。

    从您的示例中,id '0191b9f8e7634a15a4e494d1206f797f' 将生成 '8f/25/74'

    第 2 部分:generatePath CacheBuster

    此方法仅使用uploaded_at,但打印为时间戳。如果为空,则不会添加路径。

    第 3 部分:生成物理文件名

    这基本上只是 file_name 和 file_extension。

    最终 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';
    

    会给你请求的文件路径'public/media/8f/25/74/1653522951/242178_0569-1.jpg'

    【讨论】:

      【解决方案2】:

      检查您的 cdn-strategry 以在两个系统上匹配,或将其设置为显式。

      .env (SHOPWARE_CDN_STRATEGY_DEFAULT) 或文件 config/packages/shopware.yml (shopware.cdn.strategy)

      这可以是idfilenamephysical_filenameplain

      我也不喜欢现在的行为。另请参阅:https://github.com/shopware/proposal/issues/50

      【讨论】:

        猜你喜欢
        • 2022-12-01
        • 2014-01-08
        • 2020-12-04
        • 2020-11-22
        • 2016-06-12
        • 1970-01-01
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多