商品数据导入成功,图片列却报 Imported resource (image.jpg) could not be downloaded from external resource due to timeout or access permissions,或者直接提示资源不存在。先判断 CSV 写的是本地导入文件,还是 HTTP 外部图片;两条处理路径不同。

  1. 本地文件:后台导入时填写 Images File Directory,CSV 写相对文件名;
  2. 远程文件:CSV 写完整 URL,服务器需要能主动访问该地址;
  3. 已有媒体文件:不能假设 catalog/product 下的路径会自动被导入器识别。

本地导入目录的可见性

pwd
find var/import/images -maxdepth 3 -type f -printf '%P
' | head -n 30
stat var/import/images/red-shirt.jpg
namei -l var/import/images/red-shirt.jpg

后台填写 var/import/images 时,CSV 通常使用 red-shirt.jpg 或子目录相对路径,而不是服务器绝对路径。Linux 文件名区分大小写,Red-Shirt.JPGred-shirt.jpg 不是同一文件。

先用最小 CSV 验证一张图

sku,base_image,small_image,thumbnail,additional_images
ABC-001,red-shirt.jpg,red-shirt.jpg,red-shirt.jpg,"back.jpg,detail.jpg"

CSV 分隔符和 additional_images 分隔符不要混淆。文件名包含逗号时必须正确引用;图片路径前多一个空格也会变成不同文件。

远程 URL 从 Magento 服务器测试

curl -L --max-time 20 -o /tmp/import-image.jpg  'https://cdn.example.com/import/red-shirt.jpg'
file /tmp/import-image.jpg
du -h /tmp/import-image.jpg

返回 200 不代表拿到图片,CDN 可能返回 HTML 验证页。用 file 检查真实类型,并确认重定向后的域名仍可访问。不要为了下载图片关闭 SSL 验证。

完成小样本后再批量导入。抽查后台 Base、Small、Thumbnail 角色和前台缩略图,不只看数据库 media_gallery 有记录;如果原图已关联但前台 404,问题已经转到图片缓存生成,而不是导入器。

大批量导入前生成一份文件清单

先从 CSV 提取所有图片字段,去重后与导入目录清单比较,可以在进入 Magento 前发现拼写和大小写问题。不要在生产目录边导入边上传文件,否则同一批次会得到不一致结果。

find var/import/images -type f -printf '%P
' | sort > /tmp/image-files.txt
cut -d, -f2-5 products.csv | tr ',' '
' | sed 's/^ *//;s/ *$//' | sort -u > /tmp/csv-images.txt
comm -23 /tmp/csv-images.txt /tmp/image-files.txt | head -n 100