后端 0 流量、0 存储、0 运维:Shopify 图片直传方案
TL;DR
如果你的 App 让用户上传图片、而图片最终归属是 Shopify(产品图、Banner、富文本素材),就别让文件经过你的后端或对象存储。用 Admin GraphQL 的 stagedUploadsCreate:
- 后端申请一个带签名的临时上传 URL(指向 Shopify 自己的 GCS staged bucket)
- 浏览器拿着这个 URL 直接 PUT 文件到 Shopify
- 浏览器把
resourceUrl回传后端 - 后端调
fileCreate登记为正式MediaImage
后端流量 0、存储 0、运维 0,复用 Shopify 全球 CDN。
适用读者:任何在做 Shopify App 的工程师,需要 write_files scope。
一、为什么不上"自己的 CDN"
fileCreate 不收文件本身,只收一个公网 URL(字段 originalSource)。直觉做法是先把图传到自己的 Cloudflare R2、拿到 URL 再喂给 fileCreate。这条路有三个躲不掉的代价:
- 文件仍穿过后端——R2 写入要后端收下并缓冲,吃内存 / 带宽 / IO。
- 持续的存储费——按月烧钱,而且这份副本是注定的影子。
- 影子副本——前台、商品页、邮件模板用的永远是 Shopify 那份。R2 那份从生下来就是孤儿,Shopify 删了或处理失败你这份没人管。
关键在于:任何方案最后都要调一次 fileCreate 才能进 Shopify。 既然终点是 Shopify,R2 这一站纯属绕路。
stagedUploadsCreate 解决的就是"缺一个公网 URL"——Shopify 借你一个它家的临时 URL,浏览器直传进去,传完那一刻这个 URL 就是现成的 resourceUrl。文件从浏览器直奔 Shopify,后端只传几个 URL 和签名,一个字节都不碰。
传统做法像"代收快递":先送到你家,签收、暂存、再转寄,每程运费算你头上。Staged uploads 像"直送上门":你只打电话约个门牌号,快递直接送到收件人家。