TL;DR

如果你的 App 让用户上传图片、而图片最终归属是 Shopify(产品图、Banner、富文本素材),就别让文件经过你的后端或对象存储。用 Admin GraphQL 的 stagedUploadsCreate

  1. 后端申请一个带签名的临时上传 URL(指向 Shopify 自己的 GCS staged bucket)
  2. 浏览器拿着这个 URL 直接 PUT 文件到 Shopify
  3. 浏览器把 resourceUrl 回传后端
  4. 后端调 fileCreate 登记为正式 MediaImage

后端流量 0、存储 0、运维 0,复用 Shopify 全球 CDN。

适用读者:任何在做 Shopify App 的工程师,需要 write_files scope。


一、为什么不上"自己的 CDN"

fileCreate 不收文件本身,只收一个公网 URL(字段 originalSource)。直觉做法是先把图传到自己的 Cloudflare R2、拿到 URL 再喂给 fileCreate。这条路有三个躲不掉的代价:

  1. 文件仍穿过后端——R2 写入要后端收下并缓冲,吃内存 / 带宽 / IO。
  2. 持续的存储费——按月烧钱,而且这份副本是注定的影子。
  3. 影子副本——前台、商品页、邮件模板用的永远是 Shopify 那份。R2 那份从生下来就是孤儿,Shopify 删了或处理失败你这份没人管。

关键在于:任何方案最后都要调一次 fileCreate 才能进 Shopify。 既然终点是 Shopify,R2 这一站纯属绕路。

stagedUploadsCreate 解决的就是"缺一个公网 URL"——Shopify 借你一个它家的临时 URL,浏览器直传进去,传完那一刻这个 URL 就是现成的 resourceUrl。文件从浏览器直奔 Shopify,后端只传几个 URL 和签名,一个字节都不碰。

传统做法像"代收快递":先送到你家,签收、暂存、再转寄,每程运费算你头上。Staged uploads 像"直送上门":你只打电话约个门牌号,快递直接送到收件人家。

- 阅读剩余部分 -