CS-Cart导入CSV图片失败:.ashx扩展名限制问题求助
解决CS-Cart导入商品时.ashx图片链接下载失败的问题
问题场景
- 导入供应商CSV商品时,图片下载报错:
Error It is not allowed to upload files with .ashx extension here. - 示例图片链接:
https://www.electrolux.ro/remote.jpg.ashx?urlb64=aHR0cHM6Ly9zZXJ2aWNlcy5lbGVjdHJvbHV4LW1lZGlhbGlicmFyeS5jb20vMTE4ZWQ0YzBlZTY1NDZmNGE3Njg0YzdmZWY4Yzk4NWFOclptWWtNODYxZDFmL3ZpZXcvV1NfUE4vUFNFRURSMTkwUEUwMDAwOC5wbmc&hmac=gh4omIw1ca8 - 异常情况:脚本下载失败,但后台手动上传、浏览器直接打开图片均正常
- 当前curl脚本片段:
curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); - wget执行提示:
Redirecting output to ‘wget-log'
核心原因
CS-Cart会根据URL的文件后缀判断允许上传的类型,.ashx不在允许列表内;但实际该链接返回的是合法图片内容,只是URL后缀不符合系统校验规则。
解决方案
方案1:修改curl脚本,获取真实图片类型并指定扩展名
通过curl获取响应头的Content-Type字段,映射为对应图片扩展名,手动指定保存文件名,绕过CS-Cart的后缀校验。
修改后的完整curl处理逻辑:
// 初始化curl请求 $ch = curl_init($url); // 关键配置调整 curl_setopt($ch, CURLOPT_HEADER, 0); // 不将头信息混入响应内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 将响应内容以字符串返回,而非直接输出 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 自动跟随重定向 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); // 模拟浏览器UA,避免被拦截 // 执行请求并获取响应 $imageContent = curl_exec($ch); $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); // 获取响应的Content-Type curl_close($ch); // 映射Content-Type到图片扩展名 $extMap = [ 'image/jpeg' => '.jpg', 'image/png' => '.png', 'image/gif' => '.gif', ]; $extension = $extMap[$contentType] ?? '.jpg'; // 默认使用jpg作为 fallback // 生成带正确扩展名的临时文件 $tempFile = tempnam(sys_get_temp_dir(), 'cs_img') . $extension; file_put_contents($tempFile, $imageContent); // 将$tempFile路径传入CS-Cart的商品图片上传逻辑即可
方案2:预处理URL,移除.ashx后缀(兼容性依赖供应商配置)
直接修改URL,剥离.ashx后缀后尝试下载,部分供应商服务器会接受这种请求并返回图片:
// 正则移除URL中的.ashx后缀 $processedUrl = preg_replace('/\.ashx(\?.*)?$/', '$1', $url); // 后续用$processedUrl执行原curl逻辑即可
注意:该方法不保证所有供应商服务器都支持,优先选择方案1。
wget命令的处理方式
如果用wget下载,可通过-O参数强制指定保存的文件名及扩展名,避免日志提示同时绕过后缀校验:
wget -O product_image.jpg "https://www.electrolux.ro/remote.jpg.ashx?urlb64=..."
内容的提问来源于stack exchange,提问作者weblocal
相关产品推荐
相关产品推荐

