【问题标题】:Add images via Shopware 6 API通过 Shopware 6 API 添加图像
【发布时间】:2020-12-16 11:13:48
【问题描述】:

我有一个 Shopware 6.3 商店,需要使用集成 API 将图像迁移到该商店。

我应该如何为媒体上传构建正文?我需要将文件放在某个地方还是只传递链接?

我已通过此处的指南将新产品推入 Shopware:https://docs.shopware.com/en/shopware-platform-dev-en/admin-api-guide/writing-entities?category=shopware-platform-dev-en/admin-api-guide#creating-entities,但我不确定如何处理媒体。在本指南中,仅说明了如何在此处https://docs.shopware.com/en/shopware-platform-dev-en/admin-api-guide/writing-entities?category=shopware-platform-dev-en/admin-api-guide#media-handling 中创建已上传的媒体文件与产品之间的链接,但没有关于如何实际推送媒体文件的示例。

我有我需要的每张图片的 URL(在数据库中,以及产品 ID 和图片位置)。

实体架构将媒体描述为:

    "media": {
        "name": "media",
        "translatable": [
            "alt",
            "title",
            "customFields"
        ],
        "properties": {
            "id": {
                "type": "string",
                "format": "uuid"
            },
            "userId": {
                "type": "string",
                "format": "uuid"
            },
            "mediaFolderId": {
                "type": "string",
                "format": "uuid"
            },
            "mimeType": {
                "type": "string",
                "readOnly": true
            },
            "fileExtension": {
                "type": "string",
                "readOnly": true
            },
            "uploadedAt": {
                "type": "string",
                "format": "date-time",
                "readOnly": true
            },
            "fileName": {
                "type": "string",
                "readOnly": true
            },
            "fileSize": {
                "type": "integer",
                "format": "int64",
                "readOnly": true
            },
            "metaData": {
                "type": "object",
                "readOnly": true
            },
            "mediaType": {
                "type": "object",
                "readOnly": true
            },
            "alt": {
                "type": "string"
            },
            "title": {
                "type": "string"
            },
            "url": {
                "type": "string"
            },
            "hasFile": {
                "type": "boolean"
            },
            "private": {
                "type": "boolean"
            },
            "customFields": {
                "type": "object"
            },
            "createdAt": {
                "type": "string",
                "format": "date-time",
                "readOnly": true
            },
            "updatedAt": {
                "type": "string",
                "format": "date-time",
                "readOnly": true
            },
            "translated": {
                "type": "object"
            },
            "tags": {
                "type": "array",
                "entity": "tag"
            },
            "thumbnails": {
                "type": "array",
                "entity": "media_thumbnail"
            },
            "user": {
                "type": "object",
                "entity": "user"
            },
            "categories": {
                "type": "array",
                "entity": "category"
            },
            "productManufacturers": {
                "type": "array",
                "entity": "product_manufacturer"
            },
            "productMedia": {
                "type": "array",
                "entity": "product_media"
            },
            "avatarUser": {
                "type": "object",
                "entity": "user"
            },
            "mediaFolder": {
                "type": "object",
                "entity": "media_folder"
            },
            "propertyGroupOptions": {
                "type": "array",
                "entity": "property_group_option"
            },
            "mailTemplateMedia": {
                "type": "array",
                "entity": "mail_template_media"
            },
            "documentBaseConfigs": {
                "type": "array",
                "entity": "document_base_config"
            },
            "shippingMethods": {
                "type": "array",
                "entity": "shipping_method"
            },
            "paymentMethods": {
                "type": "array",
                "entity": "payment_method"
            },
            "productConfiguratorSettings": {
                "type": "array",
                "entity": "product_configurator_setting"
            },
            "orderLineItems": {
                "type": "array",
                "entity": "order_line_item"
            },
            "cmsBlocks": {
                "type": "array",
                "entity": "cms_block"
            },
            "cmsSections": {
                "type": "array",
                "entity": "cms_section"
            },
            "cmsPages": {
                "type": "array",
                "entity": "cms_page"
            },
            "documents": {
                "type": "array",
                "entity": "document"
            }
        }
    },

但不清楚哪些字段至关重要。我是否需要先创建产品媒体文件夹,然后在向媒体端点发出 POST 请求时使用它的 ID?我可以只指定 URL,Shopware 会将图像本身下载到文件夹中还是继续指向我使用的 URL。我需要将图像存放在 Shopware 中。

我可以从 URL 下载图像并将它们推送到 Shopware,但我不知道如何使用它的 API(有很多图像,需要批量完成)。

【问题讨论】:

  • 嘿,这个链接帮了我forum.shopware.com/discussion/comment/278603/#Comment_278603 FIRST: 创建一个新媒体 POST /api/{apiVersion}/media?_response=true SECOND: "Upload Image" /api/{apiVersion}/_action /media/{mediaId}/upload?extension={extension}&fileName={imgName}&_response=true 为我工作。
  • 谢谢你,这会起作用,你应该把它作为答案发布!除此之外,上传的媒体还需要通过发布到product_media 端点来链接,其中包括产品ID、媒体ID 和可选的图像位置。然后可选地调用product端点,图像ID为coverId,将图像标记为封面。我个人最终通过管理面板上传图片 - 可以使用上传按钮一次上传多张图片。同样重要的是要知道 API 令牌仅持续 10 分钟。因此,对于大型上传,需要在批处理后刷新。
  • 您必须将媒体添加到产品中,并且您必须设置编码器图像,这是正确的。您可以在下一次请求之前解析令牌并检查令牌是否仍然有效,如果不是,您只需再次运行身份验证并获取新令牌我的 C# 代码如下所示: if (JwtToken.ValidTo >= DateTime.Now .ToUniversalTime() - new TimeSpan(0, 5, 0)) { return Client.Get(request); } else { // 通过新的身份验证刷新令牌 IntegrationAuthenticator(this.key, this.secret); } return Client.Get(request);

