我正在使用带有 Rails 的 Shrine 将我的图像直接上传到 S3,然后使用 Cloudfront 提供它们。
我的设置运行良好,但我一直试图回答 2 个问题:
1) 用户通过 Uppy 上传新图片。他们单击“创建图像页面”,这将创建一个新的“页面”对象。用户被带到一个空白页面,而图像衍生品正在使用 Sidekiq 在后台进程中创建。一旦成功创建衍生产品并提升到 /store,我们如何通过 JS 将图像“弹出”?是否有我们可以接受的回调,或者是否可以继续尝试通过 JS 找到导数,直到它存在?
2) 使用 Derivatives Endpoint 插件,所有图像 URL 都是相对的。有没有办法将其作为来自 Cloudfront/自定义域的绝对 URL?下面是一个使用 Rails 的例子:
红宝石代码:
<%= image_tag(image.image_file.derivation_url(:banner, 800, 300)) %>
生成的 HTML:
<img src="/derivations/images/banner/800/300/...">
我如何才能提供此结果 URL:
<img src="http://abc123.cloudfront.net/derivations/images/banner/800/300/...">
这是为了防止 DoS 吗?谢谢。
将主机选项添加到“derivation_endpoint”会导致以下错误以 XML 形式返回:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>...</RequestId>
<HostId>...</HostId>
</Error>
这可能是我的 Cloudfront 访问设置吗?也许是 CORS。
这是我在image_uploader.rb中的 derivation_endpoint 设置
plugin :derivation_endpoint, host: "http://abc123.cloudfront.net", prefix: "derivations", secret_key: ..., upload: true
路线.rb
mount Shrine.presign_endpoint(:cache) => "s3/params"
mount PhotoUploader.derivation_endpoint => "derivations/images"
config/initializers/Shrine.rb
Shrine.plugin :url_options, store: { host: "http://abc123.cloudfront.net" }