Rails Active Storage 上传到 public S3 远程 url

Rails Active Storage upload to a public S3 remote url

我需要通过 API 将视频上传到第三方。 使用 API 我请求了这个“上传位置”,有效期为 15 分钟。现在我需要将我的 Active Storage 视频直接上传到这个远程上传位置。此远程位置不由我管理。

我已阅读官方文档,但不清楚在哪里可以更改默认上传位置 url。 文档:https://edgeguides.rubyonrails.org/active_storage_overview.html#direct-uploads

上传位置:

 {"uploadLocation"=>"https://storage-3rd-party.s3.eu-west-1.amazonaws.com/staging/folderr/12345/xxxx?X-Amz-
Security-Token=xxx...."}

如果我的理解正确,您将需要实施自定义 ActiveStorage::Service for this 3rd party API. Behind the scenes, rails invokes url_for_direct_upload 以获得您想要自定义的 URL。

如果您像这样实施了一项新服务,您应该能够接近工作:

class ThirdPartyStorageService < ActiveStorage::Service

  def url_for_direct_upload(key, expires_in:, content_type:, content_length:, checksum:)
      ThirdPartyAPI.get_upload_location(...)
  end
  
  # Implement other abstract methods...
end

然后您需要在 config/storage.yml 中添加您的服务:

third_party:
  service: ThirdPartyStorageService
  # username: ...
  # password: ...
  # other config...

然后您可以将其设置为在特定模型或全局中使用。

# app/models/my_model.rb
class MyModel
  has_one_attached :file, service: :third_party
end

# or config/application.rb
config.active_storage.service = :third_party

这是一项艰巨的工作,但我认为这应该能让您成功!请务必阅读 docs on ActiveStorage::Service,如果您不确定如何实施某种方法,您可以查看 Azure、AWS 和 Google 存储服务的实施以获得灵感。