使用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




