You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用PrestaShop Web-service上传商品图片遇错误66求助

解决PrestaShop Web Service上传图片返回错误码66的问题

你遇到的错误码66(Unable to save this image)是PrestaShop Web Service处理图片上传时的常见问题,核心原因几乎都是请求体格式不符合要求。结合你的代码来看,问题出在图片数据的传递方式上。

你的代码问题分析

你当前使用application/x-www-form-urlencoded作为Content-Type,还直接把读取的二进制文件拼接到image=后面——这种方式完全错误,二进制图片数据无法通过urlencoded格式正确传递,PrestaShop根本解析不了你发送的内容,自然返回保存失败。

正确的解决方案

PrestaShop Web Service要求上传图片时用multipart/form-data格式发送请求,通过FormData封装图片数据才是正确的做法。下面是修改后的代码:

const fs = require('fs');
const path = require('path');

// 整理必要参数
const productId = piezaSchema.querySelector('product>id').childNodes[0].nodeValue;
const url = `${this.options.url}/api/images/products/${productId}?ws_key=${this.options.api}`;
const imageFilePath = path.resolve(this.options.ruta, 'images', image.getAttribute('fichero'));

// 构造FormData(自动处理multipart格式)
const formData = new FormData();
// 传入文件Buffer并指定文件名,避免解析问题
formData.append('image', fs.readFileSync(imageFilePath), {
  filename: image.getAttribute('fichero')
});

// 发送请求(无需手动设置Content-Type,fetch会自动添加带边界的头部)
const resp = await fetch(url, {
  method: 'POST',
  body: formData
});

// 查看响应结果
const responseXml = await resp.text();
console.log(responseXml);

额外排查点

如果修改后仍然报错,建议检查以下几点:

  • 文件有效性:确认图片文件存在、路径正确,且是PrestaShop支持的格式(JPG、PNG、GIF等),文件没有损坏
  • API权限:在PrestaShop后台的「Web Service」页面,确保你的API密钥拥有Products资源的修改(PUT)权限
  • 产品ID正确性:确认你拼接的productId是有效的、已存在的产品ID
  • 服务器权限:检查PrestaShop服务器上的img/p/目录是否有写入权限,图片保存需要服务器具备写入文件的权限

备选方案:Base64编码上传

如果FormData方式遇到兼容问题,也可以尝试将图片转为Base64编码后上传,代码示例:

const fileBuffer = fs.readFileSync(imageFilePath);
const base64Image = fileBuffer.toString('base64');

const resp = await fetch(url, {
  method: 'POST',
  body: `image=${encodeURIComponent(base64Image)}`,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
});

这种方式需要确保Base64字符串被正确编码,但优先推荐FormData的方式,更符合HTTP文件上传的标准。

内容的提问来源于stack exchange,提问作者Francisco Garrido

火山引擎 最新活动