标签: image api media shopware shopware6


【解决方案1】:

这适用于 Shopware 6.4

作为一般建议,这取决于。自 6.4 以来,API 发生了一些变化,https://shopware.stoplight.io/docs/admin-api/docs/guides/media-handling.md 也有官方文档。

但是,我认为拥有一个现实生活中的例子总是更容易一些。我在我们的生产环境中所做的基本上就是这些步骤。

  1. (可选)检查媒体对象是否存在
  2. 使用端点GET /media-files/ 创建一个media-file 对象
  3. 如果存在,则使用新的媒体 ID 参考上传图片。

假设文件名是yourfilename.jpg。您还需要media-folder-id,它将引用 Shopware 中的图像文件夹。这可以通过 Admin > Content > Media > Product Media 在 Shopware 中获得。

步骤 0

在将图片上传到 Shopware 之前,您要确保该图片不存在,以便您可以跳过它。

此步骤是可选的,因为创建图像不是强制性的。但是,您希望在生产环境中拥有某种验证机制。

请求正文

POST api/search/media

这将针对 Shopware-API 运行一个请求并返回一个响应。

{
   "filter":[
      {
         "type":"equals",
         "field":"fileName",
         "value":"yourfilename"
      },
      {
         "type":"equals",
         "field":"fileExtension",
         "value":"jpg"
      },
      {
         "type":"equals",
         "field":"mediaFolderId",
         "value":"d798f70b69f047c68810c45744b43d6f"
      }
   ],
   "includes":{
      "media":[
         "id"
      ]
   }
}

第 1 步

创建一个新的media-file

请求正文

POST api/_action/sync

此请求将在 Shopware 中创建一个新的媒体对象。

  1. media_id 的值必须是任何 UUID。我将使用这个值:94f83a75669647288d4258f670a53e69
  2. customFields 属性是可选的。我只是用它来保留哈希值的引用,我可以用它来验证更改的值。
  3. 媒体文件夹 ID 的值是您将从 Shopware-Backend 获得的值。

{
    "create-media": {
        "entity": "media",
        "action": "upsert",
        "payload": [
            {
                "id": "{{media_id}}",
                "customFields": {"hash": "{{file.hash}}"},
                "mediaFolderId": "{{mediaFolderId}}"
            }
        ]
    }
}

回应

响应会告诉您一切正常。

{
   "success":true,
   "data":{
      "create-media":{
         "result":[
            {
               "entities":{
                  "media":[
                     "94f83a75669647288d4258f670a53e69"
                  ],
                  "media_translation":[
                     {
                        "mediaId":"94f83a75669647288d4258f670a53e69",
                        "languageId":"2fbb5fe2e29a4d70aa5854ce7ce3e20b"
                     }
                  ]
               },
               "errors":[
                  
               ]
            }
         ],
         "extensions":[
            
         ]
      }
   },
   "extensions":[
      
   ]
}

第 2 步

这是我们将图片上传到 Shopware 的步骤。我们将使用内容类型为image/jpg 的变体。但是,带有 URL 属性的有效负载也可以工作。详见官方文档。

请求正文

POST api/_action/media/94f83a75669647288d4258f670a53e69/upload?extension=jpg&fileName=yourfilename

请注意,media-id 是 URL 的一部分。还有filename,但没有file-extension JPG

这个正文非常简单,在我们的例子中没有有效负载,因为我们使用 Content-Type: "image/jpeg" 上传。

如果您想使用 URL 作为资源,这将是一个有效负载:

{
  "url": "<url-to-your-image>"
}

【讨论】:

    【解决方案2】:

    一种可能的解决方案:

    首先:创建一个新媒体 POST /api/{apiVersion}/media?_response=true

    第二个:“上传图片”/api/{apiVersion}/_action/media/{mediaId}/upload?extension={extension}&amp;fileName={imgName}&amp;_response=true

    更多信息可以在这里找到:https://forum.shopware.com/discussion/comment/278603/#Comment_278603

    在 CASE 图像中,产品使用端点 POST /api/{apiVersion}/product-media 并设置coverId

    可通过 OpenAPI 架构获得所有路由的完整列表:[your-domain/localhost]/api/v3/_info/openapi3.json

    还可以在产品创建期间通过一个请求设置所有媒体和封面和封面ID。因此,设置产品Cover和产品Media

    {
    "coverId":"3d5ebde8c31243aea9ecebb1cbf7ef7b",
    "productNumber":"SW10002","active":true,"name":"Test",
    "description":"fasdf",
    "media":[{
    "productId":"94786d894e864783b546fbf7c60a3640",
    "mediaId":"084f6aa36b074130912f476da1770504",
    "position":0,
    "id":"3d5ebde8c31243aea9ecebb1cbf7ef7b"
    },
    {
    "productId":"94786d894e864783b546fbf7c60a3640",
    "mediaId":"4923a2e38a544dc5a7ff3e26a37ab2ae",
    "position":1,
    "id":"600999c4df8b40a5bead55b75efe688c"
    }],
     "id":"94786d894e864783b546fbf7c60a3640"
    }
    

    请记住通过如下检查来检查不记名令牌是否有效:

    if (JwtToken.ValidTo >= DateTime.Now.ToUniversalTime() - new TimeSpan(0, 5, 0))
    {
        return Client.Get(request);
    }
    else
    {
      // refresh the token by new authentication
      IntegrationAuthenticator(this.key, this.secret);
    }
    return Client.Get(request);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 2023-01-31
      • 2021-01-11
      • 2020-10-14
      • 1970-01-01
      • 2014-01-24
      相关资源
      最近更新 更多