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 存储服务的实施以获得灵感。
我需要通过 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 存储服务的实施以获得灵感。