You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过API从Akeneo取图上传至Shopware 6时图片损坏问题求助

问题排查与修复方案

核心问题1:图片内容编码错误

你在上传时对获取到的二进制图片内容做了base64_encode处理,但Shopware 6的媒体上传接口需要直接传递原始二进制图片数据,而非Base64编码后的文本。这种编码会破坏图片的原始数据结构,导致最终显示异常。

核心问题2:请求体格式错误

你将编码后的内容放在数组中作为请求体,这会让客户端自动把请求体转为application/x-www-form-urlencoded格式,进一步打乱图片的二进制结构,引发损坏。

额外潜在问题:获取图片的代码语法错误

你提供的file_get_contents代码末尾缺少闭合括号,会导致PHP执行报错,无法正确获取图片内容:

// 原错误代码
$content = file_get_contents($link, false, $context
// 修正后
$content = file_get_contents($link, false, $context);

修复后的完整流程代码

1. 正确获取Akeneo图片

$header = [
    'http' => [
        'method' => 'GET',
        'header' => "Authorization: Bearer ". $akeneo->category->client->getToken(),
    ],
];

$context = stream_context_create($header);
// 修正语法错误,确保拿到原始二进制图片内容
$content = file_get_contents($link, false, $context);

// 可选:验证是否成功获取内容
if ($content === false) {
    throw new Exception('无法从Akeneo获取图片');
}

2. 创建空媒体实体并提取ID

$mediaResponse = $this->client->post(
    sprintf('%s/api/media?_response=%s', $this->shop->getShopUrl(), 'basic'),
    ['mediaFolderId' => '0193e432bdd7700ab0053e3d9577ce24']
);

// 根据实际返回结构提取媒体ID(通常在response的id字段)
$mediaId = $mediaResponse['data']['id'] ?? $mediaResponse['id'];
if (!$mediaId) {
    throw new Exception('无法从Shopware获取媒体ID');
}

3. 正确上传图片到Shopware

直接传递原始二进制内容,不做编码,同时确保请求头与请求体格式匹配:

$this->client->post(
    sprintf('%s/api/_action/media/%s/upload?extension=jpg&fileName=test', $this->shop->getShopUrl(), $mediaId),
    $content, // 直接传原始二进制数据,而非数组
    ['Content-Type' => 'image/jpeg']
);

补充验证建议

  • 本地验证获取的图片:将$content写入本地文件,确认图片能正常打开,排除Akeneo获取环节的问题。
  • 确认媒体文件夹有效性:检查0193e432bdd7700ab0053e3d9577ce24对应的Shopware文件夹存在且有写入权限。

内容的提问来源于stack exchange,提问作者Martin Locke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:55:05