1

我正在使用带有 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" }
4

1 回答 1

2
  1. GET /images/:id由于后台作业将使用衍生工具更新记录,因此最简单的方法是在客户端轮询记录(即)的“显示”路径。在这种情况下,路由可以通过respond_to.

    或者,您可以在处理完成后通过 WebSockets 或类似message_bus的方式从后台作业向客户端发送消息。

  2. 您可以配置:hostderivation_endpoint 插件的选项:

    Shrine.plugin :derivation_endpoint, host: "https://cloudfront.net"
    
于 2020-01-04T00:38:30.420 回答