我正在尝试使用PrestaShop网络服务上传产品图片。
它总是返回相同的错误:
<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<errors>
<error>
<code><![CDATA[66]]></code>
<message><![CDATA[Unable to save this image]]></message>
</error>
</errors>
</prestashop>
我当前的代码如下:
const url = this.options.url
+ '/api/images/products/'
+ piezaSchema.querySelector('product>id').childNodes[0].nodeValue
+ '?ws_key='
+ this.options.api;
const file = require('fs').readFileSync(require('path')
.resolve(this.options.ruta
+ '/images/'
+ image.getAttribute('fichero')));
const resp = await fetch(url, {
method: 'POST',
body: 'image=' + file,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
});
我尝试了不同的编码选项,以'Content-Type': 'image/jpeg'
的形式发送,等等。
谢谢大家的时间。
答案 0 :(得分:1)
此错误是由writePostedImageOnDisk()
中的/classes/webservice/WebserviceSpecificManagementImages.php
方法触发的。
通常是由于以下原因造成的:
/tmp
文件夹和/或_PS_TMP_IMG_DIR_
上没有权限$_FILES['image']['tmp_name'] being empty
customized_data
表存在一些问题(如果此图像附加到定制产品上)这对我有用(虽然使用PHP,但不使用Node.js):
<?php
include(__DIR__.'/config/config.inc.php');
/* Connect to the PrestaShop Web-service */
define('PS_SHOP_URL', 'http://localhost/prestashop');
define('PS_WS_AUTH_KEY', 'YOURWSKEY');
/* Local path to the image to upload */
$image_path = './test.png'; // Can either be JPEG, PNG, etc.
/* Image upload */
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, PS_SHOP_URL.'/api/images/products/1');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERPWD, PS_WS_AUTH_KEY.':');
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => curl_file_create($image_path)));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);
echo '<pre>'.print_r($response).'</pre>'; // Should echo '1'
curl_close($ch);
我希望这会有所帮助!
答案 1 :(得分:1)
我已经能够通过发送图像来解决该问题,就像它是通过表单上传的一样:
async uploadImage(fichero, url) {
const form = new FormData();
const filePath = require('path').resolve(this.options.ruta + '/images/' + fichero);
const file = new File([await fetch(filePath).then(r => r.blob())], fichero, {type: 'image/jpeg'});
form.append('image', file);
const options = {
method: 'POST',
body: form
};
fetch(url, options);
}